From 9b434e50f02f9ec02ce230de9042ce7448bae451 Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Fri, 15 Mar 2024 16:14:32 -0400 Subject: Implement raytracing extension(s); resolves #3560 for GLSL & SPIR-V targets (#3675) The following PR implements raytracing extensions (GLSL_EXT_ray_tracing, GLSL_EXT_ray_query, GLSL_NV_shader_invocation_reorder & GLSL_NV_ray_tracing_motion_blur); for GLSL & SPIR-V targets. Fully implements all functions, built-in variables, & syntax; resolves #3560 for GLSL & SPIR-V Targets. notes of worth: * __rayPayloadFromLocation, __rayAttributeFromLocation, and __rayCallableFromLocation, were added as SPIR-V Intrinsics to refer to location's of raytracing objects in SPIR-V for when using GLSL syntax. --- .../glsl-intrinsic/raytracing/glsl-rayAnyhit.slang | 29 ++ .../raytracing/glsl-rayCompute.slang | 106 +++++ tests/glsl-intrinsic/raytracing/glsl-rayGen.slang | 333 ++++++++++++++++ .../raytracing/glsl-rayGenSimple.slang | 34 ++ .../raytracing/glsl-rayIntersection.slang | 87 ++++ tests/glsl-intrinsic/raytracing/glsl-rayMiss.slang | 62 +++ .../hit-object-array.slang.expected | 439 --------------------- .../hit-object-assign.slang.1.expected | 43 -- .../hit-object-assign.slang.expected | 177 --------- .../hit-object-make-hit.slang.1.expected | 114 ------ .../hit-object-make-hit.slang.expected | 439 --------------------- .../hit-object-make-miss.slang.1.expected | 38 -- .../hit-object-make-miss.slang.expected | 139 ------- .../hit-object-make-nop.slang.1.expected | 27 -- .../hit-object-make-nop.slang.expected | 131 ------ .../hit-object-output.slang.1.expected | 113 ------ .../hit-object-reorder-thread.slang.1.expected | 122 ------ .../hit-object-reorder-thread.slang.expected | 121 ------ .../hit-object-trace-motion-ray.slang.1.expected | 92 ----- .../hit-object-trace-ray.slang.1.expected | 90 ----- .../hit-object-trace-ray.slang.expected | 225 ----------- 21 files changed, 651 insertions(+), 2310 deletions(-) create mode 100644 tests/glsl-intrinsic/raytracing/glsl-rayAnyhit.slang create mode 100644 tests/glsl-intrinsic/raytracing/glsl-rayCompute.slang create mode 100644 tests/glsl-intrinsic/raytracing/glsl-rayGen.slang create mode 100644 tests/glsl-intrinsic/raytracing/glsl-rayGenSimple.slang create mode 100644 tests/glsl-intrinsic/raytracing/glsl-rayIntersection.slang create mode 100644 tests/glsl-intrinsic/raytracing/glsl-rayMiss.slang delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-array.slang.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-assign.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-assign.slang.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-hit.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-hit.slang.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-miss.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-miss.slang.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-nop.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-make-nop.slang.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-output.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-reorder-thread.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-reorder-thread.slang.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-motion-ray.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang.1.expected delete mode 100644 tests/hlsl-intrinsic/shader-execution-reordering/hit-object-trace-ray.slang.expected (limited to 'tests') diff --git a/tests/glsl-intrinsic/raytracing/glsl-rayAnyhit.slang b/tests/glsl-intrinsic/raytracing/glsl-rayAnyhit.slang new file mode 100644 index 000000000..0ad09d64d --- /dev/null +++ b/tests/glsl-intrinsic/raytracing/glsl-rayAnyhit.slang @@ -0,0 +1,29 @@ +//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage anyhit -entry main -target glsl +//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -emit-spirv-directly -stage anyhit -entry main -target spirv-assembly + +layout(binding = 0) uniform accelerationStructureEXT as; + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +buffer MyBlockName +{ + uint data[]; +} outputBuffer; + +bool testVars() { + return true +// CHECK_GLSL-DAG: gl_HitTEXT +// CHECK_SPV-DAG: RayTmaxNV + && gl_HitTEXT != 99.0f +// CHECK_GLSL-DAG: gl_HitKindEXT +// CHECK_SPV-DAG: HitKindNV + && gl_HitKindEXT != 0xFFFFFFFF + ; +} + +void main() +{ + outputBuffer.data[0] = true + && testVars() + ; + //BUF: 1 +} diff --git a/tests/glsl-intrinsic/raytracing/glsl-rayCompute.slang b/tests/glsl-intrinsic/raytracing/glsl-rayCompute.slang new file mode 100644 index 000000000..7d4950271 --- /dev/null +++ b/tests/glsl-intrinsic/raytracing/glsl-rayCompute.slang @@ -0,0 +1,106 @@ +//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage compute -entry computeMain -target glsl +//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -emit-spirv-directly -stage compute -entry computeMain -target spirv-assembly + +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF): -allow-glsl -vk -compute -output-using-type -render-feature ray-query -entry computeMain +//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=BUF): -allow-glsl -vk -compute -output-using-type -render-feature ray-query -emit-spirv-directly -entry computeMain + +// note: the referenced input data is in render-test-main kVertexData; 1 triangle at {(0,0,0.5),(0,1,0.5),(1,0,0.5)} +//TEST_INPUT: set scene = AccelerationStructure +layout(binding = 0) uniform accelerationStructureEXT scene; + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +buffer MyBlockName +{ + uint data[]; +} outputBuffer; + +__generic +bool equals(matrix lhs, matrix rhs) +{ + for (int i = 0; i < N; i++) + { + for (int j = 0; j < M; j++) + { + if ( + lhs[i][j] + != + rhs[i][j] + ) + { + return false; + } + } + } + return true; +} + +bool testAbortRayTrace() { + rayQueryEXT q; + rayQueryInitializeEXT(q, scene, gl_RayFlagsNoneEXT, 0xff, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f); + rayQueryTerminateEXT(q); + + return true + && rayQueryGetIntersectionTypeEXT(q, true) == gl_RayQueryCommittedIntersectionNoneEXT + ; +} + +bool testProceedRayTrace() { + rayQueryEXT q; + rayQueryInitializeEXT(q, scene, gl_RayFlagsNoneEXT, 0xff, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f); + rayQueryProceedEXT(q); + + return true + && rayQueryGetIntersectionTypeEXT(q, true) == gl_RayQueryCommittedIntersectionTriangleEXT + && rayQueryGetIntersectionTEXT(q, true) == 0.5 + ; +} + +bool testProceedRayAuxInfo() { + rayQueryEXT q; + rayQueryInitializeEXT(q, scene, gl_RayFlagsNoneEXT, 0xff, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f); + rayQueryProceedEXT(q); + + return true + && rayQueryGetRayTMinEXT(q) == 0.01f + && rayQueryGetRayFlagsEXT(q) == gl_RayFlagsNoneEXT + && rayQueryGetWorldRayOriginEXT(q) == vec3(0.1, 0.1, 0.0) + && rayQueryGetWorldRayDirectionEXT(q) == vec3(0, 0, 1) + && rayQueryGetIntersectionInstanceCustomIndexEXT(q, true) == 0 + && rayQueryGetIntersectionInstanceIdEXT(q, true) == 0 + && rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(q, true) == 0 + && rayQueryGetIntersectionGeometryIndexEXT(q, true) == 0 + && rayQueryGetIntersectionPrimitiveIndexEXT(q, true) == 0 + && rayQueryGetIntersectionBarycentricsEXT(q, true) == vec2(0.1) + && rayQueryGetIntersectionFrontFaceEXT(q, true) == true + && rayQueryGetIntersectionCandidateAABBOpaqueEXT(q) == true + && rayQueryGetIntersectionObjectRayDirectionEXT(q, true) == vec3(0, 0, 1) + && rayQueryGetIntersectionObjectRayOriginEXT(q, true) == vec3(0.1, 0.1, 0.0) + && !equals(rayQueryGetIntersectionObjectToWorldEXT(q, true), mat4x3(0)) // some compile error to sort later + && !equals(rayQueryGetIntersectionWorldToObjectEXT(q, true), mat4x3(0)) + ; +} +bool testRayTraceGenerate() { + rayQueryEXT q; + rayQueryInitializeEXT(q, scene, gl_RayFlagsNoneEXT, 0xff, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f); + rayQueryGenerateIntersectionEXT(q, 0.5); + rayQueryConfirmIntersectionEXT(q); + + return true + && rayQueryGetIntersectionTypeEXT(q, true) == gl_RayQueryCommittedIntersectionTriangleEXT + ; +} + +// CHECK_GLSL-DAG: main +// CHECK_SPV-DAG: OpEntryPoint +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; +void computeMain() +{ + outputBuffer.data[0] = true + && testAbortRayTrace() + //&& testProceedRayTrace() + //&& testProceedRayAuxInfo() + //&& testRayTraceGenerate() + ; + // BUF: 1 +} + diff --git a/tests/glsl-intrinsic/raytracing/glsl-rayGen.slang b/tests/glsl-intrinsic/raytracing/glsl-rayGen.slang new file mode 100644 index 000000000..ba4663f12 --- /dev/null +++ b/tests/glsl-intrinsic/raytracing/glsl-rayGen.slang @@ -0,0 +1,333 @@ +//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage raygeneration -entry main -target glsl +//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -emit-spirv-directly -stage raygeneration -entry main -target spirv-assembly + +layout(binding = 0) uniform accelerationStructureEXT as; + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +buffer MyBlockName +{ + uint data[]; +} outputBuffer; + +// CHECK_GLSL-DAG: rayPayloadEXT +// CHECK_SPV-DAG: RayPayloadNV +layout(location = 2) rayPayloadEXT vec4 payload; +// CHECK_GLSL-DAG: hitObjectAttributeNV +// CHECK_SPV-DAG: HitObjectAttributeNV +layout(location = 2) hitObjectAttributeNV vec4 attrMain; +// CHECK_GLSL-DAG: callableDataEXT +// CHECK_SPV-DAG: CallableDataNV +layout(location = 0) callableDataEXT vec4 outcall; + +__generic +bool equals(matrix lhs, matrix rhs) +{ + for (int i = 0; i < N; i++) + { + for (int j = 0; j < M; j++) + { + if ( + lhs[i][j] + != + rhs[i][j] + ) + { + return false; + } + } + } + return true; +} + +bool testHitObjectTraceRay() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectTraceRayNV +// CHECK_SPV-DAG: OpHitObjectTraceRayNV + hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); + return true +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true + ; +} + +bool testHitObjectTraceRayWithAuxInfo() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectTraceRayNV +// CHECK_SPV-DAG: OpHitObjectTraceRayNV + hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); +// CHECK_GLSL-DAG: hitObjectGetAttributesNV +// CHECK_SPV-DAG: OpHitObjectGetAttributesNV + hitObjectGetAttributesNV(hit, 2); + vec4 testCopy = attrMain; + +// CHECK_GLSL-DAG: reorderThreadNV +// CHECK_SPV-DAG: OpReorderThreadWithHintNV + reorderThreadNV(0, 3); +// CHECK_GLSL-DAG: reorderThreadNV +// CHECK_SPV-DAG: OpReorderThreadWithHitObjectNV + reorderThreadNV(hit); +// CHECK_GLSL-DAG: reorderThreadNV +// CHECK_SPV-DAG: OpReorderThreadWithHitObjectNV + reorderThreadNV(hit, 0, 3); + + return true +// CHECK_GLSL-DAG: hitObjectGetShaderBindingTableRecordIndexNV +// CHECK_SPV-DAG: OpHitObjectGetShaderBindingTableRecordIndexNV + && hitObjectGetShaderBindingTableRecordIndexNV(hit) == 0 +// CHECK_GLSL-DAG: hitObjectGetShaderRecordBufferHandleNV +// CHECK_SPV-DAG: OpHitObjectGetShaderRecordBufferHandleNV + && hitObjectGetShaderRecordBufferHandleNV(hit) != uvec2(0) // valid Handles are never 0, but not predictable either + && testCopy == vec4(1) +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true +// CHECK_GLSL-DAG: hitObjectGetRayTMinNV +// CHECK_SPV-DAG: OpHitObjectGetRayTMinNV + && hitObjectGetRayTMinNV(hit) == 0.01f +// CHECK_GLSL-DAG: hitObjectGetRayTMaxNV +// CHECK_SPV-DAG: OpHitObjectGetRayTMaxNV + && hitObjectGetRayTMaxNV(hit) == 1e4f +// CHECK_GLSL-DAG: hitObjectGetObjectRayOriginNV +// CHECK_SPV-DAG: OpHitObjectGetObjectRayOriginNV + && hitObjectGetObjectRayOriginNV(hit) == vec3(0.1, 0.1, 0.0) +// CHECK_GLSL-DAG: hitObjectGetObjectRayDirectionNV +// CHECK_SPV-DAG: OpHitObjectGetObjectRayDirectionNV + && hitObjectGetObjectRayDirectionNV(hit) == vec3(0, 0, 1) +// CHECK_GLSL-DAG: hitObjectGetWorldRayOriginNV +// CHECK_SPV-DAG: OpHitObjectGetWorldRayOriginNV + && hitObjectGetWorldRayOriginNV(hit) == vec3(0.1, 0.1, 0.0) +// CHECK_GLSL-DAG: hitObjectGetWorldRayDirectionNV +// CHECK_SPV-DAG: OpHitObjectGetWorldRayDirectionNV + && hitObjectGetWorldRayDirectionNV(hit) == vec3(0, 0, 1) +// CHECK_GLSL-DAG: hitObjectGetObjectToWorldNV +// CHECK_SPV-DAG: OpHitObjectGetObjectToWorldNV + && !equals(hitObjectGetObjectToWorldNV(hit), mat4x3(0)) +// CHECK_GLSL-DAG: hitObjectGetWorldToObjectNV +// CHECK_SPV-DAG: OpHitObjectGetWorldToObjectNV + && !equals(hitObjectGetWorldToObjectNV(hit), mat4x3(0)) +// CHECK_GLSL-DAG: hitObjectGetInstanceCustomIndexNV +// CHECK_SPV-DAG: OpHitObjectGetInstanceCustomIndexNV + && hitObjectGetInstanceCustomIndexNV(hit) == 0 +// CHECK_GLSL-DAG: hitObjectGetInstanceIdNV +// CHECK_SPV-DAG: OpHitObjectGetInstanceIdNV + && hitObjectGetInstanceIdNV(hit) == 0 +// CHECK_GLSL-DAG: hitObjectGetGeometryIndexNV +// CHECK_SPV-DAG: OpHitObjectGetGeometryIndexNV + && hitObjectGetGeometryIndexNV(hit) == 0 +// CHECK_GLSL-DAG: hitObjectGetPrimitiveIndexNV +// CHECK_SPV-DAG: OpHitObjectGetPrimitiveIndexNV + && hitObjectGetPrimitiveIndexNV(hit) == 0 +// CHECK_GLSL-DAG: hitObjectGetHitKindNV +// CHECK_SPV-DAG: OpHitObjectGetHitKindNV + && hitObjectGetHitKindNV(hit) == gl_HitKindFrontFacingTriangleEXT + ; +} + +bool testHitObjectTraceRayLaunchSubShaders() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectTraceRayNV +// CHECK_SPV-DAG: OpHitObjectTraceRayNV + hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); +// CHECK_GLSL-DAG: hitObjectExecuteShaderNV +// CHECK_SPV-DAG: OpHitObjectExecuteShaderNV + hitObjectExecuteShaderNV(hit, 2); + return true +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true + ; +} + +bool testHitObjectTraceRayMotion() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectTraceRayMotionNV +// CHECK_SPV-DAG: OpHitObjectTraceRayMotionNV + hitObjectTraceRayMotionNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); + return true +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true +// CHECK_GLSL-DAG: hitObjectGetCurrentTimeNV +// CHECK_SPV-DAG: OpHitObjectGetCurrentTimeNV + && hitObjectGetCurrentTimeNV(hit) == 0.0f + ; +} + +bool testTraceRayFunctions() { +// CHECK_GLSL-DAG: traceRayEXT +// CHECK_SPV-DAG: OpTraceRayKHR + traceRayEXT(as, 0, 0, 0, 0, 0, vec3(0), 0, vec3(0), 0, 2); + return true + ; +} + +bool testTraceRayCalls() { + return true + && testHitObjectTraceRay() + && testHitObjectTraceRayWithAuxInfo() + && testHitObjectTraceRayLaunchSubShaders() + && testHitObjectTraceRayMotion() + && testTraceRayFunctions() + ; +} + +bool testHitObjectRecord() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectRecordHitNV +// CHECK_SPV-DAG: OpHitObjectRecordHitNV + hitObjectRecordHitNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); + return true +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true + ; +} + +bool testHitObjectRecordIndex() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectRecordHitWithIndexNV +// CHECK_SPV-DAG: OpHitObjectRecordHitWithIndexNV + hitObjectRecordHitWithIndexNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); + return true +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true + ; +} + +bool testHitObjectRecordMotion() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectRecordHitMotionNV +// CHECK_SPV-DAG: OpHitObjectRecordHitMotionNV + hitObjectRecordHitMotionNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); + return true +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true + ; +} + +bool testHitObjectRecordIndexMotion() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectRecordHitWithIndexMotionNV +// CHECK_SPV-DAG: OpHitObjectRecordHitWithIndexMotionNV + hitObjectRecordHitWithIndexMotionNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); + return true +// CHECK_GLSL-DAG: hitObjectIsHitNV +// CHECK_SPV-DAG: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true + ; +} + +bool testRecordHitCalls() { + return true + && testHitObjectRecord() + && testHitObjectRecordIndex() + && testHitObjectRecordMotion() + && testHitObjectRecordIndexMotion() + ; +} + +bool testHitObjectRecordMiss() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectRecordMissNV +// CHECK_SPV-DAG: OpHitObjectRecordMissNV + hitObjectRecordMissNV(hit, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f); + return true +// CHECK_GLSL-DAG: hitObjectIsMissNV +// CHECK_SPV-DAG: OpHitObjectIsMissNV + && hitObjectIsMissNV(hit) == true + ; +} + +bool testHitObjectRecordMissMotion() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectRecordMissMotionNV +// CHECK_SPV-DAG: OpHitObjectRecordMissMotionNV + hitObjectRecordMissMotionNV(hit, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f); + return true +// CHECK_GLSL-DAG: hitObjectIsMissNV +// CHECK_SPV-DAG: OpHitObjectIsMissNV + && hitObjectIsMissNV(hit) == true + ; +} + +bool testRecordMissCalls() { + return true + && testHitObjectRecordMiss() + && testHitObjectRecordMissMotion() + ; +} + +bool testHitObjectRecordEmpty() { + hitObjectNV hit; +// CHECK_GLSL-DAG: hitObjectRecordEmptyNV +// CHECK_SPV-DAG: OpHitObjectRecordEmptyNV + hitObjectRecordEmptyNV(hit); + return true +// CHECK_GLSL-DAG: hitObjectIsEmptyNV +// CHECK_SPV-DAG: OpHitObjectIsEmptyNV + && hitObjectIsEmptyNV(hit) == true + ; +} + +bool testRecordEmptyCalls() { + return true + && testHitObjectRecordEmpty() + ; +} + +bool testTraceRayMotion() { +// CHECK_GLSL-DAG: traceRayMotionNV +// CHECK_SPV-DAG: OpTraceRayMotionNV + traceRayMotionNV(as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); + attrMain = vec4(1); //ensure traceRayMotionNV does not get optimized out + return true && + attrMain == vec4(1) + ; +} + +bool testPayloadReadWrite() { + payload = vec4(2); + vec4 read = payload; + return true + && read != vec4(0) + ; +} + +bool testAttributeReadWrite() { + attrMain = vec4(2); + vec4 read = attrMain; + return true + && read != vec4(0) + ; +} + +bool testCallableReadWrite() { + outcall = vec4(2); + vec4 read = outcall; + return true + && read != vec4(0) + ; +} + +bool testReadWriteOfObjects(){ + return true + && testPayloadReadWrite() + && testAttributeReadWrite() + && testCallableReadWrite(); + ; +} + +void main() +{ + outputBuffer.data[0] = true + && testTraceRayCalls() + && testRecordHitCalls() + && testRecordMissCalls() + && testRecordEmptyCalls() + && testTraceRayMotion() + && testReadWriteOfObjects(); + //BUF: 1 +} diff --git a/tests/glsl-intrinsic/raytracing/glsl-rayGenSimple.slang b/tests/glsl-intrinsic/raytracing/glsl-rayGenSimple.slang new file mode 100644 index 000000000..444384f52 --- /dev/null +++ b/tests/glsl-intrinsic/raytracing/glsl-rayGenSimple.slang @@ -0,0 +1,34 @@ +//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage raygeneration -entry main -target glsl +//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -emit-spirv-directly -stage raygeneration -entry main -target spirv-assembly + +// CHECK_GLSL-DAG: hitObjectAttributeNV +// CHECK_SPV-DAG: HitObjectAttributeNV + +layout(binding = 0) uniform accelerationStructureEXT as; + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +buffer MyBlockName +{ + uint data[]; +} outputBuffer; + +layout(location = 2) hitObjectAttributeNV vec4 attrMain; + +bool testHitObjectRecord() { + hitObjectNV hit; + // CHECK_GLSL: hitObjectRecordHitNV + // CHECK_SPV: OpHitObjectRecordHitNV + hitObjectRecordHitNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); + return true + // CHECK_GLSL: hitObjectIsHitNV + // CHECK_SPV: OpHitObjectIsHitNV + && hitObjectIsHitNV(hit) == true + ; +} + +void main() +{ + outputBuffer.data[0] = true + && testHitObjectRecord(); + //BUF: 1 +} diff --git a/tests/glsl-intrinsic/raytracing/glsl-rayIntersection.slang b/tests/glsl-intrinsic/raytracing/glsl-rayIntersection.slang new file mode 100644 index 000000000..92549e2d7 --- /dev/null +++ b/tests/glsl-intrinsic/raytracing/glsl-rayIntersection.slang @@ -0,0 +1,87 @@ +//TEST:SIMPLE(filecheck=CHECK_GLSL): -stage intersection -entry main -target glsl -allow-glsl +//TEST:SIMPLE(filecheck=CHECK_SPV): -stage intersection -entry main -target spirv-assembly -emit-spirv-directly -allow-glsl + +layout(binding = 0) uniform accelerationStructureEXT as; + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +buffer MyBlockName +{ + uint data[]; +} outputBuffer; + +//CHECK_GLSL-DAG: hitAttributeEXT +//CHECK_SPV-DAG: HitAttributeNV +hitAttributeEXT vec4 hitAttr; + +__generic +bool equals(matrix lhs, matrix rhs) +{ + for (int i = 0; i < N; i++) + { + for (int j = 0; j < M; j++) + { + if ( + lhs[i][j] + != + rhs[i][j] + ) + { + return false; + } + } + } + return true; +} + +bool testVars() { + hitAttr = vec4(1); + + return true +// CHECK_GLSL-DAG: gl_PrimitiveID +// CHECK_SPV-DAG: PrimitiveId + && gl_PrimitiveID != 10000 +// CHECK_GLSL-DAG: gl_InstanceID +// CHECK_SPV-DAG: InstanceId + && gl_InstanceID != 10000 +// CHECK_GLSL-DAG: gl_InstanceCustomIndexEXT +// CHECK_SPV-DAG: InstanceCustomIndexNV + && gl_InstanceCustomIndexEXT != 10000 +// CHECK_GLSL-DAG: gl_GeometryIndexEXT +// CHECK_SPV-DAG: RayGeometryIndexKHR + && gl_GeometryIndexEXT != 10000 +// CHECK_GLSL-DAG: gl_ObjectRayOriginEXT +// CHECK_SPV-DAG: ObjectRayOriginNV + && gl_ObjectRayOriginEXT != vec3(99) +// CHECK_GLSL-DAG: gl_ObjectRayDirectionEXT +// CHECK_SPV-DAG: ObjectRayDirectionNV + && gl_ObjectRayDirectionEXT != vec3(99) +// CHECK_GLSL-DAG: gl_ObjectToWorldEXT +//COM: CHECK_SPV-DAG: ObjectToWorldNV + && !equals(gl_ObjectToWorldEXT, mat4x3(0.0f)) +// CHECK_GLSL-DAG: gl_ObjectToWorld3x4EXT +//COM: CHECK_SPV-DAG: ObjectToWorldNV + && !equals(gl_ObjectToWorld3x4EXT, mat3x4(0.0f)) +// CHECK_GLSL-DAG: gl_WorldToObjectEXT +// CHECK_SPV-DAG-N: WorldToObjectNV + && !equals(gl_WorldToObjectEXT, mat4x3(0.0f)) +// CHECK_GLSL-DAG: gl_WorldToObject3x4EXT +// spirv checked with CHECK_SPV-DAG-N + && !equals(gl_WorldToObject3x4EXT, mat3x4(0.0f)) + ; +} + +bool testFunctions() { + return true +// CHECK_GLSL-DAG: reportIntersectionEXT +// CHECK_SPV-DAG: OpReportIntersectionKHR + && reportIntersectionEXT(99, 0); +} + +void main() +{ + outputBuffer.data[0] = true + && testVars() + && testFunctions(); + ; + //BUF: 1 +} diff --git a/tests/glsl-intrinsic/raytracing/glsl-rayMiss.slang b/tests/glsl-intrinsic/raytracing/glsl-rayMiss.slang new file mode 100644 index 000000000..714b214e1 --- /dev/null +++ b/tests/glsl-intrinsic/raytracing/glsl-rayMiss.slang @@ -0,0 +1,62 @@ +//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage miss -entry main -target glsl +//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -emit-spirv-directly -stage miss -entry main -target spirv-assembly + +layout(binding = 0) uniform accelerationStructureEXT as; + +//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer +buffer MyBlockName +{ + uint data[]; +} outputBuffer; + +// CHECK_GLSL-DAG: rayPayloadInEXT +// CHECK_SPV-DAG: IncomingRayPayloadNV +layout(location = 2) rayPayloadInEXT vec4 payload; +// CHECK_GLSL-DAG: hitObjectAttributeNV +// CHECK_SPV-DAG: HitObjectAttributeNV +layout(location = 2) hitObjectAttributeNV vec4 attrMain; + +bool testVars() { + payload = vec4(1); + attrMain = vec4(1); + return true +// CHECK_GLSL-DAG: gl_LaunchIDNV +// CHECK_SPV-DAG-N: LaunchIdNV + && gl_LaunchIDNV != uint3(99) +// CHECK_GLSL-DAG: gl_LaunchIDEXT +// spirv checked with CHECK_SPV-DAG-N + && gl_LaunchIDEXT != uint3(99) +// CHECK_GLSL-DAG: gl_LaunchSizeNV +// CHECK_SPV-DAG-N: LaunchSizeNV + && gl_LaunchSizeNV != uint3(99) +// CHECK_GLSL-DAG: gl_LaunchSizeEXT +// spirv checked with CHECK_SPV-DAG-N + && gl_LaunchSizeEXT != uint3(99) +// CHECK_GLSL-DAG: gl_WorldRayOriginEXT +// CHECK_SPV-DAG: WorldRayOriginNV + && gl_WorldRayOriginEXT != vec3(99) +// CHECK_GLSL-DAG: gl_WorldRayDirectionEXT +// CHECK_SPV-DAG: WorldRayDirectionNV + && gl_WorldRayDirectionEXT != vec3(99) +// CHECK_GLSL-DAG: gl_RayTminEXT +// CHECK_SPV-DAG: RayTminNV + && gl_RayTminEXT != 99.0f +// CHECK_GLSL-DAG: gl_RayTmaxEXT +// CHECK_SPV-DAG: RayTmaxNV + && gl_RayTmaxEXT != 99.0f +// CHECK_GLSL-DAG: gl_IncomingRayFlagsEXT +// CHECK_SPV-DAG: IncomingRayFlagsNV + && gl_IncomingRayFlagsEXT != 0xFFFFFFFF +// CHECK_GLSL-DAG: gl_CurrentRayTimeNV +// CHECK_SPV-DAG: CurrentRayTimeNV + && gl_CurrentRayTimeNV != 0.0f + ; +} + +void main() +{ + outputBuffer.data[0] = true + && testVars() + ; + //BUF: 1 +} diff --git a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-array.slang.expected b/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-array.slang.expected deleted file mode 100644 index fdc5cf0d7..000000000 --- a/tests/hlsl-intrinsic/shader-execution-reordering/hit-object-array.slang.expected +++ /dev/null @@ -1,439 +0,0 @@ -result code = 0 -standard error = { -} -standard output = { -; -; Note: shader requires additional functionality: -; UAVs at every shader stage -; -; shader hash: 1376fe501fef02e2587aacc2b18e252f -; -; Buffer Definitions: -; -; Resource bind info for g_NvidiaExt -; { -; -; struct struct.NvShaderExtnStruct -; { -; -; uint opcode; ; Offset: 0 -; uint rid; ; Offset: 4 -; uint sid; ; Offset: 8 -; uint4 dst1u; ; Offset: 12 -; uint4 src3u; ; Offset: 28 -; uint4 src4u; ; Offset: 44 -; uint4 src5u; ; Offset: 60 -; uint4 src0u; ; Offset: 76 -; uint4 src1u; ; Offset: 92 -; uint4 src2u; ; Offset: 108 -; uint4 dst0u; ; Offset: 124 -; uint markUavRef; ; Offset: 140 -; uint numOutputsForIncCounter; ; Offset: 144 -; float padding1[27]; ; Offset: 148 -; -; } $Element; ; Offset: 0 Size: 256 -; -; } -; -; Resource bind info for outputBuffer_0 -; { -; -; uint $Element; ; Offset: 0 Size: 4 -; -; } -; -; -; Resource Bindings: -; -; Name Type Format Dim ID HLSL Bind Count -; ------------------------------ ---------- ------- ----------- ------- -------------- ------ -; scene_0 texture i32 ras T0 t0 1 -; g_NvidiaExt UAV struct r/w+cnt U0 u0 1 -; outputBuffer_0 UAV struct r/w U1 u1 1 -; -target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64" -target triple = "dxil-ms-dx" - -%"class.RWStructuredBuffer" = type { %struct.NvShaderExtnStruct } -%struct.NvShaderExtnStruct = type { i32, i32, i32, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i32, i32, [27 x float] } -%struct.RaytracingAccelerationStructure = type { i32 } -%"class.RWStructuredBuffer" = type { i32 } -%struct.SomeValues_0 = type { i32, float } -%struct.NvHitObjectMacroDummyPayloadType = type { i32 } -%dx.types.Handle = type { i8* } - -@"\01?g_NvidiaExt@@3V?$RWStructuredBuffer@UNvShaderExtnStruct@@@@A" = external constant %"class.RWStructuredBuffer", align 4 -@"\01?scene_0@@3URaytracingAccelerationStructure@@A" = external constant %struct.RaytracingAccelerationStructure, align 4 -@"\01?outputBuffer_0@@3V?$RWStructuredBuffer@I@@A" = external constant %"class.RWStructuredBuffer", align 4 - -; Function Attrs: nounwind -define void @"\01?rayGenerationMain@@YAXXZ"() #0 { - %1 = load %struct.RaytracingAccelerationStructure, %struct.RaytracingAccelerationStructure* @"\01?scene_0@@3URaytracingAccelerationStructure@@A", align 4, !noalias !18 - %2 = load %"class.RWStructuredBuffer", %"class.RWStructuredBuffer"* @"\01?outputBuffer_0@@3V?$RWStructuredBuffer@I@@A", align 4 - %3 = load %"class.RWStructuredBuffer", %"class.RWStructuredBuffer"* @"\01?g_NvidiaExt@@3V?$RWStructuredBuffer@UNvShaderExtnStruct@@@@A", align 4, !noalias !21 - %4 = alloca %struct.SomeValues_0, align 8 - %5 = alloca %struct.SomeValues_0, align 8 - %6 = alloca %struct.SomeValues_0, align 8 - %7 = alloca %struct.NvHitObjectMacroDummyPayloadType, align 4 - %8 = alloca %struct.SomeValues_0, align 8 - %9 = alloca %struct.NvHitObjectMacroDummyPayloadType, align 4 - %10 = call i32 @dx.op.dispatchRaysIndex.i32(i32 145, i8 0) ; DispatchRaysIndex(col) - %11 = sitofp i32 %10 to float - %12 = fmul fast float %11, 2.000000e+00 - %13 = sitofp i32 %10 to float - %14 = mul nsw i32 %10, 3 - %15 = shl nsw i32 %10, 1 - %16 = getelementptr inbounds %struct.SomeValues_0, %struct.SomeValues_0* %8, i32 0, i32 0 - store i32 %10, i32* %16, align 8 - %17 = getelementptr inbounds %struct.SomeValues_0, %struct.SomeValues_0* %8, i32 0, i32 1 - store float %12, float* %17, align 4 - %18 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %19 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %18, i8 1) ; BufferUpdateCounter(uav,inc) - %20 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %20, i32 %19, i32 0, i32 69, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %21 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %21, i32 %19, i32 144, i32 2, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %22 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %22, i32 %19, i32 76, i32 %10, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %23 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %23, i32 %19, i32 80, i32 %15, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %24 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %24, i32 %19, i32 84, i32 %14, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %25 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %25, i32 %19, i32 88, i32 0, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %26 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %26, i32 %19, i32 92, i32 0, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %27 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %28 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %27, i8 1) ; BufferUpdateCounter(uav,inc) - %29 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %30 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %29, i8 1) ; BufferUpdateCounter(uav,inc) - call void @dx.op.callShader.struct.SomeValues_0(i32 159, i32 %30, %struct.SomeValues_0* nonnull %8) ; CallShader(ShaderIndex,Parameter) - %31 = call %dx.types.Handle @dx.op.createHandleForLib.struct.RaytracingAccelerationStructure(i32 160, %struct.RaytracingAccelerationStructure %1) ; CreateHandleForLib(Resource) - call void @dx.op.traceRay.struct.NvHitObjectMacroDummyPayloadType(i32 157, %dx.types.Handle %31, i32 0, i32 0, i32 0, i32 0, i32 %30, float %13, float 0.000000e+00, float 0.000000e+00, float 0x3F847AE140000000, float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+04, %struct.NvHitObjectMacroDummyPayloadType* nonnull %9) ; TraceRay(AccelerationStructure,RayFlags,InstanceInclusionMask,RayContributionToHitGroupIndex,MultiplierForGeometryContributionToShaderIndex,MissShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload) - %32 = mul nsw i32 %10, 3 - %33 = shl nsw i32 %10, 1 - %34 = getelementptr inbounds %struct.SomeValues_0, %struct.SomeValues_0* %6, i32 0, i32 0 - store i32 %10, i32* %34, align 8 - %35 = getelementptr inbounds %struct.SomeValues_0, %struct.SomeValues_0* %6, i32 0, i32 1 - store float %12, float* %35, align 4 - %36 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %37 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %36, i8 1) ; BufferUpdateCounter(uav,inc) - %38 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %38, i32 %37, i32 0, i32 68, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %39 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %39, i32 %37, i32 144, i32 2, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %40 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %40, i32 %37, i32 76, i32 %10, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %41 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %41, i32 %37, i32 80, i32 %33, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %42 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %42, i32 %37, i32 84, i32 %32, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %43 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %43, i32 %37, i32 88, i32 0, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %44 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %44, i32 %37, i32 92, i32 0, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %45 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %45, i32 %37, i32 96, i32 4, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %46 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %47 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %46, i8 1) ; BufferUpdateCounter(uav,inc) - %48 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %49 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %48, i8 1) ; BufferUpdateCounter(uav,inc) - call void @dx.op.callShader.struct.SomeValues_0(i32 159, i32 %49, %struct.SomeValues_0* nonnull %6) ; CallShader(ShaderIndex,Parameter) - %50 = call %dx.types.Handle @dx.op.createHandleForLib.struct.RaytracingAccelerationStructure(i32 160, %struct.RaytracingAccelerationStructure %1) ; CreateHandleForLib(Resource) - call void @dx.op.traceRay.struct.NvHitObjectMacroDummyPayloadType(i32 157, %dx.types.Handle %50, i32 0, i32 0, i32 0, i32 0, i32 %49, float %13, float 0.000000e+00, float 0.000000e+00, float 0x3F847AE140000000, float 0.000000e+00, float 1.000000e+00, float 0.000000e+00, float 1.000000e+04, %struct.NvHitObjectMacroDummyPayloadType* nonnull %7) ; TraceRay(AccelerationStructure,RayFlags,InstanceInclusionMask,RayContributionToHitGroupIndex,MultiplierForGeometryContributionToShaderIndex,MissShaderIndex,Origin_X,Origin_Y,Origin_Z,TMin,Direction_X,Direction_Y,Direction_Z,TMax,payload) - %51 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %52 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %51, i8 1) ; BufferUpdateCounter(uav,inc) - %53 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %53, i32 %52, i32 0, i32 83, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %54 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %54, i32 %52, i32 76, i32 %28, i32 undef, i32 undef, i32 undef, i8 1, i32 4) ; RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - %55 = call %dx.types.Handle @"dx.op.createHandleForLib.class.RWStructuredBuffer"(i32 160, %"class.RWStructuredBuffer" %3) ; CreateHandleForLib(Resource) - %56 = call i32 @dx.op.bufferUpdateCounter(i32 70, %dx.types.Handle %55, i8 1) ; BufferUpdateCounter(uav,inc) - %57 = icmp eq i32 %56, 0 - br i1 %57, label %130, label %58 - -;