Skip to content

Commit af91e77

Browse files
authored
Add support for rayQueryGetIntersectionTriangleVertexPositionsEXT (shader-slang#3463)
Add a member function to RayQuery<RAY_FLAG> class GetIntersectionTriangleVertexPositions to support the GLSL built-int rayQueryGetIntersectionTriangleVertexPositionsEXT. Also add new test file under tests/vkray/rayquery-closesthit.slang to test this functionality.
1 parent 5902acd commit af91e77

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

source/slang/hlsl.meta.slang

+36
Original file line numberDiff line numberDiff line change
@@ -10208,6 +10208,42 @@ ${{{{
1020810208
auto ccTF = candidateOrCommitted == 0 ? "false" : "true";
1020910209
}}}}
1021010210

10211+
__glsl_extension(GL_EXT_ray_query)
10212+
__glsl_extension(GL_EXT_ray_tracing_position_fetch)
10213+
__glsl_version(460)
10214+
[__NoSideEffect]
10215+
void __glslGetIntersectionTriangleVertexPositions$(ccName)(out float3 arr[3])
10216+
{
10217+
__intrinsic_asm "rayQueryGetIntersectionTriangleVertexPositionsEXT($0, $(ccTF), $1)";
10218+
};
10219+
10220+
__glsl_extension(GL_EXT_ray_query)
10221+
__glsl_extension(GL_EXT_ray_tracing_position_fetch)
10222+
__glsl_version(460)
10223+
[__NoSideEffect]
10224+
float3[3] $(ccName)GetIntersectionTriangleVertexPositions()
10225+
{
10226+
typedef float3[3] float3Arr3;
10227+
__target_switch
10228+
{
10229+
case glsl:
10230+
float3 output[3];
10231+
__glslGetIntersectionTriangleVertexPositions$(ccName)(output);
10232+
return output;
10233+
case spirv:
10234+
uint iCandidateOrCommitted = $(candidateOrCommitted);
10235+
return spirv_asm
10236+
{
10237+
OpCapability RayQueryKHR;
10238+
OpCapability RayTracingPositionFetchKHR;
10239+
OpCapability RayQueryPositionFetchKHR;
10240+
OpExtension "SPV_KHR_ray_query";
10241+
OpExtension "SPV_KHR_ray_tracing_position_fetch";
10242+
result: $$float3Arr3 = OpRayQueryGetIntersectionTriangleVertexPositionsKHR &this $iCandidateOrCommitted;
10243+
};
10244+
}
10245+
};
10246+
1021110247
// CandidateObjectToWorld3x4, CandidateWorldToObject4x3
1021210248
// CommittedObjectToWorld3x4, CommittedObjectToWorld4x3
1021310249
${{{{

tests/vkray/rayquery-closesthit.slang

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// rayquery-closesthit.slang
2+
//TEST:SIMPLE(filecheck=CHECK): -profile glsl_460+GL_EXT_ray_tracing -stage closesthit -entry main -target spirv-assembly
3+
//TEST:SIMPLE(filecheck=CHECK): -stage closesthit -entry main -target spirv-assembly -emit-spirv-directly
4+
5+
struct IntersectionPayload
6+
{
7+
float3 triangleVerticeCommitted[3];
8+
float3 triangleVerticeCandidate[3];
9+
};
10+
11+
RaytracingAccelerationStructure accelerationStructure;
12+
13+
void main(
14+
BuiltInTriangleIntersectionAttributes attributes,
15+
in out IntersectionPayload ioPayload)
16+
{
17+
RayQuery<RAY_FLAG_NONE> rayQuery;
18+
19+
uint instanceInclusionMask = 0x00;
20+
RayDesc rayDesc;
21+
rayQuery.TraceRayInline(accelerationStructure, RAY_FLAG_NONE, instanceInclusionMask, rayDesc);
22+
23+
ioPayload.triangleVerticeCommitted = rayQuery.CandidateGetIntersectionTriangleVertexPositions();
24+
ioPayload.triangleVerticeCandidate = rayQuery.CommittedGetIntersectionTriangleVertexPositions();
25+
}
26+
27+
// CHECK: OpCapability RayQueryKHR
28+
// CHECK: OpCapability RayTracingPositionFetchKHR
29+
// CHECK: OpCapability RayQueryPositionFetchKHR
30+
// CHECK: OpExtension "SPV_KHR_ray_query"
31+
// CHECK: OpExtension "SPV_KHR_ray_tracing_position_fetch"
32+
// CHECK: OpEntryPoint ClosestHitNV %main "main"
33+
// CHECK: OpRayQueryInitializeKHR %rayQuery{{.*}}
34+
// CHECK: OpRayQueryGetIntersectionTriangleVertexPositionsKHR %_arr_v3float_{{u?}}int_3{{.*}} %rayQuery{{.*}} %{{u?}}int_0
35+
// CHECK: OpRayQueryGetIntersectionTriangleVertexPositionsKHR %_arr_v3float_{{u?}}int_3{{.*}} %rayQuery{{.*}} %{{u?}}int_1

0 commit comments

Comments
 (0)