Merge pull request #2718 from ZhiqianXia/AtomicOpsARB
Support the atomic_counter_xxxARB built-in functons at #extension GL_ARB_shader_atomic_counter_ops.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0600516..c318eef 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -138,7 +138,8 @@
if(WIN32)
set(CMAKE_DEBUG_POSTFIX "d")
- if(MSVC)
+ option(OVERRIDE_MSVCCRT "Overrides runtime of MSVC " ON)
+ if(MSVC AND OVERRIDE_MSVCCRT)
include(ChooseMSVCCRT.cmake)
endif(MSVC)
add_definitions(-DGLSLANG_OSINCLUDE_WIN32)
@@ -197,7 +198,7 @@
if(ENABLE_EXCEPTIONS)
add_compile_options(/EHsc) # Enable Exceptions
else()
- string(REGEX REPLACE /EHsc "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # Try to remove default /EHsc cxx_flag
+ string(REGEX REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # Try to remove default /EHsc cxx_flag
add_compile_options(/D_HAS_EXCEPTIONS=0)
endif()
endif()
diff --git a/SPIRV/GLSL.ext.NV.h b/SPIRV/GLSL.ext.NV.h
index 50146da..93c98bf 100644
--- a/SPIRV/GLSL.ext.NV.h
+++ b/SPIRV/GLSL.ext.NV.h
@@ -69,6 +69,9 @@
//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 c8a73a6..c323bcd 100644
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1033,6 +1033,10 @@
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 @@
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 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 @@
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/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
index 6751dec..e83306e 100644
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -2812,6 +2812,7 @@
accessChain.component == NoResult) {
for (unsigned int i = 0; i < accessChain.swizzle.size(); ++i) {
accessChain.indexChain.push_back(makeUintConstant(accessChain.swizzle[i]));
+ accessChain.instr = NoResult;
Id base = collapseAccessChain();
addDecoration(base, nonUniform);
diff --git a/SPIRV/doc.cpp b/SPIRV/doc.cpp
index 31b20a1..dbdf707 100644
--- a/SPIRV/doc.cpp
+++ b/SPIRV/doc.cpp
@@ -426,6 +426,7 @@
case BuiltInSMCountNV: return "SMCountNV";
case BuiltInWarpIDNV: return "WarpIDNV";
case BuiltInSMIDNV: return "SMIDNV";
+ case BuiltInCurrentRayTimeNV: return "CurrentRayTimeNV";
default: return "Bad";
}
@@ -916,6 +917,7 @@
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 @@
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 @@
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 317db81..e0fe249 100644
--- a/SPIRV/spirv.hpp
+++ b/SPIRV/spirv.hpp
@@ -652,6 +652,7 @@
BuiltInHitTNV = 5332,
BuiltInHitKindKHR = 5333,
BuiltInHitKindNV = 5333,
+ BuiltInCurrentRayTimeNV = 5334,
BuiltInIncomingRayFlagsKHR = 5351,
BuiltInIncomingRayFlagsNV = 5351,
BuiltInRayGeometryIndexKHR = 5352,
@@ -988,6 +989,7 @@
CapabilityStorageTexelBufferArrayNonUniformIndexing = 5312,
CapabilityStorageTexelBufferArrayNonUniformIndexingEXT = 5312,
CapabilityRayTracingNV = 5340,
+ CapabilityRayTracingMotionBlurNV = 5341,
CapabilityVulkanMemoryModel = 5345,
CapabilityVulkanMemoryModelKHR = 5345,
CapabilityVulkanMemoryModelDeviceScope = 5346,
@@ -1503,6 +1505,8 @@
OpIgnoreIntersectionNV = 5335,
OpTerminateRayNV = 5336,
OpTraceNV = 5337,
+ OpTraceMotionNV = 5338,
+ OpTraceRayMotionNV = 5339,
OpTypeAccelerationStructureKHR = 5341,
OpTypeAccelerationStructureNV = 5341,
OpExecuteCallableNV = 5344,
@@ -2090,6 +2094,8 @@
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 0000000..f9e1e1b
--- /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 0000000..e89abb4
--- /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 0000000..f77c9a8
--- /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 0000000..2f18338
--- /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 0000000..f9b9fa5
--- /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/baseResults/spv.invariantAll.vert.out b/Test/baseResults/spv.invariantAll.vert.out
new file mode 100644
index 0000000..ec5ad30
--- /dev/null
+++ b/Test/baseResults/spv.invariantAll.vert.out
@@ -0,0 +1,55 @@
+spv.invariantAll.vert
+// Module Version 10000
+// Generated by (magic number): 8000a
+// Id's are bound by 25
+
+ Capability Shader
+ 1: ExtInstImport "GLSL.std.450"
+ MemoryModel Logical GLSL450
+ EntryPoint Vertex 4 "main" 13 17
+ Source GLSL 450
+ Name 4 "main"
+ Name 11 "gl_PerVertex"
+ MemberName 11(gl_PerVertex) 0 "gl_Position"
+ MemberName 11(gl_PerVertex) 1 "gl_PointSize"
+ MemberName 11(gl_PerVertex) 2 "gl_ClipDistance"
+ MemberName 11(gl_PerVertex) 3 "gl_CullDistance"
+ Name 13 ""
+ Name 17 "v"
+ MemberDecorate 11(gl_PerVertex) 0 Invariant
+ MemberDecorate 11(gl_PerVertex) 0 BuiltIn Position
+ MemberDecorate 11(gl_PerVertex) 1 Invariant
+ MemberDecorate 11(gl_PerVertex) 1 BuiltIn PointSize
+ MemberDecorate 11(gl_PerVertex) 2 Invariant
+ MemberDecorate 11(gl_PerVertex) 2 BuiltIn ClipDistance
+ MemberDecorate 11(gl_PerVertex) 3 Invariant
+ MemberDecorate 11(gl_PerVertex) 3 BuiltIn CullDistance
+ Decorate 11(gl_PerVertex) Block
+ Decorate 17(v) Location 0
+ Decorate 17(v) Invariant
+ 2: TypeVoid
+ 3: TypeFunction 2
+ 6: TypeFloat 32
+ 7: TypeVector 6(float) 4
+ 8: TypeInt 32 0
+ 9: 8(int) Constant 1
+ 10: TypeArray 6(float) 9
+11(gl_PerVertex): TypeStruct 7(fvec4) 6(float) 10 10
+ 12: TypePointer Output 11(gl_PerVertex)
+ 13: 12(ptr) Variable Output
+ 14: TypeInt 32 1
+ 15: 14(int) Constant 0
+ 16: TypePointer Output 6(float)
+ 17(v): 16(ptr) Variable Output
+ 20: 6(float) Constant 0
+ 21: 6(float) Constant 1065353216
+ 23: TypePointer Output 7(fvec4)
+ 4(main): 2 Function None 3
+ 5: Label
+ 18: 6(float) Load 17(v)
+ 19: 6(float) Load 17(v)
+ 22: 7(fvec4) CompositeConstruct 18 19 20 21
+ 24: 23(ptr) AccessChain 13 15
+ Store 24 22
+ Return
+ FunctionEnd
diff --git a/Test/spv.AnyHitShaderMotion.rahit b/Test/spv.AnyHitShaderMotion.rahit
new file mode 100644
index 0000000..6972577
--- /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 0000000..42a1838
--- /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 0000000..6972577
--- /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 0000000..3a3dcb1
--- /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 0000000..c38fffe
--- /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/Test/spv.invariantAll.vert b/Test/spv.invariantAll.vert
new file mode 100644
index 0000000..e094aa0
--- /dev/null
+++ b/Test/spv.invariantAll.vert
@@ -0,0 +1,10 @@
+#version 450 core
+#pragma STDGL invariant(all)
+
+layout(location=0) out highp float v;
+
+void main()
+{
+ gl_Position = vec4(v, v, 0, 1);
+}
+
diff --git a/Test/spv.scalarlayout.frag b/Test/spv.scalarlayout.frag
index c7ecf50..e0e1b18 100644
--- a/Test/spv.scalarlayout.frag
+++ b/Test/spv.scalarlayout.frag
@@ -27,6 +27,8 @@
S i[2]; // offset = 160 (aligned to multiple of 8) stride = 48
};
+layout (std430) uniform;
+
void main()
{
}
diff --git a/glslang/Include/BaseTypes.h b/glslang/Include/BaseTypes.h
index 1d9da12..c8203c2 100644
--- a/glslang/Include/BaseTypes.h
+++ b/glslang/Include/BaseTypes.h
@@ -270,6 +270,7 @@
EbvWorldToObject,
EbvWorldToObject3x4,
EbvIncomingRayFlags,
+ EbvCurrentRayTimeNV,
// barycentrics
EbvBaryCoordNV,
EbvBaryCoordNoPerspNV,
@@ -475,6 +476,7 @@
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 172c09c..1e6ab4a 100644
--- a/glslang/Include/intermediate.h
+++ b/glslang/Include/intermediate.h
@@ -926,6 +926,7 @@
EOpMul32x16,
EOpTraceNV,
+ EOpTraceRayMotionNV,
EOpTraceKHR,
EOpReportIntersection,
EOpIgnoreIntersectionNV,
diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp
index d461ad3..823406c 100644
--- a/glslang/MachineIndependent/Initialize.cpp
+++ b/glslang/MachineIndependent/Initialize.cpp
@@ -4677,7 +4677,7 @@
"\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);"
@@ -4706,6 +4706,7 @@
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);"
@@ -4720,12 +4721,14 @@
"\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);"
@@ -5934,6 +5937,7 @@
"in mat3x4 gl_WorldToObject3x4EXT;"
"in uint gl_IncomingRayFlagsNV;"
"in uint gl_IncomingRayFlagsEXT;"
+ "in float gl_CurrentRayTimeNV;"
"\n";
const char *hitDecls =
"in uvec3 gl_LaunchIDNV;"
@@ -5969,6 +5973,7 @@
"in mat3x4 gl_WorldToObject3x4EXT;"
"in uint gl_IncomingRayFlagsNV;"
"in uint gl_IncomingRayFlagsEXT;"
+ "in float gl_CurrentRayTimeNV;"
"\n";
const char *missDecls =
"in uvec3 gl_LaunchIDNV;"
@@ -5987,6 +5992,7 @@
"in float gl_RayTmaxEXT;"
"in uint gl_IncomingRayFlagsNV;"
"in uint gl_IncomingRayFlagsEXT;"
+ "in float gl_CurrentRayTimeNV;"
"\n";
const char *callableDecls =
@@ -8818,11 +8824,13 @@
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);
@@ -8866,6 +8874,7 @@
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);
@@ -9709,6 +9718,7 @@
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 d2ad355..b957bb8 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -327,6 +327,16 @@
block.getQualifier().layoutMatrix = ElmRowMajor;
}
+void TParseContext::setInvariant(const TSourceLoc& loc, const char* builtin) {
+ TSymbol* symbol = symbolTable.find(builtin);
+ if (symbol && symbol->getType().getQualifier().isPipeOutput()) {
+ if (intermediate.inIoAccessed(builtin))
+ warn(loc, "changing qualification after use", "invariant", builtin);
+ TSymbol* csymbol = symbolTable.copyUp(symbol);
+ csymbol->getWritableType().getQualifier().invariant = true;
+ }
+}
+
void TParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>& tokens)
{
#ifndef GLSLANG_WEB
@@ -404,8 +414,33 @@
intermediate.setUseVariablePointers();
} else if (tokens[0].compare("once") == 0) {
warn(loc, "not implemented", "#pragma once", "");
- } else if (tokens[0].compare("glslang_binary_double_output") == 0)
+ } else if (tokens[0].compare("glslang_binary_double_output") == 0) {
intermediate.setBinaryDoubleOutput();
+ } else if (spvVersion.spv > 0 && tokens[0].compare("STDGL") == 0 &&
+ tokens[1].compare("invariant") == 0 && tokens[3].compare("all") == 0) {
+ intermediate.setInvariantAll();
+ // Set all builtin out variables invariant if declared
+ setInvariant(loc, "gl_Position");
+ setInvariant(loc, "gl_PointSize");
+ setInvariant(loc, "gl_ClipDistance");
+ setInvariant(loc, "gl_CullDistance");
+ setInvariant(loc, "gl_TessLevelOuter");
+ setInvariant(loc, "gl_TessLevelInner");
+ setInvariant(loc, "gl_PrimitiveID");
+ setInvariant(loc, "gl_Layer");
+ setInvariant(loc, "gl_ViewportIndex");
+ setInvariant(loc, "gl_FragDepth");
+ setInvariant(loc, "gl_SampleMask");
+ setInvariant(loc, "gl_ClipVertex");
+ setInvariant(loc, "gl_FrontColor");
+ setInvariant(loc, "gl_BackColor");
+ setInvariant(loc, "gl_FrontSecondaryColor");
+ setInvariant(loc, "gl_BackSecondaryColor");
+ setInvariant(loc, "gl_TexCoord");
+ setInvariant(loc, "gl_FogFragCoord");
+ setInvariant(loc, "gl_FragColor");
+ setInvariant(loc, "gl_FragData");
+ }
#endif
}
@@ -2273,6 +2308,10 @@
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");
@@ -3659,6 +3698,8 @@
profileRequires(loc, ENoProfile, 130, nullptr, "out for stage outputs");
profileRequires(loc, EEsProfile, 300, nullptr, "out for stage outputs");
qualifier.storage = EvqVaryingOut;
+ if (intermediate.isInvariantAll())
+ qualifier.invariant = true;
break;
case EvqInOut:
qualifier.storage = EvqVaryingIn;
@@ -3675,7 +3716,7 @@
if (blockName == nullptr &&
qualifier.layoutPacking == ElpStd430)
{
- error(loc, "it is invalid to declare std430 qualifier on uniform", "", "");
+ requireExtensions(loc, 1, &E_GL_EXT_scalar_block_layout, "default std430 layout for uniform");
}
break;
default:
diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h
index c9e6334..de44884 100644
--- a/glslang/MachineIndependent/ParseHelper.h
+++ b/glslang/MachineIndependent/ParseHelper.h
@@ -241,6 +241,7 @@
// override this to set the language-specific name
virtual const char* getAtomicCounterBlockName() const { return ""; }
virtual void setAtomicCounterBlockDefaults(TType&) const {}
+ virtual void setInvariant(const TSourceLoc& loc, const char* builtin) {}
virtual void finalizeAtomicCounterBlockLayout(TVariable&) {}
bool isAtomicCounterBlock(const TSymbol& symbol) {
const TVariable* var = symbol.getAsVariable();
@@ -511,6 +512,7 @@
virtual const char* getAtomicCounterBlockName() const override;
virtual void finalizeAtomicCounterBlockLayout(TVariable&) override;
virtual void setAtomicCounterBlockDefaults(TType& block) const override;
+ virtual void setInvariant(const TSourceLoc& loc, const char* builtin) override;
public:
//
diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp
index b33e980..097ee84 100644
--- a/glslang/MachineIndependent/Versions.cpp
+++ b/glslang/MachineIndependent/Versions.cpp
@@ -165,7 +165,9 @@
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
@@ -282,6 +284,7 @@
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;
@@ -519,6 +522,7 @@
"#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 326a132..949a7a1 100644
--- a/glslang/MachineIndependent/Versions.h
+++ b/glslang/MachineIndependent/Versions.h
@@ -248,6 +248,7 @@
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 105adc4..a0fade1 100644
--- a/glslang/MachineIndependent/intermOut.cpp
+++ b/glslang/MachineIndependent/intermOut.cpp
@@ -1089,6 +1089,7 @@
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/glslang/MachineIndependent/linkValidate.cpp b/glslang/MachineIndependent/linkValidate.cpp
index 42b416d..9656e2e 100644
--- a/glslang/MachineIndependent/linkValidate.cpp
+++ b/glslang/MachineIndependent/linkValidate.cpp
@@ -316,6 +316,7 @@
MERGE_TRUE(useUnknownFormat);
MERGE_TRUE(hlslOffsets);
MERGE_TRUE(useStorageBuffer);
+ MERGE_TRUE(invariantAll);
MERGE_TRUE(hlslIoMapping);
// TODO: sourceFile
diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h
index 59d70e7..6aa9399 100644
--- a/glslang/MachineIndependent/localintermediate.h
+++ b/glslang/MachineIndependent/localintermediate.h
@@ -291,6 +291,7 @@
numEntryPoints(0), numErrors(0), numPushConstants(0), recursive(false),
invertY(false),
useStorageBuffer(false),
+ invariantAll(false),
nanMinMaxClamp(false),
depthReplacing(false),
uniqueId(0),
@@ -560,6 +561,8 @@
void setUseStorageBuffer() { useStorageBuffer = true; }
bool usingStorageBuffer() const { return useStorageBuffer; }
+ void setInvariantAll() { invariantAll = true; }
+ bool isInvariantAll() const { return invariantAll; }
void setDepthReplacing() { depthReplacing = true; }
bool isDepthReplacing() const { return depthReplacing; }
bool setLocalSize(int dim, int size)
@@ -1068,6 +1071,7 @@
bool recursive;
bool invertY;
bool useStorageBuffer;
+ bool invariantAll;
bool nanMinMaxClamp; // true if desiring min/max/clamp to favor non-NaN over NaN
bool depthReplacing;
int localSize[3];
diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp
index 98f0d7f..29740f3 100644
--- a/gtests/Spv.FromFile.cpp
+++ b/gtests/Spv.FromFile.cpp
@@ -77,6 +77,7 @@
using GlslIoMap = GlslangTest<::testing::TestWithParam<IoMapData>>;
using CompileVulkanToSpirvTestAMD = GlslangTest<::testing::TestWithParam<std::string>>;
using CompileVulkanToSpirvTestNV = GlslangTest<::testing::TestWithParam<std::string>>;
+using CompileVulkanToSpirv14TestNV = GlslangTest<::testing::TestWithParam<std::string>>;
using CompileUpgradeTextureToSampledTextureAndDropSamplersTest = GlslangTest<::testing::TestWithParam<std::string>>;
// Compiling GLSL to SPIR-V under Vulkan semantics. Expected to successfully
@@ -204,6 +205,13 @@
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,
@@ -364,6 +372,7 @@
"spv.intrinsicsSpirvLiteral.vert",
"spv.intrinsicsSpirvStorageClass.rchit",
"spv.intrinsicsSpirvType.rgen",
+ "spv.invariantAll.vert",
"spv.layer.tese",
"spv.layoutNested.vert",
"spv.length.frag",
@@ -765,6 +774,17 @@
);
INSTANTIATE_TEST_SUITE_P(
+ Glsl, CompileVulkanToSpirv14TestNV,
+ ::testing::ValuesIn(std::vector<std::string>({
+ "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<std::string>({
"spv.texture.sampler.transform.frag",
diff --git a/known_good.json b/known_good.json
index c6fd4ff..d40b91c 100644
--- a/known_good.json
+++ b/known_good.json
@@ -5,14 +5,14 @@
"site" : "github",
"subrepo" : "KhronosGroup/SPIRV-Tools",
"subdir" : "External/spirv-tools",
- "commit" : "5dd2f76918bb2d0d67628e338f60f724f3e02e13"
+ "commit" : "54524ffa6a1b5ab173ebff89fb31e4a21d365477"
},
{
"name" : "spirv-tools/external/spirv-headers",
"site" : "github",
"subrepo" : "KhronosGroup/SPIRV-Headers",
"subdir" : "External/spirv-tools/external/spirv-headers",
- "commit" : "07f259e68af3a540038fa32df522554e74f53ed5"
+ "commit" : "4cce109bcdb7fbb028d21230f07ea292a684bea1"
}
]
}