summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authortgrimesnv <158093149+tgrimesnv@users.noreply.github.com>2024-04-11 10:33:45 -0500
committerGitHub <noreply@github.com>2024-04-11 10:33:45 -0500
commit5a9fcbd4d211947725d35a600a7fb01d445ad062 (patch)
tree71135942b9851f277ac99fa81e823f84dfad7ea0 /tests
parentee9d398ebfc7c67205a8d5c91834ae4882d0dc9b (diff)
HLSL RT pipeline compile-only tests (#3793)
* HLSL RT pipeline compile-only tests * fix issues with chit,ahit,int due to using a too old version of slangc * change to SIMPLE and filecheck type of test * remove unneeded glsl and hlsl files * Add more filecheck checks * Fix copy paste mistake in intersection shader
Diffstat (limited to 'tests')
-rw-r--r--tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-ahit.slang209
-rw-r--r--tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-chit.slang277
-rw-r--r--tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-int.slang196
-rw-r--r--tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-miss.slang196
-rw-r--r--tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-rgen.slang152
5 files changed, 1030 insertions, 0 deletions
diff --git a/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-ahit.slang b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-ahit.slang
new file mode 100644
index 000000000..d98b3881a
--- /dev/null
+++ b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-ahit.slang
@@ -0,0 +1,209 @@
+//TEST:SIMPLE(filecheck=SPIRV):-target spirv-assembly -entry main -stage anyhit -profile glsl_460+GL_EXT_ray_tracing
+// Motion rays not supported on HLSL impl currently, so disable with NOMOTION define:
+//TEST:SIMPLE(filecheck=DXIL):-target dxil-assembly -entry main -stage anyhit -profile sm_6_5 -DNOMOTION
+
+// SPIRV: OpEntryPoint
+
+// SPIRV: OpLoad %v3uint %gl_LaunchIDEXT
+// SPIRV: OpLoad %v3uint %gl_LaunchSizeEXT
+
+// SPIRV: OpLoad %v3float %gl_WorldRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_WorldRayDirectionEXT
+// SPIRV: OpLoad %float %gl_RayTminEXT
+// SPIRV: OpLoad %float %gl_RayTmaxEXT
+// SPIRV: OpLoad %uint %gl_IncomingRayFlagsEXT
+
+// SPIRV: OpLoad %int %gl_InstanceID
+// SPIRV: OpLoad %int %gl_InstanceCustomIndexEXT
+// SPIRV: OpLoad %int %gl_GeometryIndexEXT
+// SPIRV: OpLoad %int %gl_PrimitiveID
+// SPIRV: OpLoad %v3float %gl_ObjectRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_ObjectRayDirectionEXT
+// SPIRV: OpLoad %mat4v3float %gl_ObjectToWorldEXT
+// SPIRV: OpLoad %mat4v3float %gl_ObjectToWorldEXT
+// SPIRV: OpLoad %mat4v3float %gl_WorldToObjectEXT
+// SPIRV: OpLoad %mat4v3float %gl_WorldToObjectEXT
+// SPIRV: OpLoad %uint %gl_HitKindEXT
+
+// SPIRV: OpLoad %v3float %gl_ObjectRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_ObjectRayDirectionEXT
+// SPIRV: OpLoad %float %gl_RayTmaxEXT
+// SPIRV: OpTerminateRayKHR
+// SPIRV: OpIgnoreIntersectionKHR
+
+// DXIL: main
+
+// DXIL: call i32 @dx.op.dispatchRaysIndex.i32
+// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32
+
+// DXIL: call float @dx.op.worldRayOrigin.f32
+// DXIL: call float @dx.op.worldRayDirection.f32
+// DXIL: call float @dx.op.rayTMin.f32
+// DXIL: call float @dx.op.rayTCurrent.f32
+// DXIL: call i32 @dx.op.rayFlags.i32
+
+// DXIL: call i32 @dx.op.instanceIndex.i32
+// DXIL: call i32 @dx.op.instanceID.i32
+// DXIL: call i32 @dx.op.geometryIndex.i32
+// DXIL: call i32 @dx.op.primitiveIndex.i32
+// DXIL: call float @dx.op.objectRayOrigin.f32
+// DXIL: call float @dx.op.objectRayDirection.f32
+// DXIL: call float @dx.op.objectToWorld.f32
+// DXIL: call float @dx.op.worldToObject.f32
+// DXIL: call i32 @dx.op.hitKind.i32
+
+// DXIL: call float @dx.op.objectRayOrigin.f32
+// DXIL: call float @dx.op.objectRayDirection.f32
+// DXIL: call float @dx.op.rayTCurrent.f32
+// DXIL: call void @dx.op.acceptHitAndEndSearch
+// DXIL: call void @dx.op.ignoreHit
+
+
+struct RayPayload
+{
+ float RayHitT;
+};
+
+float CheckRayDispatchValues()
+{
+ float val = 0.0f;
+
+ uint3 ri = DispatchRaysIndex();
+ uint3 rd = DispatchRaysDimensions();
+
+ val += ri.x; val += ri.y; val += ri.z;
+ val += rd.x; val += rd.y; val += rd.z;
+
+ return val;
+}
+
+float CheckRaySystemValues()
+{
+ float val = 0.0f;
+
+ float3 wro = WorldRayOrigin();
+ val += wro.x; val += wro.y; val += wro.z;
+
+ float3 wrd = WorldRayDirection();
+ val += wrd.x; val += wrd.y; val += wrd.z;
+
+ float rayTMin = RayTMin();
+ val += rayTMin;
+
+ float rayTCurrent = RayTCurrent();
+ val += rayTCurrent;
+
+ uint rayFlags = RayFlags();
+ switch (rayFlags)
+ {
+ case RAY_FLAG_NONE:
+ case RAY_FLAG_FORCE_OPAQUE:
+ case RAY_FLAG_FORCE_NON_OPAQUE:
+ case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH:
+ case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER:
+ case RAY_FLAG_CULL_BACK_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_OPAQUE:
+ case RAY_FLAG_CULL_NON_OPAQUE:
+ case RAY_FLAG_SKIP_TRIANGLES:
+ case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES:
+ val += 1.0f;
+ break;
+
+ default:
+ break;
+ }
+
+ return val;
+}
+
+float CheckObjectSpaceSystemValues()
+{
+ float val = 0.0f;
+
+ val += InstanceIndex();
+ val += InstanceID();
+ val += GeometryIndex();
+ val += PrimitiveIndex();
+
+ float3 oro = ObjectRayOrigin();
+ val += oro.x; val += oro.y; val += oro.z;
+
+ float3 ord = ObjectRayDirection();
+ val += ord.x; val += ord.y; val += ord.z;
+
+ float3x4 f3x4 = ObjectToWorld3x4();
+ val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14;
+ val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24;
+ val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34;
+
+ float4x3 f4x3 = ObjectToWorld4x3();
+ val += f4x3._11; val += f4x3._12; val += f4x3._13;
+ val += f4x3._21; val += f4x3._22; val += f4x3._23;
+ val += f4x3._31; val += f4x3._32; val += f4x3._33;
+ val += f4x3._41; val += f4x3._42; val += f4x3._43;
+
+ f3x4 = WorldToObject3x4();
+ val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14;
+ val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24;
+ val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34;
+
+ f4x3 = WorldToObject4x3();
+ val += f4x3._11; val += f4x3._12; val += f4x3._13;
+ val += f4x3._21; val += f4x3._22; val += f4x3._23;
+ val += f4x3._31; val += f4x3._32; val += f4x3._33;
+ val += f4x3._41; val += f4x3._42; val += f4x3._43;
+
+ return val;
+}
+
+float CheckHitSpecificSystemValues()
+{
+ float val = 0.0f;
+
+ uint hitKind = HitKind();
+ if (hitKind == HIT_KIND_TRIANGLE_FRONT_FACE || hitKind == HIT_KIND_TRIANGLE_BACK_FACE)
+ {
+ val += 1.0f;
+ }
+
+ return val;
+}
+
+float CheckSysValueIntrinsics()
+{
+ float val = 0.0f;
+
+ val += CheckRayDispatchValues();
+ val += CheckRaySystemValues();
+ val += CheckObjectSpaceSystemValues();
+ val += CheckHitSpecificSystemValues();
+
+ return val;
+}
+
+[shader("anyhit")]
+void main( inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attribs: SV_IntersectionAttributes )
+{
+ float val = 0.0f;
+
+ val += CheckSysValueIntrinsics();
+
+ float3 barycentrics = float3(1.0 - attribs.barycentrics.x - attribs.barycentrics.y, attribs.barycentrics.x, attribs.barycentrics.y);
+ val += barycentrics.x; val += barycentrics.y; val += barycentrics.z;
+
+ float3 hitLocation = ObjectRayOrigin() + ObjectRayDirection() * RayTCurrent();
+
+ if (hitLocation.x > 0.0f)
+ {
+ payload.RayHitT = val;
+ AcceptHitAndEndSearch();
+ }
+ else if (hitLocation.y < 0.0f)
+ {
+ payload.RayHitT = val;
+ IgnoreHit();
+ }
+
+ payload.RayHitT = val;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-chit.slang b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-chit.slang
new file mode 100644
index 000000000..13712797f
--- /dev/null
+++ b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-chit.slang
@@ -0,0 +1,277 @@
+//TEST:SIMPLE(filecheck=SPIRV):-target spirv-assembly -entry main -stage closesthit -profile glsl_460+GL_EXT_ray_tracing
+// Motion rays not supported on HLSL impl currently, so disable with NOMOTION define:
+//TEST:SIMPLE(filecheck=DXIL):-target dxil-assembly -entry main -stage closesthit -profile sm_6_5 -DNOMOTION
+
+// SPIRV: OpEntryPoint
+
+// SPIRV: OpLoad %v3uint %gl_LaunchIDEXT
+// SPIRV: OpLoad %v3uint %gl_LaunchSizeEXT
+
+// SPIRV: OpTraceRayKHR
+// SPIRV: OpTraceRayMotionNV
+
+// SPIRV: OpLoad %v3float %gl_WorldRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_WorldRayDirectionEXT
+// SPIRV: OpLoad %float %gl_RayTminEXT
+// SPIRV: OpLoad %float %gl_RayTmaxEXT
+// SPIRV: OpLoad %uint %gl_IncomingRayFlagsEXT
+
+// SPIRV: OpLoad %int %gl_InstanceID
+// SPIRV: OpLoad %int %gl_InstanceCustomIndexEXT
+// SPIRV: OpLoad %int %gl_GeometryIndexEXT
+// SPIRV: OpLoad %int %gl_PrimitiveID
+// SPIRV: OpLoad %v3float %gl_ObjectRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_ObjectRayDirectionEXT
+// SPIRV: OpLoad %mat4v3float %gl_ObjectToWorldEXT
+// SPIRV: OpLoad %mat4v3float %gl_ObjectToWorldEXT
+// SPIRV: OpLoad %mat4v3float %gl_WorldToObjectEXT
+// SPIRV: OpLoad %mat4v3float %gl_WorldToObjectEXT
+// SPIRV: OpLoad %uint %gl_HitKindEXT
+
+// SPIRV: OpExecuteCallableKHR
+
+// DXIL: main
+
+// DXIL: call i32 @dx.op.dispatchRaysIndex.i32
+// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32
+// DXIL: call void @dx.op.traceRay.struct.RayPayload_0
+
+// DXIL: call float @dx.op.worldRayOrigin.f32
+// DXIL: call float @dx.op.worldRayDirection.f32
+// DXIL: call float @dx.op.rayTMin.f32
+// DXIL: call float @dx.op.rayTCurrent.f32
+// DXIL: call i32 @dx.op.rayFlags.i32
+
+// DXIL: call i32 @dx.op.instanceIndex.i32
+// DXIL: call i32 @dx.op.instanceID.i32
+// DXIL: call i32 @dx.op.geometryIndex.i32
+// DXIL: call i32 @dx.op.primitiveIndex.i32
+// DXIL: call float @dx.op.objectRayOrigin.f32
+// DXIL: call float @dx.op.objectRayDirection.f32
+// DXIL: call float @dx.op.objectToWorld.f32
+// DXIL: call float @dx.op.worldToObject.f32
+// DXIL: call i32 @dx.op.hitKind.i32
+
+// DXIL: call void @dx.op.callShader.struct.CallableParams_0
+
+
+[[vk::binding(0)]]
+uniform RaytracingAccelerationStructure accelStruct : register(t0);
+
+struct RayPayload
+{
+ float RayHitT;
+};
+
+struct CallableParams
+{
+ float value;
+};
+
+#define T_MIN 0.01f
+#define T_MAX 1e4f
+
+float CheckRayDispatchValues()
+{
+ float val = 0.0f;
+
+ uint3 ri = DispatchRaysIndex();
+ uint3 rd = DispatchRaysDimensions();
+
+ val += ri.x; val += ri.y; val += ri.z;
+ val += rd.x; val += rd.y; val += rd.z;
+
+ return val;
+}
+
+float CheckRaySystemValues()
+{
+ float val = 0.0f;
+
+ float3 wro = WorldRayOrigin();
+ val += wro.x; val += wro.y; val += wro.z;
+
+ float3 wrd = WorldRayDirection();
+ val += wrd.x; val += wrd.y; val += wrd.z;
+
+ float rayTMin = RayTMin();
+ val += rayTMin;
+
+ float rayTCurrent = RayTCurrent();
+ val += rayTCurrent;
+
+ uint rayFlags = RayFlags();
+ switch (rayFlags)
+ {
+ case RAY_FLAG_NONE:
+ case RAY_FLAG_FORCE_OPAQUE:
+ case RAY_FLAG_FORCE_NON_OPAQUE:
+ case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH:
+ case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER:
+ case RAY_FLAG_CULL_BACK_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_OPAQUE:
+ case RAY_FLAG_CULL_NON_OPAQUE:
+ case RAY_FLAG_SKIP_TRIANGLES:
+ case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES:
+ val += 1.0f;
+ break;
+
+ default:
+ break;
+ }
+
+ return val;
+}
+
+float CheckObjectSpaceSystemValues()
+{
+ float val = 0.0f;
+
+ val += InstanceIndex();
+ val += InstanceID();
+ val += GeometryIndex();
+ val += PrimitiveIndex();
+
+ float3 oro = ObjectRayOrigin();
+ val += oro.x; val += oro.y; val += oro.z;
+
+ float3 ord = ObjectRayDirection();
+ val += ord.x; val += ord.y; val += ord.z;
+
+ float3x4 f3x4 = ObjectToWorld3x4();
+ val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14;
+ val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24;
+ val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34;
+
+ float4x3 f4x3 = ObjectToWorld4x3();
+ val += f4x3._11; val += f4x3._12; val += f4x3._13;
+ val += f4x3._21; val += f4x3._22; val += f4x3._23;
+ val += f4x3._31; val += f4x3._32; val += f4x3._33;
+ val += f4x3._41; val += f4x3._42; val += f4x3._43;
+
+ f3x4 = WorldToObject3x4();
+ val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14;
+ val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24;
+ val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34;
+
+ f4x3 = WorldToObject4x3();
+ val += f4x3._11; val += f4x3._12; val += f4x3._13;
+ val += f4x3._21; val += f4x3._22; val += f4x3._23;
+ val += f4x3._31; val += f4x3._32; val += f4x3._33;
+ val += f4x3._41; val += f4x3._42; val += f4x3._43;
+
+ return val;
+}
+
+float CheckHitSpecificSystemValues()
+{
+ float val = 0.0f;
+
+ uint hitKind = HitKind();
+ if (hitKind == HIT_KIND_TRIANGLE_FRONT_FACE || hitKind == HIT_KIND_TRIANGLE_BACK_FACE)
+ {
+ val += 1.0f;
+ }
+
+ return val;
+}
+
+float CheckTraceRay(RayPayload payload, RayDesc rayDesc)
+{
+ float val = 0.0f;
+ float currentTime = 1;
+
+ TraceRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+
+#if !defined(NOMOTION)
+ TraceMotionRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+#endif
+
+ return val;
+}
+
+float CheckSysValueIntrinsics()
+{
+ float val = 0.0f;
+
+ val += CheckRayDispatchValues();
+ val += CheckRaySystemValues();
+ val += CheckObjectSpaceSystemValues();
+ val += CheckHitSpecificSystemValues();
+
+ return val;
+}
+
+[shader("closesthit")]
+void main( inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attribs )
+{
+ float2 dir = (DispatchRaysIndex().xy / DispatchRaysDimensions().xy) * 2.0f - 1.0f;
+ float aspectRatio = DispatchRaysDimensions().x / DispatchRaysDimensions().y;
+
+ RayDesc rayDesc;
+ rayDesc.Origin = float3(0.0f, 0.0f, 0.0f);
+ rayDesc.Direction = normalize(float3(dir.x * aspectRatio, -dir.y, 1)); ;
+ rayDesc.TMin = T_MIN;
+ rayDesc.TMax = T_MAX;
+
+ //RayPayload payload;
+ payload.RayHitT = T_MAX;
+
+ float val = 0.0f;
+
+ val += CheckTraceRay(payload, rayDesc);
+
+ val += CheckSysValueIntrinsics();
+
+ float3 barycentrics = float3(1.0 - attribs.barycentrics.x - attribs.barycentrics.y, attribs.barycentrics.x, attribs.barycentrics.y);
+ val += barycentrics.x; val += barycentrics.y; val += barycentrics.z;
+
+ CallableParams params;
+ CallShader( 0, params );
+ val += params.value;
+
+ payload.RayHitT = val;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-int.slang b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-int.slang
new file mode 100644
index 000000000..fa2fedee6
--- /dev/null
+++ b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-int.slang
@@ -0,0 +1,196 @@
+//TEST:SIMPLE(filecheck=SPIRV):-target spirv-assembly -entry main -stage intersection -profile glsl_460+GL_EXT_ray_tracing
+// Motion rays not supported on HLSL impl currently, so disable with NOMOTION define:
+//TEST:SIMPLE(filecheck=DXIL):-target dxil-assembly -entry main -stage intersection -profile sm_6_5 -DNOMOTION
+
+// SPIRV: OpEntryPoint
+
+// SPIRV: OpLoad %v3uint %gl_LaunchIDEXT
+// SPIRV: OpLoad %v3uint %gl_LaunchSizeEXT
+
+// SPIRV: OpLoad %v3float %gl_WorldRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_WorldRayDirectionEXT
+// SPIRV: OpLoad %float %gl_RayTminEXT
+// SPIRV: OpLoad %float %gl_RayTmaxEXT
+// SPIRV: OpLoad %uint %gl_IncomingRayFlagsEXT
+
+// SPIRV: OpLoad %int %gl_InstanceID
+// SPIRV: OpLoad %int %gl_InstanceCustomIndexEXT
+// SPIRV: OpLoad %int %gl_GeometryIndexEXT
+// SPIRV: OpLoad %int %gl_PrimitiveID
+// SPIRV: OpLoad %v3float %gl_ObjectRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_ObjectRayDirectionEXT
+// SPIRV: OpLoad %mat4v3float %gl_ObjectToWorldEXT
+// SPIRV: OpLoad %mat4v3float %gl_ObjectToWorldEXT
+// SPIRV: OpLoad %mat4v3float %gl_WorldToObjectEXT
+// SPIRV: OpLoad %mat4v3float %gl_WorldToObjectEXT
+
+// SPIRV: OpLoad %float %gl_RayTminEXT
+// SPIRV: OpLoad %float %gl_RayTmaxEXT
+// SPIRV: OpReportIntersectionKHR
+
+// DXIL: main
+
+// DXIL: call i32 @dx.op.dispatchRaysIndex.i32
+// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32
+
+// DXIL: call float @dx.op.worldRayOrigin.f32
+// DXIL: call float @dx.op.worldRayDirection.f32
+// DXIL: call float @dx.op.rayTMin.f32
+// DXIL: call float @dx.op.rayTCurrent.f32
+// DXIL: call i32 @dx.op.rayFlags.i32
+
+// DXIL: call i32 @dx.op.instanceIndex.i32
+// DXIL: call i32 @dx.op.instanceID.i32
+// DXIL: call i32 @dx.op.geometryIndex.i32
+// DXIL: call i32 @dx.op.primitiveIndex.i32
+// DXIL: call float @dx.op.objectRayOrigin.f32
+// DXIL: call float @dx.op.objectRayDirection.f32
+// DXIL: call float @dx.op.objectToWorld.f32
+// DXIL: call float @dx.op.worldToObject.f32
+
+// DXIL: call float @dx.op.rayTMin.f32
+// DXIL: call float @dx.op.rayTCurrent.f32
+// DXIL: call i1 @dx.op.reportHit.struct.MyAttributes_0
+
+float CheckRayDispatchValues() // all
+{
+ float val = 0.0f;
+
+ uint3 ri = DispatchRaysIndex();
+ uint3 rd = DispatchRaysDimensions();
+
+ val += ri.x; val += ri.y; val += ri.z;
+ val += rd.x; val += rd.y; val += rd.z;
+
+ return val;
+}
+
+float CheckRaySystemValues() // chit/anyhit/intersection
+{
+ float val = 0.0f;
+
+ float3 wro = WorldRayOrigin();
+ val += wro.x; val += wro.y; val += wro.z;
+
+ float3 wrd = WorldRayDirection();
+ val += wrd.x; val += wrd.y; val += wrd.z;
+
+ float rayTMin = RayTMin();
+ val += rayTMin;
+
+ float rayTCurrent = RayTCurrent();
+ val += rayTCurrent;
+
+ uint rayFlags = RayFlags();
+ switch (rayFlags)
+ {
+ case RAY_FLAG_NONE:
+ case RAY_FLAG_FORCE_OPAQUE:
+ case RAY_FLAG_FORCE_NON_OPAQUE:
+ case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH:
+ case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER:
+ case RAY_FLAG_CULL_BACK_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_OPAQUE:
+ case RAY_FLAG_CULL_NON_OPAQUE:
+ case RAY_FLAG_SKIP_TRIANGLES:
+ case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES:
+ val += 1.0f;
+ break;
+
+ default:
+ break;
+ }
+
+ return val;
+}
+
+float CheckObjectSpaceSystemValues()
+{
+ float val = 0.0f;
+
+ val += InstanceIndex();
+ val += InstanceID();
+ val += GeometryIndex();
+ val += PrimitiveIndex();
+
+ float3 oro = ObjectRayOrigin();
+ val += oro.x; val += oro.y; val += oro.z;
+
+ float3 ord = ObjectRayDirection();
+ val += ord.x; val += ord.y; val += ord.z;
+
+ float3x4 f3x4 = ObjectToWorld3x4();
+ val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14;
+ val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24;
+ val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34;
+
+ float4x3 f4x3 = ObjectToWorld4x3();
+ val += f4x3._11; val += f4x3._12; val += f4x3._13;
+ val += f4x3._21; val += f4x3._22; val += f4x3._23;
+ val += f4x3._31; val += f4x3._32; val += f4x3._33;
+ val += f4x3._41; val += f4x3._42; val += f4x3._43;
+
+ f3x4 = WorldToObject3x4();
+ val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14;
+ val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24;
+ val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34;
+
+ f4x3 = WorldToObject4x3();
+ val += f4x3._11; val += f4x3._12; val += f4x3._13;
+ val += f4x3._21; val += f4x3._22; val += f4x3._23;
+ val += f4x3._31; val += f4x3._32; val += f4x3._33;
+ val += f4x3._41; val += f4x3._42; val += f4x3._43;
+
+ return val;
+}
+
+float CheckSysValueIntrinsics()
+{
+ float val = 0.0f;
+
+ val += CheckRayDispatchValues();
+ val += CheckRaySystemValues();
+ val += CheckObjectSpaceSystemValues();
+
+ return val;
+}
+
+struct MyAttributes
+{
+ float attr;
+};
+
+[shader("intersection")]
+void main()
+{
+ float val = 0.0f;
+ MyAttributes IDs;
+
+ float3 center = float3( 0.0f, 0.0f, 1.0f );
+ float radius = 5.0f;
+
+ float3 oc = WorldRayOrigin() - center;
+ float a = dot(WorldRayDirection(), WorldRayDirection());
+ float b = dot(oc, WorldRayDirection());
+ float c = dot(oc, oc) - radius * radius;
+ float discriminant = b * b - a * c;
+
+ val += CheckSysValueIntrinsics();
+
+ if (discriminant >= 0.0f)
+ {
+ val += discriminant;
+
+ float t1 = (-b - sqrt(discriminant)) / a;
+ float t2 = (-b + sqrt(discriminant)) / a;
+
+ float rayTMin = RayTMin();
+ float rayTMax = RayTCurrent();
+ if ((rayTMin <= t1 && t1 < rayTMax) || (rayTMin <= t2 && t2 < rayTMax))
+ {
+ IDs.attr = val;
+ ReportHit( (rayTMin <= t1 && t1 < rayTMax) ? t1 : t2, 0, IDs );
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-miss.slang b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-miss.slang
new file mode 100644
index 000000000..08b45f5d1
--- /dev/null
+++ b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-miss.slang
@@ -0,0 +1,196 @@
+//TEST:SIMPLE(filecheck=SPIRV):-target spirv-assembly -entry main -stage miss -profile glsl_460+GL_EXT_ray_tracing
+// Motion rays not supported on HLSL impl currently, so disable with NOMOTION define:
+//TEST:SIMPLE(filecheck=DXIL):-target dxil-assembly -entry main -stage miss -profile sm_6_5 -DNOMOTION
+
+// SPIRV: OpEntryPoint
+
+// SPIRV: OpLoad %v3uint %gl_LaunchIDEXT
+// SPIRV: OpLoad %v3uint %gl_LaunchSizeEXT
+
+// SPIRV: OpTraceRayKHR
+// SPIRV: OpTraceRayMotionNV
+
+// SPIRV: OpLoad %v3float %gl_WorldRayOriginEXT
+// SPIRV: OpLoad %v3float %gl_WorldRayDirectionEXT
+// SPIRV: OpLoad %float %gl_RayTminEXT
+// SPIRV: OpLoad %float %gl_RayTmaxEXT
+// SPIRV: OpLoad %uint %gl_IncomingRayFlagsEXT
+
+// SPIRV: OpExecuteCallableKHR
+
+// DXIL: main
+
+// DXIL: call i32 @dx.op.dispatchRaysIndex.i32
+// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32
+// DXIL: call void @dx.op.traceRay.struct.RayPayload_0
+
+// DXIL: call float @dx.op.worldRayOrigin.f32
+// DXIL: call float @dx.op.worldRayDirection.f32
+// DXIL: call float @dx.op.rayTMin.f32
+// DXIL: call float @dx.op.rayTCurrent.f32
+// DXIL: call i32 @dx.op.rayFlags.i32
+
+// DXIL: call void @dx.op.callShader.struct.CallableParams_0
+
+[[vk::binding(0)]]
+uniform RaytracingAccelerationStructure accelStruct : register(t0);
+
+struct RayPayload
+{
+ float RayHitT;
+};
+
+struct CallableParams
+{
+ float value;
+};
+
+#define T_MIN 0.01f
+#define T_MAX 1e4f
+
+float CheckRayDispatchValues()
+{
+ float val = 0.0f;
+
+ uint3 ri = DispatchRaysIndex();
+ uint3 rd = DispatchRaysDimensions();
+
+ val += ri.x; val += ri.y; val += ri.z;
+ val += rd.x; val += rd.y; val += rd.z;
+
+ return val;
+}
+
+float CheckRaySystemValues()
+{
+ float val = 0.0f;
+
+ float3 wro = WorldRayOrigin();
+ val += wro.x; val += wro.y; val += wro.z;
+
+ float3 wrd = WorldRayDirection();
+ val += wrd.x; val += wrd.y; val += wrd.z;
+
+ float rayTMin = RayTMin();
+ val += rayTMin;
+
+ float rayTCurrent = RayTCurrent();
+ val += rayTCurrent;
+
+ uint rayFlags = RayFlags();
+ switch (rayFlags)
+ {
+ case RAY_FLAG_NONE:
+ case RAY_FLAG_FORCE_OPAQUE:
+ case RAY_FLAG_FORCE_NON_OPAQUE:
+ case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH:
+ case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER:
+ case RAY_FLAG_CULL_BACK_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES:
+ case RAY_FLAG_CULL_OPAQUE:
+ case RAY_FLAG_CULL_NON_OPAQUE:
+ case RAY_FLAG_SKIP_TRIANGLES:
+ case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES:
+ val += 1.0f;
+ break;
+
+ default:
+ break;
+ }
+
+ return val;
+}
+
+float CheckTraceRay(RayPayload payload, RayDesc rayDesc)
+{
+ float val = 0.0f;
+ float currentTime = 1;
+
+ TraceRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+
+#if !defined(NOMOTION)
+ TraceMotionRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+#endif
+
+ return val;
+}
+
+float CheckSysValueIntrinsics()
+{
+ float val = 0.0f;
+
+ val += CheckRayDispatchValues();
+ val += CheckRaySystemValues();
+
+ return val;
+}
+
+[shader("miss")]
+void main( inout RayPayload payload )
+{
+ float2 dir = (DispatchRaysIndex().xy / DispatchRaysDimensions().xy) * 2.0f - 1.0f;
+ float aspectRatio = DispatchRaysDimensions().x / DispatchRaysDimensions().y;
+
+ RayDesc rayDesc;
+ rayDesc.Origin = float3(0.0f, 0.0f, 0.0f);
+ rayDesc.Direction = normalize(float3(dir.x * aspectRatio, -dir.y, 1)); ;
+ rayDesc.TMin = T_MIN;
+ rayDesc.TMax = T_MAX;
+
+ //RayPayload payload;
+ payload.RayHitT = T_MAX;
+
+ float val = 0.0f;
+
+ val += CheckTraceRay(payload, rayDesc);
+
+ val += CheckSysValueIntrinsics();
+
+ CallableParams params;
+ CallShader( 0, params );
+ val += params.value;
+
+ payload.RayHitT = val;
+} \ No newline at end of file
diff --git a/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-rgen.slang b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-rgen.slang
new file mode 100644
index 000000000..ccad7bbd9
--- /dev/null
+++ b/tests/hlsl-intrinsic/ray-tracing/rt-pipeline-intrinsics-rgen.slang
@@ -0,0 +1,152 @@
+//TEST:SIMPLE(filecheck=SPIRV):-target spirv-assembly -entry main -stage raygeneration -profile glsl_460+GL_EXT_ray_tracing
+// Motion rays not supported on HLSL impl currently, so disable with NOMOTION define:
+//TEST:SIMPLE(filecheck=DXIL):-target dxil-assembly -entry main -stage raygeneration -profile sm_6_5 -DNOMOTION
+
+// SPIRV: OpEntryPoint
+
+// SPIRV: OpLoad %v3uint %gl_LaunchIDEXT
+// SPIRV: OpLoad %v3uint %gl_LaunchSizeEXT
+
+// SPIRV: OpTraceRayKHR
+// SPIRV: OpTraceRayMotionNV
+
+// SPIRV: OpExecuteCallableKHR
+
+// DXIL: main
+
+// DXIL: call i32 @dx.op.dispatchRaysIndex.i32
+// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32
+// DXIL: call void @dx.op.traceRay.struct.RayPayload_0
+// DXIL: call void @dx.op.callShader.struct.CallableParams_0
+
+
+[[vk::binding(0)]]
+uniform RaytracingAccelerationStructure accelStruct : register(t0);
+
+[[vk::binding(1)]]
+RWTexture2D<float4> screenOutput : register(u0);
+
+struct RayPayload
+{
+ float RayHitT;
+};
+
+struct CallableParams
+{
+ float value;
+};
+
+#define T_MIN 0.01f
+#define T_MAX 1e4f
+
+float CheckRayDispatchValues()
+{
+ float val = 0.0f;
+
+ uint3 ri = DispatchRaysIndex();
+ uint3 rd = DispatchRaysDimensions();
+
+ val += ri.x; val += ri.y; val += ri.z;
+ val += rd.x; val += rd.y; val += rd.z;
+
+ return val;
+}
+
+float CheckTraceRay(RayPayload payload, RayDesc rayDesc)
+{
+ float val = 0.0f;
+ float currentTime = 1;
+
+ TraceRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+ TraceRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, payload);
+ val += payload.RayHitT;
+
+#if !defined(NOMOTION)
+ TraceMotionRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+ TraceMotionRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, currentTime, payload);
+ val += payload.RayHitT;
+#endif
+
+ return val;
+}
+
+float CheckSysValueIntrinsics()
+{
+ float val = 0.0f;
+
+ val += CheckRayDispatchValues();
+
+ return val;
+}
+
+[shader("raygeneration")]
+void main()
+{
+
+ float2 dir = (DispatchRaysIndex().xy / DispatchRaysDimensions().xy) * 2.0f - 1.0f;
+ float aspectRatio = DispatchRaysDimensions().x / DispatchRaysDimensions().y;
+
+ RayDesc rayDesc;
+ rayDesc.Origin = float3(0.0f, 0.0f, 0.0f);
+ rayDesc.Direction = normalize(float3(dir.x * aspectRatio, -dir.y, 1));;
+ rayDesc.TMin = T_MIN;
+ rayDesc.TMax = T_MAX;
+
+ RayPayload payload;
+ payload.RayHitT = T_MAX;
+
+ float val = 0.0f;
+
+ val += CheckTraceRay(payload, rayDesc);
+
+ if( val < T_MAX )
+ {
+ val += CheckSysValueIntrinsics();
+ screenOutput[DispatchRaysIndex().xy] = float4(val, val, val, 1);
+ }
+ else
+ {
+ CallableParams params;
+ CallShader(0, params);
+
+ screenOutput[DispatchRaysIndex().xy] = float4(params.value, params.value, params.value, params.value);
+ }
+} \ No newline at end of file