<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/99144>99144</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Implement the `ProcessIsolineTessFactors` HLSL Function
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            metabug,
            backend:DirectX,
            HLSL,
            bot:HLSL
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          farzonl
      </td>
    </tr>
</table>

<pre>
    - [ ] Implement `ProcessIsolineTessFactors` clang builtin,
- [ ] Link `ProcessIsolineTessFactors` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `ProcessIsolineTessFactors` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `ProcessIsolineTessFactors` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/ProcessIsolineTessFactors.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/ProcessIsolineTessFactors-errors.hlsl`
- [ ] Create the `int_dx_ProcessIsolineTessFactors` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_ProcessIsolineTessFactors` to  `106` in `DXIL.td`
- [ ] Create the  `ProcessIsolineTessFactors.ll` and `ProcessIsolineTessFactors_errors.ll` tests in `llvm/test/CodeGen/DirectX/`

## DirectX

| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 106 | StorePatchConstant | 6.0 | ('hull',) |

## SPIR-V

There is no support for `ProcessIsolineTessFactors` when targeting SPIR-V.

## Test Case(s)

 
 ### Example 1
```hlsl
//dxc ProcessIsolineTessFactors_test.hlsl -T hs_6_8 -enable-16bit-types -O0

struct HSPerPatchData
{
        float edges[ 3 ] : SV_TessFactor;
        float inside : SV_InsideTessFactor;
};
struct PSSceneIn {
        float4 pos : SV_Position;
        float2 tex : TEXCOORD0;
        float3 norm : NORMAL;
};
struct HSPerVertexData {
        PSSceneIn v;
};

export HSPerPatchData fn( const InputPatch< PSSceneIn, 3 > points ) {
        HSPerPatchData d;
        float4 edgeFactor;
        float2 insideFactor;float p1;
float p2;
float p3;
float p4;
ProcessIsolineTessFactors(p1, p2, p3, p4);

        d.edges[0]=edgeFactor.x;
        d.edges[1]=edgeFactor.y;
        d.edges[2]=edgeFactor.z + edgeFactor.w;
        d.inside = insideFactor.x + insideFactor.y;
        return d;
}

[domain("tri")]
[outputtopology("triangle_cw")]
[patchconstantfunc("fn")]
[outputcontrolpoints(3)]
[partitioning("pow2")]
HSPerVertexData main( const uint id : SV_OutputControlPointID,const InputPatch< PSSceneIn, 3 > points ) {

        HSPerVertexData v;
        v.v = points[ id ];
        return v;
}
```
## HLSL:

Generates the rounded tessellation factors for an isoline.

## Syntax

``` syntax
void ProcessIsolineTessFactors(
  in  float RawDetailFactor,
  in  float RawDensityFactor,
  out float RoundedDetailFactor,
  out float RoundedDensityFactor
);
```

## Parameters

<dl> <dt>

*RawDetailFactor* \[in\]
</dt> <dd>

Type: **float**

The desired detail factor.

</dd> <dt>

*RawDensityFactor* \[in\]
</dt> <dd>

Type: **float**

The desired density factor.

</dd> <dt>

*RoundedDetailFactor* \[out\]
</dt> <dd>

Type: **float**

The rounded detail factor clamped to a range that can be used by the tessellator.

</dd> <dt>

*RoundedDensityFactor* \[out\]
</dt> <dd>

Type: **float**

The rounded density factor clamped to a rangethat can be used by the tessellator.

</dd> </dl>

## Return value

This function does not return a value.

## Remarks

### Minimum Shader Model

This function is supported in the following shader models.



| Shader Model                                                                | Supported |
|-----------------------------------------------------------------------------|-----------|
| [Shader Model 5](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/d3d11-graphics-reference-sm5.md) and higher shader models | yes       |



 

This function is supported in the following types of shaders:



| Vertex | Hull | Domain | Geometry | Pixel | Compute |
|--------|------|--------|----------|-------|---------|
|        | x    |        |          |       |         |



 

## See also

<dl> <dt>

[Intrinsic Functions](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
</dt> <dt>

[Shader Model 5](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/d3d11-graphics-reference-sm5.md)
</dt> </dl>
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWN1v4rgW_2vMiwUKDuHjgQdIygxSu61KNZq3yiQH8K1jR7bTwv71V7bzQVrKbPfuXC1qIT45Pr_zaR-bas32AmCOoiWKkh4tzUGq-Y6qP6Xgva3MTvM-RtESoyjB67zgkIMwGI2DByVT0HqtJWcCnkDrFU2NVBqNA5xyKvZ4WzJumEAkRsGiFXPLxMvXJOA3Zg52yoFr_syEUUxolurBAY2DjuxFlmENOcXpAdIXjXdS_RLKSMsS2wnfbze3S4-5KkVqmBQx5dxyMWG5NpBTx8nEfpAWxSX8VGawB_EF7JucmTPom2OhWsj4W0X-FZ4BbXQl0bkPkZWlIbKKZQbfQFgMRFaVVzUiq0-VG1hXf-rdK1DWQxWO03t9HacPSn0GFyugBrA5gMVhwjxnx-er7mxSo_LdukmVhClIzc-Bya6jJD_Xt_fFHS0KJvZWpNz9VXAjsWUdBuM2eFbcdcyrKTLwuUdFdpXtuXKi5_bB8ficv-Yf0gCRVeUORFZeNftHQkRCXL_xtEmMrQn4vrBZhs_Gf9DcjzcHmoHCdzIDfk7YGLoHbSmVoH77wb8YfyT0zwQNg7EHMlLBAzXpIZZCG2oXpkmMx4PA_SIyRWRyKDlHZGIXITKrhTTWbh7Wj_0fnvR0AAWYaSwk1mVRSGX-Ug2_HWzxUbUHw8S-EjnowDyBNjimGhCZakRm_iV2_47DMt0cqV1g8dC-HQf-z9WFlbNCZJUdU_x5EtgguzrC_Sd80M_j5ynug6BbDv3heMtM35wK0Lh_X0VcG1WmBn_fPIBybkyooc7HS8cw23FJDYZsD9pmbuhyF4ULvPnx3CKjsMNu682mimdbu9EH5kniHyoVHjabFASsBe5ij3AhdS3qQWpmV-QuHsEGjo7l6eZnfH__mARdhhALqXLH8cf9493i9rIKzgs_QBk4Wje0irS6vb6biYIFHF2adF2IdwKRKU5tUuK1KErjXqEwbg1FJLb-DG9wIZkwGvvsrDDfycu6Fo1cSC45n1Teb975kBRDz1aNSGcUdkYjP_o84cm0GFrlC-K-Q_c9sjld-wQFs2xQJ02AogSFSavw4Nio3HINP3CdLnCRD1x_YkSWZ94YvJ1NaxIx6XhlcHSTOqQWTYEplWg8Pkkqm6JlJnNqm5kpIsQohgixRkeJfytLU5TGyEJyuT81XFTsOTynb--4CxvatFq0dqVI_QSbNxekplIYJblPFESmYVeUMq4s7H7lpBTyjZzLeZ_ZlRlVfpZMGMyyusjuHWLsER8s4jpBJP77udyk85kGr427XwevLkCVbdHSqRIl7-Px2olHvTi2C6zrOEIPt_gGAhQ1oN0Gq2QpMsjstqiBc2p9hXc-m936TgVmPs-7i_bmJAw9VqQaEuua-ipZ9vlqbEMRLDBmAsUELQL_7Yvskb4lYCjjVZm6_vgKq9DMnLq8sjQdNm_jJamfcZ4LtSbX9Xvu28YVD1TRHAwoXZHDOOM24PbBoPCm5l58sG2BURSjaMmE-038bLuZmVpA1gh4OhVgExERK8tp7B-bHRpnoJmCDGcOpQrkoFHLCs4-16zjyt-nmoP5im6X4lerZyP4j-hXV0LHdfaklRe2PiSmWFGxt30pNTilAm8BlxoyvD25UmpK6ItWXfT6bzDr3O0X7PrbZtlnfmaZq4nHamWivIRaGabxrjo34kyCbSUNrpYw6lkH74TkVL3oc5ol3zHB8jLv9NaXMJiuO1XIbMdvrdlJzuWb7US1n53b2brGbfr6Tt_-P36cvEaRplPv_5Ofrrz2NICiZceUyKYUmR6MKbTdElznvGfmUG4HqbSnoTuWKqnlziQytYfTNyZCYs_FXG5tqD01A_1iZNHXKq26b3cyCjPXkpNVFmbDYX-vaHFgqe4r2IECkUJf59Egz-weaM9tB7Y_gOrGwvnrBLr1Xic4fhf4crh9dy93FZZu9sM25n4PdvDfS-6Pa4nra9zjN5A5GHVygwd2rA50scyL0sDHuDaPl2jdwTm5jd1Z-hzrhzMa_jg4J1_xW72FA2DKtby-a0XL5p4A19c--v-VRcc2hSyp31xh9Ouwa59NF5bJjg3_0iL4qHa9mvayeZjNwhntwXw4IcPhOBiOg95hPhulk5SGu206nqY0CsMUhrMh0BmdhBGZTntsTgIyCibDMQnswwAm2_FoBIQE0XYyghCNAsgp4wPOX_OBVPse07qE-Ww2HI16nG6Ba3fnSUgOhm7LvWuYY0TIlqYvIDIULpo7kuqNv9Wq2aRB4aImRUlPzS1Wf1vuNRoFnGmjW3TDDId5e39aXTZdvVawspt07JWKz69Es7rncSoUSv4HUoPIyhltw-jtfp2T_wYAAP__MoiN6A">