From fc60f77aa255d03e0bd760066599ad067cda2175 Mon Sep 17 00:00:00 2001 From: alelenv Date: Tue, 10 Aug 2021 10:40:28 -0700 Subject: [PATCH] Add support for GL_NV_ray_tracing_motion_blur. --- SPIRV/GLSL.ext.NV.h | 3 + SPIRV/GlslangToSpv.cpp | 16 +++- SPIRV/doc.cpp | 17 ++++ SPIRV/spirv.hpp | 6 ++ .../spv.AnyHitShaderMotion.rahit.out | 33 ++++++++ .../spv.ClosestHitShaderMotion.rchit.out | 59 ++++++++++++++ .../spv.IntersectShaderMotion.rint.out | 33 ++++++++ .../spv.MissShaderMotion.rmiss.out | 59 ++++++++++++++ .../spv.RayGenShaderMotion.rgen.out | 81 +++++++++++++++++++ Test/spv.AnyHitShaderMotion.rahit | 6 ++ Test/spv.ClosestHitShaderMotion.rchit | 10 +++ Test/spv.IntersectShaderMotion.rint | 6 ++ Test/spv.MissShaderMotion.rmiss | 10 +++ Test/spv.RayGenShaderMotion.rgen | 13 +++ glslang/Include/BaseTypes.h | 2 + glslang/Include/intermediate.h | 1 + glslang/MachineIndependent/Initialize.cpp | 12 ++- glslang/MachineIndependent/ParseHelper.cpp | 4 + glslang/MachineIndependent/Versions.cpp | 6 +- glslang/MachineIndependent/Versions.h | 1 + glslang/MachineIndependent/intermOut.cpp | 1 + gtests/Spv.FromFile.cpp | 19 +++++ 22 files changed, 394 insertions(+), 4 deletions(-) create mode 100644 Test/baseResults/spv.AnyHitShaderMotion.rahit.out create mode 100644 Test/baseResults/spv.ClosestHitShaderMotion.rchit.out create mode 100644 Test/baseResults/spv.IntersectShaderMotion.rint.out create mode 100644 Test/baseResults/spv.MissShaderMotion.rmiss.out create mode 100644 Test/baseResults/spv.RayGenShaderMotion.rgen.out create mode 100644 Test/spv.AnyHitShaderMotion.rahit create mode 100644 Test/spv.ClosestHitShaderMotion.rchit create mode 100644 Test/spv.IntersectShaderMotion.rint create mode 100644 Test/spv.MissShaderMotion.rmiss create mode 100644 Test/spv.RayGenShaderMotion.rgen diff --git a/SPIRV/GLSL.ext.NV.h b/SPIRV/GLSL.ext.NV.h index 50146da1..93c98bf6 100644 --- a/SPIRV/GLSL.ext.NV.h +++ b/SPIRV/GLSL.ext.NV.h @@ -69,6 +69,9 @@ const char* const E_SPV_NV_mesh_shader = "SPV_NV_mesh_shader"; //SPV_NV_raytracing const char* const E_SPV_NV_ray_tracing = "SPV_NV_ray_tracing"; +//SPV_NV_ray_tracing_motion_blur +const char* const E_SPV_NV_ray_tracing_motion_blur = "SPV_NV_ray_tracing_motion_blur"; + //SPV_NV_shading_rate const char* const E_SPV_NV_shading_rate = "SPV_NV_shading_rate"; diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index c8a73a6b..c323bcdb 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1033,6 +1033,10 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI return spv::BuiltInIncomingRayFlagsKHR; case glslang::EbvGeometryIndex: return spv::BuiltInRayGeometryIndexKHR; + case glslang::EbvCurrentRayTimeNV: + builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur); + builder.addCapability(spv::CapabilityRayTracingMotionBlurNV); + return spv::BuiltInCurrentRayTimeNV; // barycentrics case glslang::EbvBaryCoordNV: @@ -3018,6 +3022,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt case glslang::EOpIgnoreIntersectionNV: case glslang::EOpTerminateRayNV: case glslang::EOpTraceNV: + case glslang::EOpTraceRayMotionNV: case glslang::EOpTraceKHR: case glslang::EOpExecuteCallableNV: case glslang::EOpExecuteCallableKHR: @@ -3317,9 +3322,11 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst(); operands.push_back(builder.makeIntConstant(cond ? 1 : 0)); } else if ((arg == 10 && glslangOp == glslang::EOpTraceKHR) || + (arg == 11 && glslangOp == glslang::EOpTraceRayMotionNV) || (arg == 1 && glslangOp == glslang::EOpExecuteCallableKHR)) { - const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : 1; - const int set = glslangOp == glslang::EOpTraceKHR ? 0 : 1; + const int opdNum = glslangOp == glslang::EOpTraceKHR ? 10 : (glslangOp == glslang::EOpTraceRayMotionNV ? 11 : 1); + const int set = glslangOp == glslang::EOpExecuteCallableKHR ? 1 : 0; + const int location = glslangOperands[opdNum]->getAsConstantUnion()->getConstArray()[0].getUConst(); auto itNode = locationToSymbol[set].find(location); visitSymbol(itNode->second); @@ -8322,6 +8329,11 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: case glslang::EOpTraceNV: builder.createNoResultOp(spv::OpTraceNV, operands); return 0; + case glslang::EOpTraceRayMotionNV: + builder.addExtension(spv::E_SPV_NV_ray_tracing_motion_blur); + builder.addCapability(spv::CapabilityRayTracingMotionBlurNV); + builder.createNoResultOp(spv::OpTraceRayMotionNV, operands); + return 0; case glslang::EOpTraceKHR: builder.createNoResultOp(spv::OpTraceRayKHR, operands); return 0; diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp index 31b20a1f..dbdf7077 100644 --- a/SPIRV/doc.cpp +++ b/SPIRV/doc.cpp @@ -426,6 +426,7 @@ const char* BuiltInString(int builtIn) case BuiltInSMCountNV: return "SMCountNV"; case BuiltInWarpIDNV: return "WarpIDNV"; case BuiltInSMIDNV: return "SMIDNV"; + case BuiltInCurrentRayTimeNV: return "CurrentRayTimeNV"; default: return "Bad"; } @@ -916,6 +917,7 @@ const char* CapabilityString(int info) case CapabilityPerViewAttributesNV: return "PerViewAttributesNV"; case CapabilityGroupNonUniformPartitionedNV: return "GroupNonUniformPartitionedNV"; case CapabilityRayTracingNV: return "RayTracingNV"; + case CapabilityRayTracingMotionBlurNV: return "RayTracingMotionBlurNV"; case CapabilityRayTracingKHR: return "RayTracingKHR"; case CapabilityRayQueryKHR: return "RayQueryKHR"; case CapabilityRayTracingProvisionalKHR: return "RayTracingProvisionalKHR"; @@ -1382,6 +1384,7 @@ const char* OpcodeString(int op) case OpTerminateRayNV: return "OpTerminateRayNV"; case OpTerminateRayKHR: return "OpTerminateRayKHR"; case OpTraceNV: return "OpTraceNV"; + case OpTraceRayMotionNV: return "OpTraceRayMotionNV"; case OpTraceRayKHR: return "OpTraceRayKHR"; case OpTypeAccelerationStructureKHR: return "OpTypeAccelerationStructureKHR"; case OpExecuteCallableNV: return "OpExecuteCallableNV"; @@ -2812,6 +2815,20 @@ void Parameterize() InstructionDesc[OpTraceNV].operands.push(OperandId, "'Payload'"); InstructionDesc[OpTraceNV].setResultAndType(false, false); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Acceleration Structure'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Flags'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Cull Mask'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Offset'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'SBT Record Stride'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Miss Index'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Origin'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMin'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Ray Direction'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'TMax'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Time'"); + InstructionDesc[OpTraceRayMotionNV].operands.push(OperandId, "'Payload'"); + InstructionDesc[OpTraceRayMotionNV].setResultAndType(false, false); + InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Acceleration Structure'"); InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Ray Flags'"); InstructionDesc[OpTraceRayKHR].operands.push(OperandId, "'Cull Mask'"); diff --git a/SPIRV/spirv.hpp b/SPIRV/spirv.hpp index 317db81f..e0fe2498 100644 --- a/SPIRV/spirv.hpp +++ b/SPIRV/spirv.hpp @@ -652,6 +652,7 @@ enum BuiltIn { BuiltInHitTNV = 5332, BuiltInHitKindKHR = 5333, BuiltInHitKindNV = 5333, + BuiltInCurrentRayTimeNV = 5334, BuiltInIncomingRayFlagsKHR = 5351, BuiltInIncomingRayFlagsNV = 5351, BuiltInRayGeometryIndexKHR = 5352, @@ -988,6 +989,7 @@ enum Capability { CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312, CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312, CapabilityRayTracingNV = 5340, + CapabilityRayTracingMotionBlurNV = 5341, CapabilityVulkanMemoryModel = 5345, CapabilityVulkanMemoryModelKHR = 5345, CapabilityVulkanMemoryModelDeviceScope = 5346, @@ -1503,6 +1505,8 @@ enum Op { OpIgnoreIntersectionNV = 5335, OpTerminateRayNV = 5336, OpTraceNV = 5337, + OpTraceMotionNV = 5338, + OpTraceRayMotionNV = 5339, OpTypeAccelerationStructureKHR = 5341, OpTypeAccelerationStructureNV = 5341, OpExecuteCallableNV = 5344, @@ -2090,6 +2094,8 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { case OpIgnoreIntersectionNV: *hasResult = false; *hasResultType = false; break; case OpTerminateRayNV: *hasResult = false; *hasResultType = false; break; case OpTraceNV: *hasResult = false; *hasResultType = false; break; + case OpTraceMotionNV: *hasResult = false; *hasResultType = false; break; + case OpTraceRayMotionNV: *hasResult = false; *hasResultType = false; break; case OpTypeAccelerationStructureNV: *hasResult = true; *hasResultType = false; break; case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break; case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break; diff --git a/Test/baseResults/spv.AnyHitShaderMotion.rahit.out b/Test/baseResults/spv.AnyHitShaderMotion.rahit.out new file mode 100644 index 00000000..f9e1e1b9 --- /dev/null +++ b/Test/baseResults/spv.AnyHitShaderMotion.rahit.out @@ -0,0 +1,33 @@ +spv.AnyHitShaderMotion.rahit +// Module Version 10400 +// Generated by (magic number): 8000a +// Id's are bound by 14 + + Capability RayTracingKHR + Capability RayTracingMotionBlurNV + Extension "SPV_KHR_ray_tracing" + Extension "SPV_NV_ray_tracing_motion_blur" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint AnyHitKHR 4 "main" 10 + Source GLSL 460 + SourceExtension "GL_NV_ray_tracing_motion_blur" + Name 4 "main" + Name 8 "time" + Name 10 "gl_CurrentRayTimeNV" + Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypePointer Function 6(float) + 9: TypePointer Input 6(float) +10(gl_CurrentRayTimeNV): 9(ptr) Variable Input + 12: 6(float) Constant 1056964608 + 4(main): 2 Function None 3 + 5: Label + 8(time): 7(ptr) Variable Function + 11: 6(float) Load 10(gl_CurrentRayTimeNV) + 13: 6(float) FAdd 11 12 + Store 8(time) 13 + Return + FunctionEnd diff --git a/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out b/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out new file mode 100644 index 00000000..e89abb45 --- /dev/null +++ b/Test/baseResults/spv.ClosestHitShaderMotion.rchit.out @@ -0,0 +1,59 @@ +spv.ClosestHitShaderMotion.rchit +// Module Version 10400 +// Generated by (magic number): 8000a +// Id's are bound by 33 + + Capability RayTracingKHR + Capability RayTracingMotionBlurNV + Extension "SPV_KHR_ray_tracing" + Extension "SPV_NV_ray_tracing_motion_blur" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint ClosestHitKHR 4 "main" 10 16 32 + Source GLSL 460 + SourceExtension "GL_EXT_ray_tracing" + SourceExtension "GL_NV_ray_tracing_motion_blur" + Name 4 "main" + Name 8 "time" + Name 10 "gl_CurrentRayTimeNV" + Name 16 "accEXT" + Name 32 "incomingPayloadEXT" + Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV + Decorate 16(accEXT) DescriptorSet 0 + Decorate 16(accEXT) Binding 0 + Decorate 32(incomingPayloadEXT) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypePointer Function 6(float) + 9: TypePointer Input 6(float) +10(gl_CurrentRayTimeNV): 9(ptr) Variable Input + 12: 6(float) Constant 1056964608 + 14: TypeAccelerationStructureKHR + 15: TypePointer UniformConstant 14 + 16(accEXT): 15(ptr) Variable UniformConstant + 18: TypeInt 32 0 + 19: 18(int) Constant 0 + 20: 18(int) Constant 1 + 21: 18(int) Constant 2 + 22: 18(int) Constant 3 + 23: TypeVector 6(float) 3 + 24: 23(fvec3) ConstantComposite 12 12 12 + 25: 6(float) Constant 1065353216 + 26: 23(fvec3) ConstantComposite 25 25 25 + 27: 6(float) Constant 1061158912 + 28: TypeInt 32 1 + 29: 28(int) Constant 0 + 30: TypeVector 6(float) 4 + 31: TypePointer IncomingRayPayloadKHR 30(fvec4) +32(incomingPayloadEXT): 31(ptr) Variable IncomingRayPayloadKHR + 4(main): 2 Function None 3 + 5: Label + 8(time): 7(ptr) Variable Function + 11: 6(float) Load 10(gl_CurrentRayTimeNV) + 13: 6(float) FAdd 11 12 + Store 8(time) 13 + 17: 14 Load 16(accEXT) + TraceRayMotionNV 17 19 20 21 22 19 24 12 26 27 25 32(incomingPayloadEXT) + Return + FunctionEnd diff --git a/Test/baseResults/spv.IntersectShaderMotion.rint.out b/Test/baseResults/spv.IntersectShaderMotion.rint.out new file mode 100644 index 00000000..f77c9a81 --- /dev/null +++ b/Test/baseResults/spv.IntersectShaderMotion.rint.out @@ -0,0 +1,33 @@ +spv.IntersectShaderMotion.rint +// Module Version 10400 +// Generated by (magic number): 8000a +// Id's are bound by 14 + + Capability RayTracingKHR + Capability RayTracingMotionBlurNV + Extension "SPV_KHR_ray_tracing" + Extension "SPV_NV_ray_tracing_motion_blur" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint IntersectionKHR 4 "main" 10 + Source GLSL 460 + SourceExtension "GL_NV_ray_tracing_motion_blur" + Name 4 "main" + Name 8 "time" + Name 10 "gl_CurrentRayTimeNV" + Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypePointer Function 6(float) + 9: TypePointer Input 6(float) +10(gl_CurrentRayTimeNV): 9(ptr) Variable Input + 12: 6(float) Constant 1056964608 + 4(main): 2 Function None 3 + 5: Label + 8(time): 7(ptr) Variable Function + 11: 6(float) Load 10(gl_CurrentRayTimeNV) + 13: 6(float) FAdd 11 12 + Store 8(time) 13 + Return + FunctionEnd diff --git a/Test/baseResults/spv.MissShaderMotion.rmiss.out b/Test/baseResults/spv.MissShaderMotion.rmiss.out new file mode 100644 index 00000000..2f183381 --- /dev/null +++ b/Test/baseResults/spv.MissShaderMotion.rmiss.out @@ -0,0 +1,59 @@ +spv.MissShaderMotion.rmiss +// Module Version 10400 +// Generated by (magic number): 8000a +// Id's are bound by 33 + + Capability RayTracingKHR + Capability RayTracingMotionBlurNV + Extension "SPV_KHR_ray_tracing" + Extension "SPV_NV_ray_tracing_motion_blur" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint MissKHR 4 "main" 10 16 32 + Source GLSL 460 + SourceExtension "GL_EXT_ray_tracing" + SourceExtension "GL_NV_ray_tracing_motion_blur" + Name 4 "main" + Name 8 "time" + Name 10 "gl_CurrentRayTimeNV" + Name 16 "accEXT" + Name 32 "localPayloadEXT" + Decorate 10(gl_CurrentRayTimeNV) BuiltIn CurrentRayTimeNV + Decorate 16(accEXT) DescriptorSet 0 + Decorate 16(accEXT) Binding 0 + Decorate 32(localPayloadEXT) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeFloat 32 + 7: TypePointer Function 6(float) + 9: TypePointer Input 6(float) +10(gl_CurrentRayTimeNV): 9(ptr) Variable Input + 12: 6(float) Constant 1056964608 + 14: TypeAccelerationStructureKHR + 15: TypePointer UniformConstant 14 + 16(accEXT): 15(ptr) Variable UniformConstant + 18: TypeInt 32 0 + 19: 18(int) Constant 0 + 20: 18(int) Constant 1 + 21: 18(int) Constant 2 + 22: 18(int) Constant 3 + 23: TypeVector 6(float) 3 + 24: 23(fvec3) ConstantComposite 12 12 12 + 25: 6(float) Constant 1065353216 + 26: 23(fvec3) ConstantComposite 25 25 25 + 27: 6(float) Constant 1061158912 + 28: TypeInt 32 1 + 29: 28(int) Constant 0 + 30: TypeVector 6(float) 4 + 31: TypePointer RayPayloadKHR 30(fvec4) +32(localPayloadEXT): 31(ptr) Variable RayPayloadKHR + 4(main): 2 Function None 3 + 5: Label + 8(time): 7(ptr) Variable Function + 11: 6(float) Load 10(gl_CurrentRayTimeNV) + 13: 6(float) FAdd 11 12 + Store 8(time) 13 + 17: 14 Load 16(accEXT) + TraceRayMotionNV 17 19 20 21 22 19 24 12 26 27 25 32(localPayloadEXT) + Return + FunctionEnd diff --git a/Test/baseResults/spv.RayGenShaderMotion.rgen.out b/Test/baseResults/spv.RayGenShaderMotion.rgen.out new file mode 100644 index 00000000..f9b9fa5f --- /dev/null +++ b/Test/baseResults/spv.RayGenShaderMotion.rgen.out @@ -0,0 +1,81 @@ +spv.RayGenShaderMotion.rgen +// Module Version 10400 +// Generated by (magic number): 8000a +// Id's are bound by 47 + + Capability RayTracingKHR + Capability RayTracingMotionBlurNV + Extension "SPV_KHR_ray_tracing" + Extension "SPV_NV_ray_tracing_motion_blur" + 1: ExtInstImport "GLSL.std.450" + MemoryModel Logical GLSL450 + EntryPoint RayGenerationKHR 4 "main" 11 21 29 46 + Source GLSL 460 + SourceExtension "GL_EXT_ray_tracing" + SourceExtension "GL_NV_ray_tracing_motion_blur" + Name 4 "main" + Name 8 "lx" + Name 11 "gl_LaunchIDEXT" + Name 16 "ly" + Name 20 "sx" + Name 21 "gl_LaunchSizeEXT" + Name 24 "sy" + Name 29 "accEXT" + Name 46 "payloadEXT" + Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR + Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR + Decorate 29(accEXT) DescriptorSet 0 + Decorate 29(accEXT) Binding 0 + Decorate 46(payloadEXT) Location 0 + 2: TypeVoid + 3: TypeFunction 2 + 6: TypeInt 32 0 + 7: TypePointer Function 6(int) + 9: TypeVector 6(int) 3 + 10: TypePointer Input 9(ivec3) +11(gl_LaunchIDEXT): 10(ptr) Variable Input + 12: 6(int) Constant 0 + 13: TypePointer Input 6(int) + 17: 6(int) Constant 1 +21(gl_LaunchSizeEXT): 10(ptr) Variable Input + 27: TypeAccelerationStructureKHR + 28: TypePointer UniformConstant 27 + 29(accEXT): 28(ptr) Variable UniformConstant + 35: TypeFloat 32 + 36: TypeVector 35(float) 3 + 37: 35(float) Constant 1056964608 + 38: 36(fvec3) ConstantComposite 37 37 37 + 39: 35(float) Constant 1065353216 + 40: 36(fvec3) ConstantComposite 39 39 39 + 41: 35(float) Constant 1061158912 + 42: TypeInt 32 1 + 43: 42(int) Constant 0 + 44: TypeVector 35(float) 4 + 45: TypePointer RayPayloadKHR 44(fvec4) + 46(payloadEXT): 45(ptr) Variable RayPayloadKHR + 4(main): 2 Function None 3 + 5: Label + 8(lx): 7(ptr) Variable Function + 16(ly): 7(ptr) Variable Function + 20(sx): 7(ptr) Variable Function + 24(sy): 7(ptr) Variable Function + 14: 13(ptr) AccessChain 11(gl_LaunchIDEXT) 12 + 15: 6(int) Load 14 + Store 8(lx) 15 + 18: 13(ptr) AccessChain 11(gl_LaunchIDEXT) 17 + 19: 6(int) Load 18 + Store 16(ly) 19 + 22: 13(ptr) AccessChain 21(gl_LaunchSizeEXT) 12 + 23: 6(int) Load 22 + Store 20(sx) 23 + 25: 13(ptr) AccessChain 21(gl_LaunchSizeEXT) 17 + 26: 6(int) Load 25 + Store 24(sy) 26 + 30: 27 Load 29(accEXT) + 31: 6(int) Load 8(lx) + 32: 6(int) Load 16(ly) + 33: 6(int) Load 20(sx) + 34: 6(int) Load 24(sy) + TraceRayMotionNV 30 31 32 33 34 12 38 37 40 41 37 46(payloadEXT) + Return + FunctionEnd diff --git a/Test/spv.AnyHitShaderMotion.rahit b/Test/spv.AnyHitShaderMotion.rahit new file mode 100644 index 00000000..6972577a --- /dev/null +++ b/Test/spv.AnyHitShaderMotion.rahit @@ -0,0 +1,6 @@ +#version 460 +#extension GL_NV_ray_tracing_motion_blur : enable +void main() +{ + float time = gl_CurrentRayTimeNV + 0.5f; +} diff --git a/Test/spv.ClosestHitShaderMotion.rchit b/Test/spv.ClosestHitShaderMotion.rchit new file mode 100644 index 00000000..42a18382 --- /dev/null +++ b/Test/spv.ClosestHitShaderMotion.rchit @@ -0,0 +1,10 @@ +#version 460 +#extension GL_EXT_ray_tracing : enable +#extension GL_NV_ray_tracing_motion_blur : enable +layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT; +layout(location = 0) rayPayloadInEXT vec4 incomingPayloadEXT; +void main() +{ + float time = gl_CurrentRayTimeNV + 0.5f; + traceRayMotionNV(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1.0, 0); +} diff --git a/Test/spv.IntersectShaderMotion.rint b/Test/spv.IntersectShaderMotion.rint new file mode 100644 index 00000000..6972577a --- /dev/null +++ b/Test/spv.IntersectShaderMotion.rint @@ -0,0 +1,6 @@ +#version 460 +#extension GL_NV_ray_tracing_motion_blur : enable +void main() +{ + float time = gl_CurrentRayTimeNV + 0.5f; +} diff --git a/Test/spv.MissShaderMotion.rmiss b/Test/spv.MissShaderMotion.rmiss new file mode 100644 index 00000000..3a3dcb16 --- /dev/null +++ b/Test/spv.MissShaderMotion.rmiss @@ -0,0 +1,10 @@ +#version 460 +#extension GL_EXT_ray_tracing : enable +#extension GL_NV_ray_tracing_motion_blur : enable +layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT; +layout(location = 0) rayPayloadEXT vec4 localPayloadEXT; +void main() +{ + float time = gl_CurrentRayTimeNV + 0.5f; + traceRayMotionNV(accEXT, 0u, 1u, 2u, 3u, 0u, vec3(0.5f), 0.5f, vec3(1.0f), 0.75f, 1.0f, 0); +} diff --git a/Test/spv.RayGenShaderMotion.rgen b/Test/spv.RayGenShaderMotion.rgen new file mode 100644 index 00000000..c38fffe5 --- /dev/null +++ b/Test/spv.RayGenShaderMotion.rgen @@ -0,0 +1,13 @@ +#version 460 +#extension GL_EXT_ray_tracing : enable +#extension GL_NV_ray_tracing_motion_blur : enable +layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT; +layout(location = 0) rayPayloadEXT vec4 payloadEXT; +void main() +{ + uint lx = gl_LaunchIDEXT.x; + uint ly = gl_LaunchIDEXT.y; + uint sx = gl_LaunchSizeEXT.x; + uint sy = gl_LaunchSizeEXT.y; + traceRayMotionNV(accEXT, lx, ly, sx, sy, 0u, vec3(0.5), 0.5f, vec3(1.0), 0.75f, 0.5, 0); +} diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h index 1d9da12d..c8203c22 100644 --- a/glslang/Include/BaseTypes.h +++ b/glslang/Include/BaseTypes.h @@ -270,6 +270,7 @@ enum TBuiltInVariable { EbvWorldToObject, EbvWorldToObject3x4, EbvIncomingRayFlags, + EbvCurrentRayTimeNV, // barycentrics EbvBaryCoordNV, EbvBaryCoordNoPerspNV, @@ -475,6 +476,7 @@ __inline const char* GetBuiltInVariableString(TBuiltInVariable v) case EbvIncomingRayFlags: return "IncomingRayFlagsNV"; case EbvObjectToWorld: return "ObjectToWorldNV"; case EbvWorldToObject: return "WorldToObjectNV"; + case EbvCurrentRayTimeNV: return "CurrentRayTimeNV"; case EbvBaryCoordNV: return "BaryCoordNV"; case EbvBaryCoordNoPerspNV: return "BaryCoordNoPerspNV"; diff --git a/glslang/Include/intermediate.h b/glslang/Include/intermediate.h index 172c09cf..1e6ab4aa 100644 --- a/glslang/Include/intermediate.h +++ b/glslang/Include/intermediate.h @@ -926,6 +926,7 @@ enum TOperator { EOpMul32x16, EOpTraceNV, + EOpTraceRayMotionNV, EOpTraceKHR, EOpReportIntersection, EOpIgnoreIntersectionNV, diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp index a79925d3..08d0dc7c 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -4661,7 +4661,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); } - // Builtins for GL_NV_ray_tracing/GL_EXT_ray_tracing/GL_EXT_ray_query + // Builtins for GL_NV_ray_tracing/GL_NV_ray_tracing_motion_blur/GL_EXT_ray_tracing/GL_EXT_ray_query if (profile != EEsProfile && version >= 460) { commonBuiltins.append("void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);" "void rayQueryTerminateEXT(rayQueryEXT);" @@ -4690,6 +4690,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV stageBuiltins[EShLangRayGen].append( "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" @@ -4704,12 +4705,14 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "\n"); stageBuiltins[EShLangClosestHit].append( "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" "\n"); stageBuiltins[EShLangMiss].append( "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" + "void traceRayMotionNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,float,int);" "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);" "void executeCallableNV(uint, int);" "void executeCallableEXT(uint, int);" @@ -5918,6 +5921,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in mat3x4 gl_WorldToObject3x4EXT;" "in uint gl_IncomingRayFlagsNV;" "in uint gl_IncomingRayFlagsEXT;" + "in float gl_CurrentRayTimeNV;" "\n"; const char *hitDecls = "in uvec3 gl_LaunchIDNV;" @@ -5953,6 +5957,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in mat3x4 gl_WorldToObject3x4EXT;" "in uint gl_IncomingRayFlagsNV;" "in uint gl_IncomingRayFlagsEXT;" + "in float gl_CurrentRayTimeNV;" "\n"; const char *missDecls = "in uvec3 gl_LaunchIDNV;" @@ -5971,6 +5976,7 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "in float gl_RayTmaxEXT;" "in uint gl_IncomingRayFlagsNV;" "in uint gl_IncomingRayFlagsEXT;" + "in float gl_CurrentRayTimeNV;" "\n"; const char *callableDecls = @@ -8789,11 +8795,13 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setVariableExtensions("gl_WorldToObject3x4EXT", 1, &E_GL_EXT_ray_tracing); symbolTable.setVariableExtensions("gl_IncomingRayFlagsNV", 1, &E_GL_NV_ray_tracing); symbolTable.setVariableExtensions("gl_IncomingRayFlagsEXT", 1, &E_GL_EXT_ray_tracing); + symbolTable.setVariableExtensions("gl_CurrentRayTimeNV", 1, &E_GL_NV_ray_tracing_motion_blur); symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group); symbolTable.setFunctionExtensions("traceNV", 1, &E_GL_NV_ray_tracing); + symbolTable.setFunctionExtensions("traceRayMotionNV", 1, &E_GL_NV_ray_tracing_motion_blur); symbolTable.setFunctionExtensions("traceRayEXT", 1, &E_GL_EXT_ray_tracing); symbolTable.setFunctionExtensions("reportIntersectionNV", 1, &E_GL_NV_ray_tracing); symbolTable.setFunctionExtensions("reportIntersectionEXT", 1, &E_GL_EXT_ray_tracing); @@ -8837,6 +8845,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion BuiltInVariable("gl_IncomingRayFlagsNV", EbvIncomingRayFlags, symbolTable); BuiltInVariable("gl_IncomingRayFlagsEXT", EbvIncomingRayFlags, symbolTable); BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable); + BuiltInVariable("gl_CurrentRayTimeNV", EbvCurrentRayTimeNV, symbolTable); // GL_ARB_shader_ballot symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot); @@ -9668,6 +9677,7 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion case EShLangMiss: if (profile != EEsProfile && version >= 460) { symbolTable.relateToOperator("traceNV", EOpTraceNV); + symbolTable.relateToOperator("traceRayMotionNV", EOpTraceRayMotionNV); symbolTable.relateToOperator("traceRayEXT", EOpTraceKHR); symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV); symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR); diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp index 35a53e42..b957bb87 100644 --- a/glslang/MachineIndependent/ParseHelper.cpp +++ b/glslang/MachineIndependent/ParseHelper.cpp @@ -2308,6 +2308,10 @@ void TParseContext::builtInOpCheck(const TSourceLoc& loc, const TFunction& fnCan if (!(*argp)[10]->getAsConstantUnion()) error(loc, "argument must be compile-time constant", "payload number", "a"); break; + case EOpTraceRayMotionNV: + if (!(*argp)[11]->getAsConstantUnion()) + error(loc, "argument must be compile-time constant", "payload number", "a"); + break; case EOpTraceKHR: if (!(*argp)[10]->getAsConstantUnion()) error(loc, "argument must be compile-time constant", "payload number", "a"); diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp index 2698dd91..832fb7a5 100644 --- a/glslang/MachineIndependent/Versions.cpp +++ b/glslang/MachineIndependent/Versions.cpp @@ -165,7 +165,9 @@ void TParseVersions::initializeExtensionBehavior() EShTargetLanguageVersion minSpvVersion; } extensionData; - const extensionData exts[] = { {E_GL_EXT_ray_tracing, EShTargetSpv_1_4} }; + const extensionData exts[] = { {E_GL_EXT_ray_tracing, EShTargetSpv_1_4}, + {E_GL_NV_ray_tracing_motion_blur, EShTargetSpv_1_4} + }; for (size_t ii = 0; ii < sizeof(exts) / sizeof(exts[0]); ii++) { // Add only extensions which require > spv1.0 to save space in map @@ -281,6 +283,7 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_NV_shader_subgroup_partitioned] = EBhDisable; extensionBehavior[E_GL_NV_shading_rate_image] = EBhDisable; extensionBehavior[E_GL_NV_ray_tracing] = EBhDisable; + extensionBehavior[E_GL_NV_ray_tracing_motion_blur] = EBhDisable; extensionBehavior[E_GL_NV_fragment_shader_barycentric] = EBhDisable; extensionBehavior[E_GL_NV_compute_shader_derivatives] = EBhDisable; extensionBehavior[E_GL_NV_shader_texture_footprint] = EBhDisable; @@ -518,6 +521,7 @@ void TParseVersions::getPreamble(std::string& preamble) "#define GL_NV_shader_subgroup_partitioned 1\n" "#define GL_NV_shading_rate_image 1\n" "#define GL_NV_ray_tracing 1\n" + "#define GL_NV_ray_tracing_motion_blur 1\n" "#define GL_NV_fragment_shader_barycentric 1\n" "#define GL_NV_compute_shader_derivatives 1\n" "#define GL_NV_shader_texture_footprint 1\n" diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h index 2e8cc298..878c6f8f 100644 --- a/glslang/MachineIndependent/Versions.h +++ b/glslang/MachineIndependent/Versions.h @@ -247,6 +247,7 @@ const char* const E_GL_NV_shader_noperspective_interpolation = "GL_NV_shader_ const char* const E_GL_NV_shader_subgroup_partitioned = "GL_NV_shader_subgroup_partitioned"; const char* const E_GL_NV_shading_rate_image = "GL_NV_shading_rate_image"; const char* const E_GL_NV_ray_tracing = "GL_NV_ray_tracing"; +const char* const E_GL_NV_ray_tracing_motion_blur = "GL_NV_ray_tracing_motion_blur"; const char* const E_GL_NV_fragment_shader_barycentric = "GL_NV_fragment_shader_barycentric"; const char* const E_GL_NV_compute_shader_derivatives = "GL_NV_compute_shader_derivatives"; const char* const E_GL_NV_shader_texture_footprint = "GL_NV_shader_texture_footprint"; diff --git a/glslang/MachineIndependent/intermOut.cpp b/glslang/MachineIndependent/intermOut.cpp index 105adc48..a0fade16 100644 --- a/glslang/MachineIndependent/intermOut.cpp +++ b/glslang/MachineIndependent/intermOut.cpp @@ -1089,6 +1089,7 @@ bool TOutputTraverser::visitAggregate(TVisit /* visit */, TIntermAggregate* node case EOpSubpassLoadMS: out.debug << "subpassLoadMS"; break; case EOpTraceNV: out.debug << "traceNV"; break; + case EOpTraceRayMotionNV: out.debug << "traceRayMotionNV"; break; case EOpTraceKHR: out.debug << "traceRayKHR"; break; case EOpReportIntersection: out.debug << "reportIntersectionNV"; break; case EOpIgnoreIntersectionNV: out.debug << "ignoreIntersectionNV"; break; diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index a7e1a3ef..29740f31 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -77,6 +77,7 @@ using HlslIoMap = GlslangTest<::testing::TestWithParam>; using GlslIoMap = GlslangTest<::testing::TestWithParam>; using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam>; using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam>; +using CompileVulkanToSpirv14TestNV = GlslangTest<::testing::TestWithParam>; using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::testing::TestWithParam>; // Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully @@ -204,6 +205,13 @@ TEST_P(CompileVulkanToSpirvTestNV, FromFile) Target::Spv); } +TEST_P(CompileVulkanToSpirv14TestNV, FromFile) +{ + loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), + Source::GLSL, Semantics::Vulkan, glslang::EShTargetVulkan_1_1, glslang::EShTargetSpv_1_4, + Target::Spv); +} + TEST_P(CompileUpgradeTextureToSampledTextureAndDropSamplersTest, FromFile) { loadCompileUpgradeTextureToSampledTextureAndDropSamplersAndCheck(GlobalTestSettings.testRoot, @@ -765,6 +773,17 @@ INSTANTIATE_TEST_SUITE_P( FileNameAsCustomTestSuffix ); +INSTANTIATE_TEST_SUITE_P( + Glsl, CompileVulkanToSpirv14TestNV, + ::testing::ValuesIn(std::vector({ + "spv.RayGenShaderMotion.rgen", + "spv.IntersectShaderMotion.rint", + "spv.AnyHitShaderMotion.rahit", + "spv.ClosestHitShaderMotion.rchit", + "spv.MissShaderMotion.rmiss", +})), +FileNameAsCustomTestSuffix +); INSTANTIATE_TEST_SUITE_P( Glsl, CompileUpgradeTextureToSampledTextureAndDropSamplersTest, ::testing::ValuesIn(std::vector({