<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99197>99197</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Implement the `ObjectToWorld3x4` 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 `ObjectToWorld3x4` clang builtin,
- [ ] Link `ObjectToWorld3x4` clang builtin with `hlsl_intrinsics.h`
- [ ] Add sema checks for `ObjectToWorld3x4` to `CheckHLSLBuiltinFunctionCall` in `SemaChecking.cpp`
- [ ] Add codegen for `ObjectToWorld3x4` to `EmitHLSLBuiltinExpr` in `CGBuiltin.cpp`
- [ ] Add codegen tests to `clang/test/CodeGenHLSL/builtins/ObjectToWorld3x4.hlsl`
- [ ] Add sema tests to `clang/test/SemaHLSL/BuiltIns/ObjectToWorld3x4-errors.hlsl`
- [ ] Create the `int_dx_ObjectToWorld3x4` intrinsic in `IntrinsicsDirectX.td`
- [ ] Create the `DXILOpMapping` of `int_dx_ObjectToWorld3x4` to `151` in `DXIL.td`
- [ ] Create the `ObjectToWorld3x4.ll` and `ObjectToWorld3x4_errors.ll` tests in `llvm/test/CodeGen/DirectX/`
- [ ] Create the `int_spv_ObjectToWorld3x4` intrinsic in `IntrinsicsSPIRV.td`
- [ ] In SPIRVInstructionSelector.cpp create the `ObjectToWorld3x4` lowering and map it to `int_spv_ObjectToWorld3x4` in `SPIRVInstructionSelector::selectIntrinsic`.
- [ ] Create SPIR-V backend test case in `llvm/test/CodeGen/SPIRV/hlsl-intrinsics/ObjectToWorld3x4.ll`
## DirectX
| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 151 | ObjectToWorld | 6.3 | ('library', 'intersection', 'anyhit', 'closesthit') |
## SPIR-V
<div id="header">
# [ObjectToWorldKHR](https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/ObjectToWorldKHR.html)
## Short Description
<div class="sectionbody">
ObjectToWorldKHR - Transformation matrix from object to world space
</div>
</div>
<div id="content" class="loadable">
<div class="sect1">
## <a href="#_description" class="anchor"></a> Description
<div class="sectionbody">
<div class="dlist">
` ObjectToWorldKHR `
A variable decorated with the ` ObjectToWorldKHR ` decoration will
contain the current object-to-world 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-ObjectToWorldKHR-ObjectToWorldKHR-04305"
id="VUID-ObjectToWorldKHR-ObjectToWorldKHR-04305"></a>
<span class="vuid"> VUID-ObjectToWorldKHR-ObjectToWorldKHR-04305
</span>
The ` ObjectToWorldKHR ` decoration **must** be used only within the
` IntersectionKHR ` , ` AnyHitKHR ` , or ` ClosestHitKHR `
` Execution ` ` Model `
- <a href="#VUID-ObjectToWorldKHR-ObjectToWorldKHR-04306"
id="VUID-ObjectToWorldKHR-ObjectToWorldKHR-04306"></a>
<span class="vuid"> VUID-ObjectToWorldKHR-ObjectToWorldKHR-04306
</span>
The variable decorated with ` ObjectToWorldKHR ` **must** be declared
using the ` Input ` ` Storage ` ` Class `
- <a href="#VUID-ObjectToWorldKHR-ObjectToWorldKHR-04307"
id="VUID-ObjectToWorldKHR-ObjectToWorldKHR-04307"></a>
<span class="vuid"> VUID-ObjectToWorldKHR-ObjectToWorldKHR-04307
</span>
The variable decorated with ` ObjectToWorldKHR ` **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 ObjectToWorld3x4_test.hlsl -T lib_6_8 -enable-16bit-types -O0
export float3x4 fn() {
return ObjectToWorld3x4();
}
```
### SPIRV Example(s):
### Example 2
```hlsl
//dxc ObjectToWorld3x4_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 = ObjectToWorld3x4();
}
```
## HLSL:
A matrix for transforming from object-space to world-space. Object-space refers to the space of the current bottom-level acceleration structure.
## Syntax
```
float3x4 ObjectToWorld3x4();
```
## Remarks
The matrix is a transposition of **ObjectToWorld4x3** 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_zTKi8ouIwcTHnggEHZSO3NzNZmd27eUbDdYF1lySTKB-_RXLRljEkI2-3cqVYOlVv_5_Vqtlri1YqMAZmR8S8bLK966SpvZmpv_aSWvcl3uZxEl41tKxkt6XzcSalCOkiz5mv8XCvdd_0cbWaa7a5IltJBcbWjeCumEImxBkvlx9Wehnn7TQvosXIWSlbTyUShnhLKisHFFsuRE5bwsqYWa06KC4snStTZvWXAaZxYo9-nzw-fbYGrVqsIJrRZcSpQSCqUeoOZeUqhNXDTNObOFLmED6n2Td7VwA4t3u8YcLS1-6obfM-PAOttp9GARtsIxwlYLXcJPoNAGYasOQ0vY6qVPMeL5JoQXLCAenXrv7v1Z9REYo409a2VhgDugrgJUL5R7LHeP5zDr2e4Auu_ZXwoDhfs1duVl5ctf7z9_bb7wphFqgyr1-h2bTlOUGI1HR2JQy2VT51iPQxZxVZ6bfewACkIB72BNym39ilDCVl3MhK3eB9Q22w8i-vDv-28_zgR5r6ifulfWmdbvjweQUDhtME1pcWL7nE2pn8EItfFI1LyhVLgutS676nffG7ZJOifp3PqvPgiSJfE5YFBJ9IPmvHgCVXqwacEtvAO4t03YCnM4Olaec5tJdkmOfywlLKUHtsLYZEExiejXBvcwHXz_i9fh-6HiJRj6RZcghwMPjm_A4kinKDr-o-98vx6IBopG45GfP4nGj2Rx6v8n7IawiRS54WZP2IQwHJsI5cBY8IQcR7naV8IdvwupLVh3GJseLPcQBVq6oXRRii0VJUmXhLEKMHbCGEnv-jVI64mvP3_6RsZLwm4q5xqLKcFWhK0MbIR1Zh8_VUYrbWNtsH5tW_nEkVfbgGdxFKcR7BwoK7QvYrWfrlwtX3L886dvcRifnoZQaePoEmxhROPhGEZTSG5tCKhDC8_QYVQvjdCIfjdc2bU2NccFtObOiB1dG11T7aVx7zx7qmzDC-gtErYqxfYI2LmRIcaFVg6UI4wNHZWalzyXcIL92XBGL-jxDKULTisD6yBGWPpYDsA5NcVVUekDyd5bTtK7P4Dma8FSCtzUA5Esoa9Ax0FKkvmcbrkRGD0todCGOyhD_9GVt_NLO1lk61lISZI5QsuF8suK1hjskgJ5kdNRIM-d4xm3znMliooKS5J5CQ5MLRSUNN97bUJZx1UBeJANtQ-3ZPxOAgyBFCXk3ORSF0-XkTxmywUhJ9xp5vzgUpT0F8s3l_L0hZb2JWnRmbz68cv9MnpJx-uB5DpNxrgimfeJ_9Glw-xEPeiNbbga-rxtRRlk6YfUd-p8VeIKl2Mi0u-_Md8ImxM2r1vEC3_RHGhroaRayb1P3ZCFwU6W0PtBnhz0-XqdJXSu9p-EG46GdpYuQiU_Tvbq7nZQtMETXJIlh_PrcBr-Qeqy309d9tdSl12i7q0y8ial53gsoZDcQIlKW4sN1KEK3aumdT3iD04bvoH-e4Gh_WkMTH4_A5O_loHJ38oA5Zbyw2nsVa11a2ihZVsrG8qxAYgKXTdaYUne-kbVT6UsyoVDNWupuRNqEzVaoAyXLdgPHeF_zkh_Yn_HZnjBLRB2Y_v2xuMYJFDobsfxtk9H4QQNf_5ql3Q9V7kr6KsrDnbU_gZIo-9Uivwxe7yhESgkJhpluXCR2zdgafS1S1bYNdhQeZTS3TVdK9-CYu9461mg1IBrjXplLMiR9NY3t8uho6ex-K7-ENEh6HR-iPtVzOxjMdtGmO0bkd_RtTofv19Fo7VttpHjZgMuArUl6bJVYgvGcjmKxzRaFxt5BIuMb20V-uQbwthpV84wrDHisNWifAlkDzBJpgYcJenyg4h2KPmXgAN6875b1ebY32DlGrSvke9a-yY2fMad9W7SwBqMf3_AkhfGXjQ8uXZO15GELUjKiwIkdGdiuCu2BuLTVn2vHN_1XWAfSA_FxfhfBD_8C-q_Qc3NU7eVsQJ1UAgsGx6LRlvhHdTrrtqcWLzepV3lCSvjgyph6bp7maIFV1iYCi4llAFVBGWtpdTPCLThe2d4gT9DblCfYT1FqJ-Mb4OludrTT8J1N80wdu5CtRGuavO40HhN_iIKo61eu6X2t6hnoVJG2CqXOsdNEUZLsE9ON5E1RbdZ_H04Lf0OYiuu9lElXBScjOuyKz1D97q2459ysbu_vuvmsKX6J_wc7vtXjp7N1QcAyqXVxwZc4uGJP9zxiBjfhjeMdElHjH47JhbuefoNtyioAv6mKA-f0YhFxySP_NuMOfhyjDuceK4LC39jiFflLC2n6ZRfwWw0YaNRlkyy5KqaQTpNpmmaZWU6mqzTjGc3-brMWJZmkAO_uRIzlrDrZDLKWDJi10mcTK6neZrz6TXPJqNiTa4TqLmQsZTbOtZmcyWsbWE2nY6mkyvJc5DWP6wzVoPjebvxNXpBGOvepUg675_4upnwzvpKrHs46Se0I-n8IDteXpkZOhHl7caS6wRvU_bolr-jzY6v9xde7jzRh1fxq9bI2QWau1c0b7kxGrVhciIIyG_AYTtj_w8AAP__V29wYg">