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

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

## DirectX

| DXIL Opcode | DXIL OpName | Shader Model | Shader Stages |
| ----------- | ----------- | ------------ | ------------- |
| 153 | RayTMin | 6.3 | ('library', 'intersection', 'anyhit', 'closesthit', 'miss') |

## SPIR-V

<div id="header">

# [RayTminKHR](https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/RayTminKHR.html)

## Short Description

<div class="sectionbody">

RayTminKHR - Minimum T value of a ray

</div>

</div>

<div id="content" class="loadable">

<div class="sect1">

## <a href="#_description" class="anchor"></a> Description

<div class="sectionbody">

<div class="dlist">

` RayTminKHR `  
A variable decorated with the ` RayTminKHR ` decoration will contain the
parametric <span class="eq"> t <sub>min</sub> </span> value of the ray
being processed. The value is independent of the space in which the ray
origin and direction exist. The value is the parameter passed into the
<a
href="https://registry.khronos.org/vulkan/specs/1.3-extensions/html/vkspec.html#glossary-pipeline-trace-ray"
rel="noopener" target="_blank">pipeline trace ray</a> instruction.

<div class="paragraph">

The <span class="eq"> t <sub>min</sub> </span> value remains constant
for the duration of the ray query.

</div>

</div>

<div class="sidebarblock">

<div class="content">

<div class="title">

Valid Usage

</div>

<div class="ulist">

- <a href="#VUID-RayTminKHR-RayTminKHR-04351"
 id="VUID-RayTminKHR-RayTminKHR-04351"></a> <span class="vuid">
 VUID-RayTminKHR-RayTminKHR-04351 </span>  
  The ` RayTminKHR ` decoration **must** be used only within the
  ` IntersectionKHR ` , ` AnyHitKHR ` , ` ClosestHitKHR ` , or
  ` MissKHR ` ` Execution ` ` Model `

- <a href="#VUID-RayTminKHR-RayTminKHR-04352"
 id="VUID-RayTminKHR-RayTminKHR-04352"></a> <span class="vuid">
 VUID-RayTminKHR-RayTminKHR-04352 </span>  
  The variable decorated with ` RayTminKHR ` **must** be declared using
  the ` Input ` ` Storage ` ` Class `

- <a href="#VUID-RayTminKHR-RayTminKHR-04353"
 id="VUID-RayTminKHR-RayTminKHR-04353"></a> <span class="vuid">
 VUID-RayTminKHR-RayTminKHR-04353 </span>  
  The variable decorated with ` RayTminKHR ` **must** be declared as a
  scalar 32-bit floating-point value

</div>

</div>

</div>

</div>

</div>

</div>


## Test Case(s)

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

export float fn() {
    return RayTMin();
}
```
 ### SPIRV Example(s):

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

[shader("intersection")]
void fn() {
float   ret = RayTMin();
}
```
## HLSL:

A float representing the current parametric starting point for the ray. 

## Syntax

```
float RayTMin();

```

## Remarks

**RayTMin** defines the starting point of the ray according to the following formula: Origin + (Direction * RayTMin).  *Origin* and *Direction* may be in either world or object space, which results in either a world or an object space starting point.

**RayTMin** is specified in the call to [**TraceRay**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/traceray-function.md), and is constant for the duration of that call.




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)
* [**Miss Shader**](https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src//direct3dhlsl/miss-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/eJzEWV9z4jgS_zTKi8ouIwMZHnggEHZSN7m5SrJT-5aS7QbrIkteSSbhPv1VS8Y2hCQzt3M7FA-o1Wp1__qPWoJbK7YKYE4mV2SyuuCNK7WZb7j5j1byItPFfh5RMrmiZLKiN1UtoQLlKJkmd3z_cCsUmSY0l1xtadYI6YQibEmSRb_oi1BP7_HTZ-FKZCillY9COSOUFbmNSzJNjiQtioJaqDjNS8ifLN1ocyLYaSQscfrzl_svV2GHdaNyJ7RacimRSyjkuoeKe06htnFe1-d2y3UBW1Bv7nRdCTfY6PqlNv0Gy99a8kfSHVhnW4keGsLWSCNsvdQF_AYK9yBs3SJmCVu3qsQI2ps4vSMYrW-lei1vhlIjMEYbe1b40gB3QF0JKFUo91i8PA6A6RzYonDTOXQlDOTuj9gV78tc_XHz5Wt9y-taqC2K1JvzWzlNcWI0SXvQcfGHOxzAC-HAVTEgPra2h7mAYBAt5a565RnC1q1dhK0_xsrWu-8D6_5fN3ffzhhyo6ifulHWmcaH9T1IyJ02GGY0P2cobiX1Mxihtt7citeUCteGxlnFfIq8sRNJFyRdWD_qVCbTJD5nPQqJvtGM50-gCo8ozbmFD1D1exO2xhiM-qowCH3ZxiZ-WUpYSg-eCLTLJcVooF9rTDQ6GP-TV2F8X_ICDL3VBcgh4d7xLViktIKi_kM_GL8mRANBo0nq51sj_O9pHGiEfSLsUorMcLMn7JIwpF0K5cBY8B7oqVztS-H6cS61BeuOaJWw1o9mBw06qIJXWlK6LMSOioKkK8JYCYgBYYyk190a9CrqXAn1j893ZLIi7FPpXG0xFtiasLWBrbDO7OOn0milbawN1ptdI584OtTW4N03itMIXhwoK7QvOpWfLl0lW-eGPeJAmR2rXWrj6ApsbkTtARlakEtubTCixQsPsKElvXga0VuhRNVU9IHuuGwA6wynhu87mYStC7HrYThHGSKXa-VAOcLYUBWpecEzCUeInlV4dAK6xz1dcloa2AQ2wtLHYmD-8VZc5aU-uM5ry0l6_Rfwes1YSIGZOmCZJnQAKw4pSRYLuuNGoN20gFwb7qAIR31bm04XtVxCY0cgJUUwuVDITpJFzQ2vwBmRIyK25mqoFPwZNKLOzzYZSa8roQIEYUjbQc0VjjqPozbB5xlgeayNzsFaKGL6UELLJ_AMKKAGVWD30y6zNc99GXsuRV4OJGkjtkL5Slv4koRGwYuw7kQoLmktA0NrjvvioaBbq9H5JFn07v9JKdcm2-4JOdpES7dSW8vNPqpFDVIoiJzhOURoE2MkWRiQQQuldQ3K1wjquNmCC_THTHL1FFxxEEK9EA9MH5CiP1PitwINcdkaXpfDYEP0fqL_DVRcKIuxZh1XjiQLbPXQLUXTBmMfI_TPBsw-_uHyMEwzUUDGTSZ1_vR-nvW15B0mJ9xxXfnGpSjo75Zv4fuVak5TOjpTdb79frOK-pQd_kzG6WQUQqQrhd_DflSjznh114iiU4t-JPHEwViDqM-292sNYQvCFlWDCOAvmgFtMA21kntfsLoa5LtNejM4jg_y_Hk7TehC7T8Ld0pdhqP5ZEabTuStsLabmib0-gXyJmjXUtoO5dDv_A8OYj_mIPbTHcTedNBbB8UZx53zVgG55AYK2li8MKDUwxFzo-rGdSDeO234FrrxEi35S6CmPwZq-tNBTf_voHJLuRdqcy65oSmLMuHoRmruhNpGtRbKhXL6Q4Xx51C6NukBrxVLboGwT7brGj0cgQOZrl94VUugo9C2hK-_5CbtiVq85IfW_BGvJP4KTKMHKkX2OH38RCNQiGo0mmbCRW5fg6XR1zaC4KXG9tRjQzfK9_PYel95ACk14BqjDhuEaZJe-avBaqjTsdr-KnRQ_mBfujiY-Mo89l3m2VqY3RtGXtONOm-qX0Wjja13UTj6I1A7kq4aJXZgLJejeEKjTb6VPS5kcmXLcKn4RBg7vtAwtGaC5u-0KE5hC1iSZGYAz_bV94HXAuIfOA5ALVq_GKgNWFAYvb5Q5I0x2NUNWkzruPHzIboPPYHh-5ge30f2yvGXrhHuFAhbndP1RNFO0h1U3DzZAw2_3XKflAVshILQM57oN2hReJ5rU3jTfBNJN1pK_YyEjTZVIzlJF_RraFAJu8JL56rrUXGfbtdZTJEQeHHGP5SwRceOtIrvsVwIRUG4Egx91kYWVBuqs39D7kKTjOddaJIN2EaGJ5V2Ae-XcHW06sTM-G1shKXYyYqN8P1zcCuX0j9wTK4C1wM2onfYzHoZZ66wW-HKJotzXRG2vhW50VZv3Er7JvpZqJQRts6kzjCVArUA--R0HVmTtynm0UkLn3ds7btfw_fRpn2EjKsCg4EtPZyi7z3p-c6TO29J3Be8thEWlh5k0pwr9AIyQkE3Rlcnvjd8j5rgz5CJ1OdzlxwIYgfUQu3pZ-Hax5C_FS6u9lEpXBSUbLE6Ua9tp36Viu1Dy4dqDvvEX6HnsMq-qyh2n79CwUpY-0qxk29bZQEol1b3FxjZNk-F63uByVWoTOmKjhiWsUPE4zFA72ADBlQOf5N1h2E0YlGffZF_zjQHXXq7Q2vj-ouqN_GimKfFLJ3xC5iPLtloNE2ms9FFOb-cTPJiBuNpMs6SbDyGyZjNZhs-G-Xj6fjT5YWYs4SNk8vRlCWjUTqK02kxYWM2nl3yLB1tZmSc4OVXxlLuqlib7YWwtoH5bDaajS4kz0Ba_68QYxU4njVbf1QvCWPtUy5JF93TdzsT_lF4xdY-NnYT2pF0ceCdrC7MHJWIsmZryTjB26jt1fJ33Hn_19Prp23v38OfPBeNkfN3vNu-N_sNa6PxtMFkQdvRrcH83Zz9NwAA__9qKTDp">