diff options
| author | tgrimesnv <158093149+tgrimesnv@users.noreply.github.com> | 2024-04-11 10:33:45 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-11 10:33:45 -0500 |
| commit | 5a9fcbd4d211947725d35a600a7fb01d445ad062 (patch) | |
| tree | 71135942b9851f277ac99fa81e823f84dfad7ea0 /tests | |
| parent | ee9d398ebfc7c67205a8d5c91834ae4882d0dc9b (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')
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 |
