<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99198>99198</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Implement the `WorldToObject3x4` 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 `WorldToObject3x4` clang builtin,
- [ ] Link `WorldToObject3x4` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `WorldToObject3x4` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `WorldToObject3x4` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/WorldToObject3x4.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/WorldToObject3x4-errors.hlsl`
- [ ] Create the `int_dx_WorldToObject3x4` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_WorldToObject3x4` to `152` in `DXIL.td`
- [ ] Create the `WorldToObject3x4.ll` and `WorldToObject3x4_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_WorldToObject3x4` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `WorldToObject3x4` lowering and map it to `int_spv_WorldToObject3x4` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/WorldToObject3x4.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 WorldToObject3x4_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export float3x4 fn() {
return WorldToObject3x4();
}
```
### SPIRV Example(s):
### Example 2
```hlsl
//dxc WorldToObject3x4_spirv_test.hlsl -T lib_6_8 -E fn -enable-16bit-types -spirv -fspv-target-env=universal1.5 -fcgl -O0
[shader("intersection")]
void fn() {
float3x4 ret = WorldToObject3x4();
}
```
## 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
```
float3x4 WorldToObject3x4();
```
## Remarks
The matrix is a transposition of **WorldToObject4x3** 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/eJzEWF9z4jgS_zTKi8ouI4MJDzwQCDupnbm5SrJz-5aS7QbrIksuSSZwn_6qZWObhJDN_p1K1WCp1X9-v1arJW6t2CqAOZnckMnqiteu0Ga-4eZ_WsmrVOeHeUDJ5IaSyYrelZWEEpSjJIn-o43MH_X39L-QuXg_JklEM8nVlqa1kE4owpYkWvSrvwr1_JsW0hfhCpQspJVPQjkjlBWZDQuSRCcqF3lOLZScZgVkz5ZutHnPgtM4s0S5L18fvt40pta1ypzQasmlRCmhUOoBSu4lhdqGWVWdM5vpHLagPjZ5Wwo3sHi7r0xvaflTO_yRGQfW2VajB4uwNY4Rtl7qHH4ChTYIW7cYWsLWr30KEc93IbxgAfFo1Xt3786qD8AYbexZK0sD3AF1BaB6odxTvn86h1nHdgvQXcf-ShjI3K-hyy8rX_169_V79Y1XlVBbVKk3H9h0mqLEaMJ6YlDLZVPnWA-bLOIqPzf71ALUCDV4N9ak3JVvCCVs3cZM2PpjQG21-ySiD_--u_9xJsg7Rf3UnbLO1H5_PICEzGmDaUqzE9vnbEr9AkaorUei5BWlwrWpddlVv_vesU3iBYkX1n91QZAkCs8Bg0qCHzTl2TOo3INNM27hA8C9bcLWmMNBX3nObSbZJjn-sZiwmB7ZasamS4pJRL9XuIfp4PtfvGy-Hwqeg6HfdA5yOPDg-BYsjrSKgv4f_eD77UAwUDSaMD9_Eo0fScLY_0_YNWFTKVLDzYGwKWE4NhXKgbHgCelHuToUwvXfmdQWrDuOzY6WO4gaWtqheJmLHRU5iVeEsQIwdsIYiW-7NUjria8_f7knkxVh14VzlcWUYGvC1ga2wjpzCJ8Lo5W2oTZYv3a1fObIq63AszgK4wD2DpQV2hex0k8XrpSvOf75y33YjM9OQyi0cXQFNjOi8nAMo8kkt7YJqEULz9BhVK-N0IA-Gq7sRpuS4wJacmfEnm6MLukLSuPW0Q1VtuIZdBYJW-di1wN2bmSIcaaVA-UIY0NHpeY5TyWcYH82nNErejxD8ZLTwsCmESMsfsoH4Jya4ior9JFk7y0n8e0fQPOtYC4FbuqBSBLRN6DjICXRYkF33AiMnuaQacMd5E3_0Za380tbWWTrRUhJogVCy4Xyy7LaGOySPHmB00FLnjvHM26dl0JkBRWWRIscHJhSKMhpevDahLKOqwzwIBtqH27J8IMEGAIpcki5SaXOni8j2WfLBSEn3Gnm_OBS5PQXy7eX8vSVlvo1acGZvPrxy90qeE3H24FoPI7HuCJadIn_2aXD7EQ96I2tuBr6vKtF3sjST6lv1fmqxBUux0Skj78x3whbELYoa8QLf9EUaG0hp1rJg0_dJgsbO0lE7wZ5ctTn63US0YU6fBFuONq0s3TZVPJ-slN3u4esbjzBJUl0PL-Op-EfpG7y-6mb_LXUTS5R914ZeZfSczzmkEluIEeltcUG6liF7lRVuw7xB6cN30L3vcTQ_jQGkt_PQPLXMpD8rQxQbik_nsZe1UbXhmZa1qWyTTk2AEGmy0orLMk736j6qZgFqXCoZiM1d0Jtg0oLlOGyBvupI_zPGelO7EdshpfcAmHXtmtvPI6NBArd7jne9umoOUGbP3-1i9qeK99n9M0VBztqfwOkwSOVIn1Knq5pAAqJCUZJKlzgDhVYGnxvkxX2FTZUHqV4P6Yb5VtQ7B1vPAuUGnC1UW-MNXIkvvHN7Wro6Gksvqs_RnQMOl4c434TM_tczLYSZvdO5Ld0o87H71fRYGOrXeC42YILQO1IvKqV2IGxXI7CCQ022Vb2YJHJjS2aPvmaMHbalTMMa4I47LTIXwPZAUyimQFHSbz6JKItSv4l4IjeoutWten7G6xcffsa-Ka1b2Kb75B-H3xRAxsw_v0BS14z9qrhSbVzugwk7EBSnmUgoT0Tm7tibSA8bdUPyvF91wV2gXRQXIz_VfDDv0b9PZTcPLdbGStQC4XAsuGxqLQV3kG9aavNicXxPm4rT7MyPKoSlm7alymacYWFKeNSQt6giqBstJT6BYE2_OAMz_BnkxvUZ1hHEeonk5vG0kId6Bfh2ptmM3buQrUVrqjTMNN4Tf4mMqOt3riV9reoF6FiRtg6lTrFTdGM5mCfna4Ca7J2s_j7cJz7HcTWXB2CQrigcTIs87b0DN1r245_ysX2_vqhm8OW6p_wc7jv3zh6NlcfACiXVvcNuMTDE3-4_oiY3DRvGPGKjhi97xML9zy9xy0KKoO_KcrjZzBiQZ_kgX-bMUdf-ribE8-1YeFvDPEqn8f5LJ7xK5iPpmw0SqJpEl0V8zhlbMTz6YZdX_PrUcrH4-kkmcV8Mok3cTK9EnMWsXE0HSUsGrF4FmbJjMF4Ok0iNs6n05yMIyi5kKGUuzLUZnslrK1hPpuNZtdXkqcgrX9YZ6wEx9N662v0kjDWvkuReNE98bUzzTvrG7H24aSb0I7Ei6PsZHVl5uhEkNZbS8YR3qZs75a_o8371_sLL3ee6OOr-FVt5PwCze0rmrdcGY1qMDkRBOS3wWE3Z_8PAAD___sqb8k">