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

    <tr>
        <th>Summary</th>
        <td>
            Implement the `CallShader` 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 `CallShader` clang builtin,
- [ ] Link `CallShader` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `CallShader` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `CallShader` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/CallShader.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/CallShader-errors.hlsl`
- [ ] Create the `int_dx_CallShader` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_CallShader` to  `159` in `DXIL.td`
- [ ] Create the  `CallShader.ll` and `CallShader_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_CallShader` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `CallShader` lowering and map  it to `int_spv_CallShader` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/CallShader.ll`

## DirectX

| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 159 | CallShader | 6.3 | ('library', 'closesthit', 'raygeneration', 'miss', 'callable') |

## SPIR-V

# [OpExecuteCallableKHR](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#OpExecuteCallableKHR):

## Description:
 
Reserved.

[Capability](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Capability): 
**RayTracingKHR**  
 
[Reserved](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Unified).

<table>
<colgroup>
<col style="width: 25%" />
<col style="width: 25%" />
<col style="width: 25%" />
<col style="width: 25%" />
</colgroup>
<thead>
<tr>
<th>Word Count</th>
<th>Opcode</th>
<th>Results</th>
<th>Operands</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p>3</p></td>
<td class="tableblock halign-left valign-top"><p>4446</p></td>
<td
class="tableblock halign-left valign-top"><p><em>&lt;id&gt;</em><br />
<em>SBT Index</em></p></td>
<td
class="tableblock halign-left valign-top"><p><em>&lt;id&gt;</em><br />
<em>Callable Data</em></p></td>
</tr>
</tbody>
</table>



## Test Case(s)

 
 ### Example 1
```hlsl
//dxc CallShader_test.hlsl -T lib_6_8 -enable-16bit-types -O0

struct RayPayload
{
        float4 color;
        float distance;
};
export void fn(uint p1, RayPayload p2) {
    return CallShader(p1, p2);
}
```
## HLSL:

Invokes another shader from within a shader.

## Syntax
This intrinsic function definition is equivalent to the following function template:

```
template<param_t>
void CallShader(uint ShaderIndex, inout param_t Parameter);
```

## Parameters

`ShaderIndex`

An unsigned integer representing the index into the [callable shader](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/callable-shader.md) table specified in the call to [**DispatchRays**](/windows/win32/api/d3d12/nf-d3d12-id3d12graphicscommandlist4-dispatchrays).

`Parameter`

The user-defined parameters to pass to the callable shader. This parameter structure must match the parameter structure used in the callable shader pointed to in the shader table.

## Return Value

**void**

## Remarks

This function can be called from the following raytracing shader types:

* [**Callable shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/callable-shader.md)
* [**Closest hit shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/closest-hit-shader.md)
* [**Miss shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/miss-shader.md)
* [**Ray generation shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/ray-generation-shader.md)

## See also

* [Direct3D 12 raytracing HLSL reference](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/direct3d-12-raytracing-hlsl-reference.md)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWF9v4zgO_zTqi-DAkfOnechD_jS7xc3cDNre3L4VisXEusqST5Lb5j79gZId29NMuzjc7mxgIBZJkT-RlEiZOyePGmBJpmsy3V7x2hfGLg_c_sdodbU34rRMKJmuKZlu6W1ZKShBe0pm6YYrdV9wAZbMUporro90X0vlpSZsQ9JVN--T1E8fTKEv0hcoUyinHqX2VmonczcqyCwdKFsJQR2UnOYF5E-OHox9q9ubQEOJXz_df1pHI7ta514ajbIoJTVK3UPJg6TUx1FeVZcM5kbAEfR7xm5K6Xu2bl4r29nY_NKQPzLgwXnXaAwOImyHNMJ2GyPgF9Bog7Bd4zeHjDOaEXrvhw57Rzf6oFEcgN5-pzgBa411F_VvLHAP1BeAiqX2j-L1ceihczwbd9ye47uVFnL_28iL99Vuf7v99KX6zKtK6iOqNIcfWvOGIm88XXQBwPnvGxnGdRQzhGsxpD82jojs6NFoQann8k2wCNs1KyRs97HjXPX8uz13__X27tuFJd1qGli32nlbh3y_BwW5NxaTj-YDq0NryryAlfoY1l3yilLpm4T5Ebywg35gj2Qrkq1cGJ2Bk1k6uuQGVJJ8o3ueP4EWwbU05w4-cG-wTdgOMzPpzo3htlBN0uLDMsIy2kYl0uYbiglCv1S4D2lv_HdexnHURD8bAapPuPf8CA4pjaKk-9EPxm8JSU_ReLoI_G4dYTgbZeGfsGvC5kruLbcnwuaEIW2eK-PA-UL6jmb56QgaLMfgdORSOtebyJXiewWBsmhxnB0Ww3MmYfS-VDevkNceNs3Uv_16R6Zbwq4L7yuH0Wc7wnYWjtJ5exo9FdZo40bGHpvIJRg6V0EIWK3lQYIYt1EdFb5UhGUX7bAF6h-EFFxuZRXWGFiUpKs7cGCfQYwa0el6wyu-l0r60x-Btac9IKQBHz53_PRgeS71McBHEqUNSjJdt0D_CFD_iHTCFq0bso0Psc5u4ig36mhNXfUJ1PkTimwJYy9S-AKXw6YEH0YR2V9MmLDdm3X4ArjoRrbHINnNP40VdGNq7eP0QOzx43lwmXcHrlbe_WgiWK7FWy6O7GA0BIgd10W4Avsl56IfQvD2yuRPtOBKHnWi4ODpc3z3piKM4dRsg57IoqUqUtCm-L_onUwms3dVk3T1Pysn2QZK_Gcz5Um2loKw2RHfoqHIzDZ7O8iBQL5fP9BbLeB1KPrXA9oeaHTLPf99YN8m0CBlkNDb2enwiHzAorrhDgi7dnhApe05SaMECt28cuzz6Ri5szQ-ofFLm_NIvOa9qvSINTl0hjR5oEruH2eP1zQBjTiS8WwvfeJPFTiafGmKcOwU6B0_feUnZbgIJW8dmIuDMtxPaG4UdhB9IhXSea5zaMjzbXyB18pYT5-NFPSgCbuupfa0GmNl62zQisXChlMopdSCr63urYSw6zgpSHZGen7ofBna5bYE3epn8wSOcm18AZa6WK8P1pThZiM15Q1xNCyrJ-35K0lXD4V0vW7v0FxVqICD1DK8Skfh37V85gqvYN6EHu5glDIv2LOdp3goK8U9dAWyh75jbipuefnoY6oE5w1cEZwYR3EzsQ2V2tSeNhPpV_wHj9Ktt_p-Oi_yLOfOePp6W-mVprUO91GBnoAjWGqhsuBAe1whrlfiFGTH5ZPpum1cGv9eKqBH6Yt6P8oNtpCfZW6NMwe_NaFqvkidMbxRKbPH5I5UAe7JmypxNm-SPnSMmQg7ge1aq0kT1RLLK_URSAV5qLjYuyJKFA599HQdK_9Wuor7vLjjJxcpEXaEI8xLHxivJNrPxBhH-pCE10SGv6PlVSFzl5uy5Foo6fwkEY16G9Sfq_4s7SLWOv2hAFo7sElINBAxuCFYiLjizrWp9p2jRzTk7Fmexl1dW6Bl7TwtEUGYeEmkdkP39BTTymD4BdptJBpGcO9wA93FTfyNqxpaBj6Yz41nh-Ilt0-uXbt03bbJuab7CAZE3LrDDWb5yccO7owHj7VeH7rqIrz5Lit7Qf45ufkGYLwo0EL6n4Ixmk8K6d-F-Vk69zPw4eXoXWB3_ES7W9XPgGj5KekQvAHb1RgAypUzgyyNF-BsS8esn9hY1aiFA1jAOvvnLKQdJmOWdFiScKU_Y4kLuxLLTCyyBb-C5XjOxuNZOp3Prorl4rCACRMzzveHebY_zBfiwMU8G3M-mU95diWXLGWTdD6esTRdZLNRtpjOMz4WKfDJtbjOySSFkks1Uuq5xCvWlXSuhuViMb5OrxTfg3LhOyljJXi-r4_YB7INYaz5aEGy1flrT8OJH9XeiLVXt5ZhPMlWrex0e2WXCCLZ10dHJike6q6D5aVXsOw-xl78lBMC2X7wvKqtWr4TxubjSrBZWfMvyD1hu7B8jF_0wPOS_TcAAP__pbnK4g">