<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99101>99101</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Implement the `ddy_fine` HLSL Function
</td>
</tr>
<tr>
<th>Labels</th>
<td>
metabug,
backend:DirectX,
HLSL,
backend:SPIR-V,
bot:HLSL
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
farzonl
</td>
</tr>
</table>
<pre>
- [ ] Implement `ddy_fine` clang builtin,
- [ ] Link `ddy_fine` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `ddy_fine` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `ddy_fine` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/ddy_fine.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/ddy_fine-errors.hlsl`
- [ ] Create the `int_dx_ddy_fine` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_ddy_fine` to `86` in `DXIL.td`
- [ ] Create the `ddy_fine.ll` and `ddy_fine_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_ddy_fine` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `ddy_fine` lowering and map it to `int_spv_ddy_fine` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ddy_fine.ll`
## DirectX
| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 86 | DerivFineY | 6.0 | ('library', 'pixel', 'compute', 'amplification', 'mesh', 'node') |
## SPIR-V
# [OpDPdyFine](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpDPdyFine):
## Description:
Result is the partial derivative of *P* with respect to the window *y*
coordinate.Uses local differencing based on the value of *P* for the
current fragment and its immediate neighbor(s).
*Result Type* must be a scalar or vector of [*floating-point
type*](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Floating) using the IEEE 754 encoding. The component width must
be 32 bits.
The type of *P* must be the same as *Result Type*. *P* is the value to
take the derivative of.
This instruction is only valid in the **Fragment** [Execution
Model](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Execution_Model).
[Capability](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Capability):
**DerivativeControl**
<table>
<colgroup>
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
<col style="width: 20%" />
</colgroup>
<thead>
<tr>
<th>Word Count</th>
<th>Opcode</th>
<th>Results</th>
<th>Operands</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p>4</p></td>
<td class="tableblock halign-left valign-top"><p>211</p></td>
<td
class="tableblock halign-left valign-top"><p><em><id></em><br />
<em>Result Type</em></p></td>
<td class="tableblock halign-left valign-top"><p><a
href="#ResultId"><em>Result <id></em></a></p></td>
<td
class="tableblock halign-left valign-top"><p><em><id></em><br />
<em>P</em></p></td>
</tr>
</tbody>
</table>
## Test Case(s)
### Example 1
```hlsl
//dxc ddy_fine_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export float4 fn(float4 p1) {
return ddy_fine(p1);
}
```
## HLSL:
Computes a high precision partial derivative with respect to the screen-space x-coordinate.
## Syntax
``` syntax
float ddy_fine(
in float value
);
```
## Parameters
<dl> <dt>
*value* \[in\]
</dt> <dd>
Type: **float**
The input value.
</dd> </dl>
## Return value
Type: **float**
The high precision partial derivative of *value*.
## Remarks
The following overloaded versions are also available:
``` syntax
float2 ddy_fine(float2 value);
float3 ddy_fine(float3 value);
float4 ddy_fine(float4 value);
```
### 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/eJzUWVtz4joS_jXKi8qUkYEkDzwQCOekamYndTI7e_YpJawGayNLLkkmsL9-qyXjy0CS2d0ze6FSwWq1vr6q1TLcObnTAHMyvSPT1RWvfWHsfMvt341WVxsjjvOEkukdJdMVfSgrBSVoT8ksFeL4vJUayCylueJ6Rze1VF5qwpYkXXSrPkn98u4C-ip9gRyFcupZam-ldjJ3o4LM0gHUQgjqoOQ0LyB_cXRr7PfI3iBlifO_fnr6dBdFrGude2n0kiuFXFIj1xOUPHBKvRvlVXVJXG4E7EC_Leq-lL4n6f5Q2U7C8peG_BG8B-ddgxicQ9gaaYStl0bAL6BRBmHrxmeOsPVJlxH67U1XvYOM9jewQc2HAWwC1hrrLqIvLXAP1BeAsFL7Z3F47vumjWLjiIc2qitpIfe_j7x4H3T1-8OnL9VnXlVS7xDSbN-Q5Q3FmZtZ53dc_L6EfjBHMSm4Fn3qc2N_nIxujOhK7cuz-BC2bkwjbP2xv1y1_0GHPT0-_PbtgjEPmoapB-28rUN6P4GC3BuL2Ubzgcy-LGVewUq9CxaXvKJU-iZDLqsWNssbski2INnChVGrNJmlo0sOQJDkG93w_AW0CE6lOXfwgWODbMLWmIpJVyD6e0A1OYp_LCMso6doRNr1kmJS0C8VbjnaG_-Jl3H8VHABln42AlSf8OT5DhxSGqCk-9APxueEpAd0M4uKgJX7tdTw1zCcjdLwTdgNYddKbiy3R8KuCUPadSUPoLphbsqq9tAReFkpuZU5xyh15BJc0Y20EXHJ7Umd1m8xRi0JQ_ilWj2KI2pIpivCbgrvK4eBZ2vC1hZ20nl7HL0U1mjjRsbumqAlGDVXQYhVreVWghifAjoqfKkIy3ro7BZRB1EEl1tZBVvCFKUkXfwGrlaeShfSu-LWS66oQD9yL_cQigVbPBK2iKeLBdQiZDmueJVamFdkORKGqLkxVkjNPYz-7MBRZXIElNstWNA5bpYNdyCo0QFgz1U9kILngy8AoWpr8YzcWr4LhyXuMonFoyxBSNwGGuSu2BhL2I0j7HYUbAr_CDvZ9vVYAQKXtfN0A5RTl3PFLTWW7sPOC-Knd4QttspwL_UuqYzUnqQLHxf_jGitG1mYOrVDx6A_Hu7v7-n1dEJB50bgeUq_FkAxOY1GJ7xK4YtgDEkXG6AZoxvpXc905Ee9-149GY8iHO5T7uiZi0Yte5MPMTjeoCP4S1w9yI2BVIllvS1riGG0OiKIFFiXQgFlGJl1E9E4Qt_fHyCvQ26mi1A3fobHWyHPUQS7HTVbZHq35BXfSCX98WdI7qGHnXlKUcIWq9afS6O9NSqSG8WypecbBSS7j6PcqJ01ddUnUOePyLIijIXsQAEsJWxKGKNowP8zM2HrM6N9AVx0I9ubINn9X4wVdGlq7ePyQOzNx5Pr8lzcEO6thWC5Fm_MnlFxZAejodp4KbhohMC23rnonRD_jTL5Cy24kjudKNj6sKt2OvGmIoxF6eifSZRUdfqIPwSXjcfvImO5_lexSbaEEr_ZTHmS3UlB2GyHT1FQnMyWGztIjEDuF7AB889wAsmWnKSLwsI2Licsiwo8iJaxr9ZHFhG25h-p-9_y7OOP-fM8yQdpjYReAUuHPclXbFuX3EFzfsfJcKREDmS6P2AjBnSMs7M0_oW7VNpUZ3HIaXvZwJ43XLVo8pUquXmePd_QBDRqkYxnG-kTPBwdTb40bS4cKmM9DWf_hG41YTfNczWOfd1dOOQoteBrq1tZhN0EDvQn9qGrvoadleFmeOrGlrHLdJTTQu4KWlnIpcPz8kLzdanjcrkF0ImreA70kPT6rWHzedSeHxrSSSfqTtRgYN-QYKHUZMnIIo2z4fQPiCcL-7a1kh655SV4sK49s4Qi2T3FB98Fni0iYDjwl2R6J3X4XrWZErjDMtEuizt70TQOQbH-AYm9jtRV3Wg7alUIV5oGDp9VT5Gg9m8xlq2RPyTq45DFnutk6eg7kSW3L66D2xqlzCu2fmYPVhkuQNA9WAR3lFugXDlD-Z5LFXfR4v2Isn5IG0qjSxPDQMzO2LJLbJMztkmfLTYxl3ICjf0stSzrcnAZPFkuHd02L5KwTXR1hTsQ2i6x84uLq0tc7UaDEvL9RfPf_AS8VpH2apn8kZ8hXnd9JdO7gSnTSz3oTvqi3oxygzf7zzK3xpmtX5nQeL5KnTHC1htlNpjukSrAvXhTJc7mTaUMV_lMhPLJ1iIT43Gys7wqZO4SC_GSBokrp6NSYPHDOxdmPdhhLIK_juA67w2CE8rIPx_uWJnNtpHluoRvY_4NrIdDEP9rreL7hZUpudTh8RcwJXh7DINHvOGHp6bsnse1fbxEGw765C52vfQZPgwe4-BwRn7Hb6dCDrEKvF9cp3ftKyN6ekfr_lNZdOhSaPhiKTmF3cVsulDpBzb8j26Cc7VPJ8qVmGfiNrvlVzAfX7PxeHp7nU6vivmY55NsO70Vk5TnN9mGcT7j6WTGBLvOJvn4Ss5Zyibp9Xg2vp1O08loOtlubyZim95MJpmYXZNJCiWXaqTUvsT75pV0rob57e04HV8pvgHlwq8NjJXg-abehYZ0SRhr3gqSbNG-SG1m4kvqM7bTPfY0YTzJFife6erKzlGJZFPvHJmkSjrvOrW89Arm3U8aF96TIlSblle1VfN3otq8uwwSK2v-BrknbB2Mx3BG-_dz9o8AAAD__6GSg4c">