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

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

## DirectX

| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 173 | DispatchMesh | 6.5 | ('amplification',) |

## SPIR-V

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

## Description:
 
Reserved.

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

<table style="width:100%;">
<colgroup>
<col style="width: 16%" />
<col style="width: 16%" />
<col style="width: 16%" />
<col style="width: 16%" />
<col style="width: 16%" />
<col style="width: 16%" />
</colgroup>
<thead>
<tr>
<th>Word Count</th>
<th>Opcode</th>
<th>Results</th>
<th>Operands</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p>4 + variable</p></td>
<td class="tableblock halign-left valign-top"><p>5294</p></td>
<td
class="tableblock halign-left valign-top"><p><em>&lt;id&gt;</em><br />
<em>Group Count X</em></p></td>
<td
class="tableblock halign-left valign-top"><p><em>&lt;id&gt;</em><br />
<em>Group Count Y</em></p></td>
<td
class="tableblock halign-left valign-top"><p><em>&lt;id&gt;</em><br />
<em>Group Count Z</em></p></td>
<td class="tableblock halign-left valign-top"><p>Optional<br />
<em>&lt;id&gt;</em><br />
<em>Payload</em></p></td>
</tr>
</tbody>
</table>



## Test Case(s)

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

[numthreads(1, 1, 1)]
[shader("amplification")]
export void fn(uint gtid : SV_GroupIndex) {

struct RayPayload
{
        float4 color;
        float distance;
};
uint p1;
uint p2;
uint p3;
RayPayload p4;

DispatchMesh(p1, p2, p3, p4);
}
```
 ### SPIRV Example(s):

 ### Example 2
```hlsl
//dxc DispatchMesh_spirv_test.hlsl -T lib_6_8 -E fn -enable-16bit-types -spirv -fspv-target-env=universal1.5 -fcgl -O0

struct RayPayload
{
        float4 color;
        float distance;
};

groupshared RayPayload p4;

[numthreads(1, 1, 1)]
[shader("amplification")]
void fn(uint gtid : SV_GroupIndex) {

uint p1;
uint p2;
uint p3;

DispatchMesh(p1, p2, p3, p4);
}
```
## HLSL:

## Syntax


```syntax
void DispatchMesh(uint threadGroupCountX, uint threadGroupCountY, uint threadGroupCountZ, udt meshPayload);
```


## Type Description

| Name  | [**Template Type**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-data-types.md)| [**Component Type**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-data-types.md) | Size |
|-------|--------------------------------------------------------------------|----------------------------------------------------------------------|------|
| *ret* | **void** | **void** | 0 |
| *threadGroupCountX* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-scalar.md) | [**uint**](../WinProg/windows-data-types) | 1 |
| *threadGroupCountY* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-scalar.md) | [**uint**](../WinProg/windows-data-types) | 1 |
| *threadGroupCountZ* | [**scalar**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-scalar.md) | [**uint**](../WinProg/windows-data-types) | 1 |
| *meshPayload* | [**RayPayload**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3d12/ray-payload.md) [**Struct**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-struct.md) | **RayPayload** | 1 |

## Minimum Shader Model

This function is supported in the following shader models.
|Shader Model | Supported|
|-------------|----------|
|[Shader Model 6.5](https://microsoft.github.io/DirectX-Specs/d3d/HLSL_ShaderModel6_5) and higher shader models | yes |

## Shader Stages

* [**Amplification Shader**](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#amplification-shader-and-mesh-shader)


## See also


- [**Intrinsic Functions (DirectX HLSL)**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/../direct3dhlsl/dx-graphics-hlsl-intrinsic-functions.md)
- **See [DispatchMesh - intrinsic](https://microsoft.github.io/DirectX-Specs/d3d/MeshShader.html#dispatchmesh-intrinsic)**
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWVuT26gS_jXMCyWVjCxfHvzgyzhnqpKTVDwnm-TFhQWSOINABdgz3l9_CpAsyWNPLjtbJ1u7Uy6PaZruj68b0SCsNcsFpTOQLECyusF7U0g1y7D6XQp-s5PkOAsgSBYQJCt4V1acllQYCEbRiukKm7R4R3UBRhFMORY53O0ZN0wAtATRvB35lomHbw6Cj8wUVqvgmm-ZMIoJzVIdWtWeuTkhUNMSw7Sg6YOGmVSXrBtppUur86-3m7cL72a9F6lhUiwx51aLCau1oSV2mkzkYVpVl1ymktCcipfd3ZbMdLzdPlWq9bJ8U4u_5cJQbXRt0ZEE0NrKAFovJaFvqLA-AFrX3GmA1l08oeXwKm0vWLc81KYd1LtnpgOqlFT6ooelothQaApqTTNhtuRpe87TKbI1KXenSK-Yoqn5HBrysuHV57u376t3uKqYyK1Jmb3gz0hoewfjuA2EtfCym_MIhz5bsCDnPduaEK_gufVeOD-UzwLn6HTzBGj9bQJ1dfgBBjcf7j5-ujCxOwFd153QRu1d_m8op6mRyqYiTPv8nvnj8pEqJnI3-xJXEDJTp891iG5VXfEJ4jmI59q1TuDBKAovkWGNBJ_gDqcPVBBHMEyxpt8g2fkGaG3zNGifJucLhddJbD8oBiiGTXS8bLyENlng-8quTdhp_xuXvr0pMKEKvpOE8q5gY3BOtZXUhoL2D36j_VwQdAwNxrFH0pmJE4zCxP0HaALQGJcVZxlLseUeoLF9LKNpY-c0YU_wSWT5f1_Z55g1e4_1g779fA-SFUCTwphK2-ihNUBrRXOmjTqGD4WSQupQqrxmPrDU64o6wveCZYySQROVsDAlByi-4AVNrfVeOKhOFavcFFwXBNH8I9VUHSgJa9VkscQV3jHOzPHPQNqx7hBCh89-LHobbyZyh9_KIKxhgmTRIP0zUP3HywGaNjzES4N3nEJtjpyCeAUQemTEFCCeD6IIoATEC4AQiG-9dip5ruS-6gouDYaDkR2MELTI_zbKAK2fMWQKiknbUp0OEN_-JhWBS7kXxg93wk6_f4xc7vtI9Z4bfW0gVViQK73fKbUt1Wv1J2MLvotTI7ZU09pz5lJsx2X6AAvMWS4CTjMDD_63kVWdYfHSsjaEAC3gAStmh3m3VQuOvIqTBE2HL5oG0fynjYN4SUv7H424AfGCEYBGuf3lHfnOeLlTveRx4jc2d3xCwM999V8b7Je_Etiv3wv25zPsvduBML-C5mdm8AEfubTL73uwP1-6vcVqBX593dZbQXcPvbc10xJrCtBE2x0sajZS6DWs0u2TrRcoHNjeUeQ_rsqP6v2KPKW9kmNriy53EIDBPeRstx1tJzCgwiIJBqMdM4E5VlTD4H102qnFvjSFophogCYDgJaw-ZraTdLpaFdBuSoGnVUx6KRHnyqpDDxIRmAmAJrsmTAwN4xA-0TffNq6HLkThD75umfhQfh6FH7ExyYEtqzyndOMS2yGMJXc1qldISRMGyxSWovHK__Dua0G3QbqNmLfaN3BathYnvcKZzSpHBcVct-x-x66kqPx2IlNP3yuMmiC2MS5qaUuhBl9f5h1xdThSrBvYSYuh9yNgkGmq0NgsMqpCag4gHi1F-xAlcZ8ECYwyNKct_nxyqEB0dzt3rrAihJ4OQSvmZM_nozfmT1_OFXq8LvD_VmJvTkKg5_ah0YzSjdyN6sz9w6dJ83NzD2JP1sYF3u-XO356nqIgSXVRRP10zy6M-g90o4V7Z0NTsc1dy7zp6Bk4Qvye1pW3J4l7SgvulSP58wU-12YSnugfMdSJbXMzEq6IvyRiRgBtN5xubOLxEsJ1Q9GVoFWab143OkxJm5FoXUYPpeRpyBXuCpYqgN3OiXYYL9qwtJNvYt9KctKCirMXwS8PwGz32l7Xq0PsO2vP_T3SmY6htqDNUBzRY09wtUtgFzy1-e6q8II9mxcWBbzfkbqFHOsfr1oelydSJ4Q27XbxevM_cbEByVzj4nIR91Jh8bC4GVuvvzDzVVuvv7DzYmb3u5wxkqnXPi_MTOw4xU-BpVH0nDRYNy4yuYXjJzD1Y3cRUr7ITltw--YYOW-7N2BeoX7gmmY1S9bINNQ7ytbr1MCmXA3zZnkXD4ykUNfWsHSjtahj_n5rSqIppvGwvnOcmFjOKmAZNEzNQqTS_SXDeNhHQgm25v6YFPfxJGYALS2NdTWG3U2R9vEkocFgQXLC6r6E3LUHdub4Lbu6t4TNz3zNmXm3Sqz1r6eQD8yg-bWkqrmLrFX0QYef4AFCey6C5rad3pehm0ohZhreZIHLfzTzT5s3rlpCNCkRuQrUTT99VbE6WVB0KRvU5e56fnVTKmdaO8CPmhfzLx-fEjtyYWj9dPwd0NmMZnGU3xDZ4MxGgxGg2g8uilm2TjOhslglxI8HeLpJEvQKMriZDhOIhzR7IbNUISG0XgwQtFgnCThIM0iOonoboInowmegmFES8x4yPmhDKXKb5jWezqbTlGMbjjeUa7dC2SESmrwbp-7A9ESIFS_swHx_PTKq-7xwX-m1lx9Nx3SgHje6CarGzWzIILdPtdgGHGmjW5hGWY4nbVvqa-8zbLmThl5s1d89kLa1W-XnNdKyf9S-whfOwJstDwHhxn6XwAAAP__0w5NoQ">