<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99200>99200</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Implement the `WorldToObject4x3` 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 `WorldToObject4x3` clang builtin,
- [ ] Link `WorldToObject4x3` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `WorldToObject4x3` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `WorldToObject4x3` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/WorldToObject4x3.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/WorldToObject4x3-errors.hlsl`
- [ ] Create the `int_dx_WorldToObject4x3` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_WorldToObject4x3` to `152` in `DXIL.td`
- [ ] Create the `WorldToObject4x3.ll` and `WorldToObject4x3_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_WorldToObject4x3` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `WorldToObject4x3` lowering and map it to `int_spv_WorldToObject4x3` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WorldToObject4x3.ll`
## DirectX
| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 152 | WorldToObject | 6.3 | ('library', 'intersection', 'anyhit', 'closesthit') |
## SPIR-V
<div id="header">
# [WorldToObjectKHR](https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/WorldToObjectKHR.html)
## Short Description
<div class="sectionbody">
WorldToObjectKHR - Transformation matrix from world to object space
</div>
</div>
<div id="content" class="loadable">
<div class="sect1">
## <a href="#_description" class="anchor"></a> Description
<div class="sectionbody">
<div class="dlist">
` WorldToObjectKHR `
A variable decorated with the ` WorldToObjectKHR ` decoration will
contain the current world-to-object transformation matrix, which is
determined by the instance of the current intersection.
</div>
<div class="sidebarblock">
<div class="content">
<div class="title">
Valid Usage
</div>
<div class="ulist">
- <a href="#VUID-WorldToObjectKHR-WorldToObjectKHR-04434"
id="VUID-WorldToObjectKHR-WorldToObjectKHR-04434"></a>
<span class="vuid"> VUID-WorldToObjectKHR-WorldToObjectKHR-04434
</span>
The ` WorldToObjectKHR ` decoration **must** be used only within the
` IntersectionKHR ` , ` AnyHitKHR ` , or ` ClosestHitKHR `
` Execution ` ` Model `
- <a href="#VUID-WorldToObjectKHR-WorldToObjectKHR-04435"
id="VUID-WorldToObjectKHR-WorldToObjectKHR-04435"></a>
<span class="vuid"> VUID-WorldToObjectKHR-WorldToObjectKHR-04435
</span>
The variable decorated with ` WorldToObjectKHR ` **must** be declared
using the ` Input ` ` Storage ` ` Class `
- <a href="#VUID-WorldToObjectKHR-WorldToObjectKHR-04436"
id="VUID-WorldToObjectKHR-WorldToObjectKHR-04436"></a>
<span class="vuid"> VUID-WorldToObjectKHR-WorldToObjectKHR-04436
</span>
The variable decorated with ` WorldToObjectKHR ` **must** be declared
as a matrix with four columns of three-component vectors of 32-bit
floating-point values
</div>
</div>
</div>
</div>
</div>
</div>
## Test Case(s)
### Example 1
```hlsl
//dxc WorldToObject4x3_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export float4x3 fn() {
return WorldToObject4x3();
}
```
### SPIRV Example(s):
### Example 2
```hlsl
//dxc WorldToObject4x3_spirv_test.hlsl -T lib_6_8 -E fn -enable-16bit-types -spirv -fspv-target-env=universal1.5 -fcgl -O0
[shader("intersection")]
void fn() {
float4x3 ret = WorldToObject4x3();
}
```
## HLSL:
A matrix for transforming from world-space to object-space. Object-space refers to the space of the current bottom-level acceleration structure.
## Syntax
```
float4x3 WorldToObject4x3();
```
## Remarks
The matrix is a transposition of **WorldToObject3x4** matrix.
This function can be called from the following raytracing shader types:
* [**Any Hit Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/any-hit-shader.md)
* [**Closest Hit Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/closest-hit-shader.md)
* [**Intersection Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/intersection-shader.md)
## See also
<dl> <dt>
[Direct3D 12 Raytracing HLSL Reference](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/direct3d-12-raytracing-hlsl-reference.md)
</dt> </dl>
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEWF9z4ygS_zTkhZJKRraSPPjBseOd1M7cXCXZuX1LIaltcUGgAuTY9-mvGmRLThxns3-nUjUWNP3n92uaBm6tWCuAKZnckMnigreu0ma64uZ_WsmLXJe7aUTJ5IaSyYLe1Y2EGpSjJEv-o40sH_X3_L9QuPE2JVlCC8nVmuatkE4owuYkmfWrvwr1_JsW0hfhKpSspJVPQjkjlBWFjSuSJUcqZ2VJLdScFhUUz5autHnPgtM4M0e5L18fvt4EU8tWFU5oNedSopRQKPUANfeSQq3jomlOmS10CWtQH5u8rYUbWLzdNqa3NP-pG_7IjAPrbKfRg0XYEscIW851CT-BQhuELTsMLWHL1z7FiOe7EJ6xgHh06r27dyfVR2CMNvaklbkB7oC6ClC9UO6p3D6dwuzAdgfQ3YH9hTBQuF9jV55Xvvj17uv35htvGqHWqFKvPrDpNEWJ0YT1xKCW86ZOsR6HLOKqPDX71AEUhALewZqUm_oNoYQtu5gJW34MqG02n0T04d939z9OBHmnqJ-6U9aZ1u-PB5BQOG0wTWlxZPuUTalfwAi19kjUvKFUuC61zrvqd987tkk6I-nM-q9DECRL4lPAoJLoB8158Qyq9GDTglv4AHBvm7Al5nDUV55Tm0l2SY5_LCUspXu2wtjlnGIS0e8N7mE6-P4Xr8P3Q8VLMPSbLkEOBx4cX4PFkU5R1P-jH3y_HYgGikYT5uePovEjWZz6_wm7IuxSitxwsyPskjAcuxTKgbHgCelHudpVwvXfhdQWrNuPXe8tHyAKtHRD6bwUGypKki4IYxVg7IQxkt4e1iCtR77-_OWeTBaEXVXONRZTgi0JWxpYC-vMLn6ujFbaxtpg_dq08pkjr7YBz-IoTiPYOlBWaF_Eaj9duVq-5vjnL_dxGL8-DqHSxtEF2MKIxsMxjKaQ3NoQUIcWnqHDqF4boRF9NFzZlTY1xwW05s6ILV0ZXdMXlMatowNVtuEFHCwStizFpgfs1MgQ40IrB8oRxoaOSs1Lnks4wv5kOKNX9HiG0jmnlYFVECMsfSoH4Byb4qqo9J5k7y0n6e0fQPOtYCkFbuqBSJbQN6DjICXJbEY33AiMnpZQaMMdlKH_6Mrb6aWdLLL1IqQkyQyh5UL5ZUVrDHZJnrzI6agjz53iGbfOSyWKigpLklkJDkwtFJQ033ltQlnHVQF4kA21D7dk_EECDIEUJeTc5FIXz-eR7LPljJAT7jhzfnApSvqL5etzefpKS_uatOhEXv345W4Rvabj7UAyHqdjXJHMDon_2aXD7EQ96I1tuBr6vGlFGWTpp9R36nxV4gqXYyLSx9-Yb4TNCJvVLeKFv2gOtLVQUq3kzqduyMJgJ0vo3SBP9vp8vc4SOlO7L8INR0M7S-ehkveTB3W3Wyja4AkuyZL9-bU_Df8gdZPfT93kr6Vuco6698rIu5Se4rGEQnIDJSptLTZQ-yp0p5rWHRB_cNrwNRy-5xjan8ZA9vsZyP5aBrK_lQHKLeX709irWunW0ELLtlY2lGMDEBW6brTCkrzxjaqfSlmUC4dqVlJzJ9Q6arRAGS5bsJ86wv-ckcOJ_YjN8JxbIOzKHtobj2OQQKHbLcfbPh2FEzT8-atd0vVc5bagb6442FH7GyCNHqkU-VP2dEUjUEhMNMpy4SK3a8DS6HuXrLBtsKHyKI23KV0p34Ji73jjWaDUgGuNemMsyJH0xje3i6Gjx7H4rn4f0T7odLaP-03M7HMx20aYzTuR39KVOh2_X0WjlW02keNmDS4CtSHpolViA8ZyOYonNFoVa9mDRSY3tgp98hVh7LgrZxjWBHHYaFG-BvIAMEmuDThK0sUnEe1Q8i8Be_Rmh25Vm76_wcrVt6-Rb1r7JjZ8x_T74IsaWIHx7w9Y8sLYq4Yn187pOpKwAUl5UYCE7kwMd8XWQHzcqu-U49tDF3gI5ADF2fhfBT_8C-rvoebmudvKWIE6KASWDY9Fo63wDupVV22OLKbbcVd5wsp4r0pYuupepmjBFRamgksJZUAVQVlpKfULAm34zhle4M-QG9Rn2IEi1E8mN8HSTO3oF-G6m2YYO3WhWgtXtXlcaLwmfxOF0Vav3EL7W9SLUCkjbJlLneOmCKMl2Genm8iaotss_j6cln4HsSVXu6gSLgpOxnXZlZ6he13b8U-52N1fP3Rz2FL9E34O9_0bR0_m6gMA5dLqvgGXeHjiD9cfEZOb8IaRLuiI0fs-sXDP03vcoqAK-Jui3H9GIxb1SR75txmz96WPO5x4rgsLf2OIF-U0La_Ta34B09ElG42y5DJLL6ppliUruGT5FeN5zopxCpN0NcnK67JM0qsELsSUJWycXI4ylozYmMWjyyzJ-SorrxmwJMvJOIGaCxlLualjbdYXwtoWptfXLEkuJM9BWv-wzlgNjuft2tfoOWGse5ci6ezwxNfNhHfWN2Ldw8lhQjuSzvayk8WFmaITUd6uLRkneJuyvVv-jjbtX-_PvNx5ovev4hetkdMzNHevaN5yYzSqweREEJDfgMNmyv4fAAD__z2CcK8">