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

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

export float4x3 fn() {
    return ObjectToWorld4x3();
}
```
 ### SPIRV Example(s):

 ### Example 2
```hlsl
//dxc ObjectToWorld4x3_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 = ObjectToWorld4x3();
}
```
## 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

```
float4x3 ObjectToWorld4x3();

```




## Remarks

The matrix is a transposition of **ObjectToWorld3x4** 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/eJzEWFtz4yoS_jXkhZJKRr7ED35w7PhM6szsbCU5s-cthaS2xQaBCpBj76_fapBlOXGck3OdStVY0PTl-5qmgVsrNgpgRkY3ZLS84o0rtZmtufmfVvIq08V-FlEyuqFktKR3VS2hAuUoGSffs_9C7h71f7SRxXCXknFCc8nVhmaNkE4owhYkmR9XfxXq-TctpC_ClShZSiufhHJGKCtyG5dknJyonBcFtVBxmpeQP1u61uY9C07jzALlvnx9-HoTTK0alTuh1YJLiVJCodQDVNxLCrWJ87o-ZzbXBWxAfWzythKuZ_F2V5ujpcVP7fBHZhxYZ1uNHizCVjhG2GqhC_gJFNogbNViaAlbvfYpRjzfhfCCBcSjVe_dvTurPgJjtLFnrSwMcAfUlYDqhXJPxe7pHGYd2y1Adx37S2Egd7_GrrisfPnr3dfv9Tde10JtUKVef2DTaYoSg9HgSAxquWzqHOtxyCKuinOzTy1AQSjgHaxJua3eEErYqo2ZsNXHgNp6-0lEH_59d__jTJB3ivqpO2Wdafz-eAAJudMG05TmJ7bP2ZT6BYxQG49ExWtKhWtT67Krfve9Y5ukc5LOrf_qgiDjJD4HDCqJftCM58-gCg82zbmFDwD3tglbYQ5Hx8pzbjPJNsnxj6WEpfTAVhibLCgmEf1e4x6mve9_8Sp8P5S8AEO_6QJkf-DB8Q1YHGkVRcd_9IPvtwNRT9FgNPDzJ9H4kXGc-v8JuyZsIkVmuNkTNiEMxyZCOTAWPCHHUa72pXDH71xqC9YdxqYHyx1EgZZ2KF0UYktFQdIlYawEjJ0wRtLbbg3SeuLrz1_uyWhJ2HXpXG0xJdiKsJWBjbDO7OPn0milbawN1q9tI5858mpr8CwO4jSCnQNlhfZFrPLTpavka45__nIfh_HpaQilNo4uweZG1B6OfjS55NaGgFq08AztR_XaCI3oo-HKrrWpOC6gFXdG7Oja6IpqL41758VTZWueQ2eRsFUhtkfAzo30Mc61cqAcYazvqNS84JmEE-zPhjN4RY9nKF1wWhpYBzHC0qeiB86pKa7yUh9I9t5ykt7-ATTfChZS4KbuiYwT-gZ0HKQkmc_plhuB0dMCcm24gyL0H215O7-0lUW2XoSUJJkjtFwovyxvjMEuKZAXOR0F8tw5nnHrvJQiL6mwJJkX4MBUQkFBs73XJpR1XOWAB1lfe39Lxh8kQB9IUUDGTSZ1_nwZyWO2XBBywp1mzg8uRUF_sXxzKU9faWlekxadyasfv9wto9d0vB1IhmkywhXJvEv8zy7tZyfqQW9szVXf520jiiBLP6W-VeerEle4HBORPv7GfCNsTti8ahAv_EUzoI2Fgmol9z51QxYGO-OE3vXy5KDP1-txQudq_0W4_mhoZ-kiVPLjZKfudgd5EzzBJePkcH4dTsM_SN3491M3_mupG1-i7r0y8i6l53gsIJfcQIFKG4sN1KEK3am6cR3iD04bvoHue4Gh_WkMTH4_A5O_loHJ38oA5Zbyw2nsVa11Y2iuZVMpG8qxAYhyXdVaYUne-kbVT6UsyoRDNWupuRNqE9VaoAyXDdhPHeF_zkh3Yj9iM7zgFgi7tl1743EMEih0u-N426eDcIKGP3-1S9qeq9jl9M0VBztqfwOk0SOVInsaP13TCBQSEw3GmXCR29dgafS9TVbY1dhQeZSGu5SulW9BsXe88SxQasA1Rr0xFuRIeuOb22Xf0dNYfFd_iOgQdDo_xP0mZva5mG0tzPadyG_pWp2P36-i0drW28hxswEXgdqSdNkosQVjuRzEIxqt8408gkVGN7YMffI1Yey0K2cY1ghx2GpRvAayA5gkUwOOknT5SURblPxLwAG9edetanPsb7By9drXyHetXRMbPuPWejtpYA3Gvz9gyQtjrxqeTDunq0jCFiTleQ4S2jMx3BUbA_Fpq75Xju-6LrALpIPiYvyvgu__BfX3UHHz3G5lrEAtFALLhsei1lZ4B_W6rTYnFtPdsK08YWV8UCUsXbcvUzTnCgtTzqWEIqCKoKy1lPoFgTZ87wzP8WfIDeozrKMI9ZPRTbA0V3v6Rbj2phnGzl2oNsKVTRbnGq_J30RutNVrt9T-FvUiVMoIW2VSZ7gpwmgB9tnpOrImbzeLvw-nhd9BbMXVPiqFi4KTcVW0pafvXtt2_FMutvfXD93st1T_hJ_9ff_G0bO5-gBAubT62IBLPDzxhzseEaOb8IaRLumA0ftjYuGep_e4RUHl8DdFefiMBiw6Jnnk32bMwZdj3OHEc21Y-BtDvCpmaTFNp_wKZoMJGwzGyWQ8uCpn03w6HME6W0-yohgORyxJ2HUK43TAR2kCwysxYwkbJpPBmCUDlk7jCTBeDNfT0TAr-PUkJ8MEKi5kLOW2irXZXAlrG5hNp4Pp9EryDKT1D-uMVeB41mx8jV4Qxtp3KZLOuye-dia8s74Rax9OugntSDo_yI6WV2aGTkRZs7FkmOBtyh7d8ne02fH1_sLLnSf68Cp-1Rg5u0Bz-4rmLddGozZMTgQB-Q04bGfs_wEAAP__2BBwxA">