From 75de196cecab0d37faa0e3de30c5bf85ab4e43f6 Mon Sep 17 00:00:00 2001 From: alelenv <40001162+alelenv@users.noreply.github.com> Date: Wed, 8 Apr 2020 21:09:20 -0700 Subject: [PATCH] Add support for EXT_ray_flags_primitive_culling. (#2173) Fixes issue #2169. --- SPIRV/GlslangToSpv.cpp | 4 + Test/baseResults/rayQuery-allOps.comp.out | 118 +++++++++--------- .../spv.ext.ClosestHitShader_Errors.rchit.out | 3 +- .../baseResults/spv.ext.RayGenShader.rgen.out | 81 ++++++------ Test/rayQuery-allOps.comp | 4 +- Test/spv.ext.ClosestHitShader_Errors.rchit | 1 + Test/spv.ext.RayGenShader.rgen | 3 +- Test/spv.ext.RayGenShader_Errors.rgen | 1 + glslang/MachineIndependent/Initialize.cpp | 4 + glslang/MachineIndependent/Versions.cpp | 12 +- glslang/MachineIndependent/Versions.h | 1 + 11 files changed, 126 insertions(+), 106 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index d17c9664d6..51a761884b 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1448,6 +1448,10 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, builder.addExecutionMode(shaderEntry, spv::ExecutionModeXfb); } + if (sourceExtensions.find("GL_EXT_ray_flags_primitive_culling") != sourceExtensions.end()) { + builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingProvisionalKHR); + } + unsigned int mode; switch (glslangIntermediate->getStage()) { case EShLangVertex: diff --git a/Test/baseResults/rayQuery-allOps.comp.out b/Test/baseResults/rayQuery-allOps.comp.out index 01e86961be..2ac7cd392c 100644 --- a/Test/baseResults/rayQuery-allOps.comp.out +++ b/Test/baseResults/rayQuery-allOps.comp.out @@ -1,18 +1,19 @@ rayQuery-allOps.comp // Module Version 10000 // Generated by (magic number): 80008 -// Id's are bound by 257 +// Id's are bound by 258 Capability Shader Capability RayQueryProvisionalKHR + Capability RayTraversalPrimitiveCullingProvisionalKHR Extension "SPV_KHR_ray_query" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 EntryPoint GLCompute 4 "main" ExecutionMode 4 LocalSize 1 1 1 Source GLSL 460 + SourceExtension "GL_EXT_ray_flags_primitive_culling" SourceExtension "GL_EXT_ray_query" - SourceExtension "GL_NV_ray_tracing" Name 4 "main" Name 6 "doSomething(" Name 10 "Ray" @@ -34,16 +35,16 @@ rayQuery-allOps.comp Name 83 "_mat3x4" Name 143 "t" Name 156 "committedStatus" - Name 240 "o" - Name 242 "d" - Name 252 "Ray" - MemberName 252(Ray) 0 "pos" - MemberName 252(Ray) 1 "tmin" - MemberName 252(Ray) 2 "dir" - MemberName 252(Ray) 3 "tmax" - Name 254 "Rays" - MemberName 254(Rays) 0 "rays" - Name 256 "" + Name 241 "o" + Name 243 "d" + Name 253 "Ray" + MemberName 253(Ray) 0 "pos" + MemberName 253(Ray) 1 "tmin" + MemberName 253(Ray) 2 "dir" + MemberName 253(Ray) 3 "tmax" + Name 255 "Rays" + MemberName 255(Rays) 0 "rays" + Name 257 "" MemberDecorate 15(Log) 0 Offset 0 MemberDecorate 15(Log) 1 Offset 4 Decorate 15(Log) BufferBlock @@ -51,15 +52,15 @@ rayQuery-allOps.comp Decorate 17 Binding 0 Decorate 50(rtas) DescriptorSet 0 Decorate 50(rtas) Binding 1 - MemberDecorate 252(Ray) 0 Offset 0 - MemberDecorate 252(Ray) 1 Offset 12 - MemberDecorate 252(Ray) 2 Offset 16 - MemberDecorate 252(Ray) 3 Offset 28 - Decorate 253 ArrayStride 32 - MemberDecorate 254(Rays) 0 Offset 0 - Decorate 254(Rays) BufferBlock - Decorate 256 DescriptorSet 0 - Decorate 256 Binding 2 + MemberDecorate 253(Ray) 0 Offset 0 + MemberDecorate 253(Ray) 1 Offset 12 + MemberDecorate 253(Ray) 2 Offset 16 + MemberDecorate 253(Ray) 3 Offset 28 + Decorate 254 ArrayStride 32 + MemberDecorate 255(Rays) 0 Offset 0 + Decorate 255(Rays) BufferBlock + Decorate 257 DescriptorSet 0 + Decorate 257 Binding 2 2: TypeVoid 3: TypeFunction 2 8: TypeFloat 32 @@ -104,11 +105,12 @@ rayQuery-allOps.comp 144: 8(float) Constant 1056964608 175: 14(int) Constant 1 198: 14(int) Constant 2 - 252(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float) - 253: TypeRuntimeArray 252(Ray) - 254(Rays): TypeStruct 253 - 255: TypePointer Uniform 254(Rays) - 256: 255(ptr) Variable Uniform + 231: 14(int) Constant 256 + 253(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float) + 254: TypeRuntimeArray 253(Ray) + 255(Rays): TypeStruct 254 + 256: TypePointer Uniform 255(Rays) + 257: 256(ptr) Variable Uniform 4(main): 2 Function None 3 5: Label 43(ray): 25(ptr) Variable Function @@ -118,8 +120,8 @@ rayQuery-allOps.comp 83(_mat3x4): 82(ptr) Variable Function 143(t): 35(ptr) Variable Function 156(committedStatus): 68(ptr) Variable Function - 240(o): 29(ptr) Variable Function - 242(d): 29(ptr) Variable Function + 241(o): 29(ptr) Variable Function + 243(d): 29(ptr) Variable Function 44: 10(Ray) FunctionCall 12(makeRayDesc() Store 43(ray) 44 51: 48 Load 50(rtas) @@ -375,36 +377,36 @@ rayQuery-allOps.comp Branch 228 228: Label 230: 14(int) RayQueryGetRayFlagsKHR 47(rayQuery) - 231: 66(bool) UGreaterThan 230 20 - SelectionMerge 233 None - BranchConditional 231 232 233 - 232: Label - 234: 2 FunctionCall 6(doSomething() - Branch 233 - 233: Label - 235: 8(float) RayQueryGetRayTMinKHR 47(rayQuery) - 236: 66(bool) FOrdGreaterThan 235 27 - SelectionMerge 238 None - BranchConditional 236 237 238 - 237: Label - 239: 2 FunctionCall 6(doSomething() - Branch 238 - 238: Label - 241: 9(fvec3) RayQueryGetWorldRayOriginKHR 47(rayQuery) - Store 240(o) 241 - 243: 9(fvec3) RayQueryGetWorldRayDirectionKHR 47(rayQuery) - Store 242(d) 243 - 244: 35(ptr) AccessChain 240(o) 20 - 245: 8(float) Load 244 - 246: 35(ptr) AccessChain 242(d) 198 - 247: 8(float) Load 246 - 248: 66(bool) FOrdEqual 245 247 - SelectionMerge 250 None - BranchConditional 248 249 250 - 249: Label - 251: 2 FunctionCall 6(doSomething() - Branch 250 - 250: Label + 232: 66(bool) UGreaterThan 230 231 + SelectionMerge 234 None + BranchConditional 232 233 234 + 233: Label + 235: 2 FunctionCall 6(doSomething() + Branch 234 + 234: Label + 236: 8(float) RayQueryGetRayTMinKHR 47(rayQuery) + 237: 66(bool) FOrdGreaterThan 236 27 + SelectionMerge 239 None + BranchConditional 237 238 239 + 238: Label + 240: 2 FunctionCall 6(doSomething() + Branch 239 + 239: Label + 242: 9(fvec3) RayQueryGetWorldRayOriginKHR 47(rayQuery) + Store 241(o) 242 + 244: 9(fvec3) RayQueryGetWorldRayDirectionKHR 47(rayQuery) + Store 243(d) 244 + 245: 35(ptr) AccessChain 241(o) 20 + 246: 8(float) Load 245 + 247: 35(ptr) AccessChain 243(d) 198 + 248: 8(float) Load 247 + 249: 66(bool) FOrdEqual 246 248 + SelectionMerge 251 None + BranchConditional 249 250 251 + 250: Label + 252: 2 FunctionCall 6(doSomething() + Branch 251 + 251: Label Return FunctionEnd 6(doSomething(): 2 Function None 3 diff --git a/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out b/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out index 2dc43b961f..6c87d1cadc 100644 --- a/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out +++ b/Test/baseResults/spv.ext.ClosestHitShader_Errors.rchit.out @@ -3,7 +3,8 @@ ERROR: 0:8: 'assign' : l-value required "payload" (cannot modify hitAttributeNV ERROR: 0:9: 'reportIntersectionEXT' : no matching overloaded function found ERROR: 0:10: 'terminateRayEXT' : no matching overloaded function found ERROR: 0:11: 'ignoreIntersectionEXT' : no matching overloaded function found -ERROR: 4 compilation errors. No code generated. +ERROR: 0:12: 'gl_RayFlagsSkipAABBEXT' : required extension not requested: GL_EXT_ray_flags_primitive_culling +ERROR: 5 compilation errors. No code generated. SPIR-V is not generated for failed compile or link diff --git a/Test/baseResults/spv.ext.RayGenShader.rgen.out b/Test/baseResults/spv.ext.RayGenShader.rgen.out index e2d06d4972..da16fa4534 100644 --- a/Test/baseResults/spv.ext.RayGenShader.rgen.out +++ b/Test/baseResults/spv.ext.RayGenShader.rgen.out @@ -1,14 +1,16 @@ spv.ext.RayGenShader.rgen // Module Version 10000 // Generated by (magic number): 80008 -// Id's are bound by 57 +// Id's are bound by 58 + Capability RayTraversalPrimitiveCullingProvisionalKHR Capability RayTracingProvisionalKHR Extension "SPV_KHR_ray_tracing" 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 EntryPoint RayGenerationKHR 4 "main" 11 21 Source GLSL 460 + SourceExtension "GL_EXT_ray_flags_primitive_culling" SourceExtension "GL_EXT_ray_tracing" Name 4 "main" Name 8 "lx" @@ -18,25 +20,25 @@ spv.ext.RayGenShader.rgen Name 21 "gl_LaunchSizeEXT" Name 24 "sy" Name 29 "accEXT0" - Name 37 "block" - MemberName 37(block) 0 "dir" - MemberName 37(block) 1 "origin" - Name 39 "" - Name 50 "accEXT1" - Name 53 "imageu" - Name 56 "payload" + Name 38 "block" + MemberName 38(block) 0 "dir" + MemberName 38(block) 1 "origin" + Name 40 "" + Name 51 "accEXT1" + Name 54 "imageu" + Name 57 "payload" Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR Decorate 29(accEXT0) DescriptorSet 0 Decorate 29(accEXT0) Binding 0 - MemberDecorate 37(block) 0 Offset 0 - MemberDecorate 37(block) 1 Offset 16 - Decorate 37(block) BufferBlock - Decorate 50(accEXT1) DescriptorSet 0 - Decorate 50(accEXT1) Binding 1 - Decorate 53(imageu) DescriptorSet 0 - Decorate 53(imageu) Binding 2 - Decorate 56(payload) Location 0 + MemberDecorate 38(block) 0 Offset 0 + MemberDecorate 38(block) 1 Offset 16 + Decorate 38(block) BufferBlock + Decorate 51(accEXT1) DescriptorSet 0 + Decorate 51(accEXT1) Binding 1 + Decorate 54(imageu) DescriptorSet 0 + Decorate 54(imageu) Binding 2 + Decorate 57(payload) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeInt 32 0 @@ -51,24 +53,25 @@ spv.ext.RayGenShader.rgen 27: TypeAccelerationStructureKHR 28: TypePointer UniformConstant 27 29(accEXT0): 28(ptr) Variable UniformConstant - 35: TypeFloat 32 - 36: TypeVector 35(float) 3 - 37(block): TypeStruct 36(fvec3) 36(fvec3) - 38: TypePointer ShaderRecordBufferKHR 37(block) - 39: 38(ptr) Variable ShaderRecordBufferKHR - 40: TypeInt 32 1 - 41: 40(int) Constant 1 - 42: TypePointer ShaderRecordBufferKHR 36(fvec3) - 45: 35(float) Constant 1056964608 - 46: 40(int) Constant 0 - 49: 35(float) Constant 1061158912 - 50(accEXT1): 28(ptr) Variable UniformConstant - 51: TypeImage 6(int) 2D nonsampled format:R32ui - 52: TypePointer UniformConstant 51 - 53(imageu): 52(ptr) Variable UniformConstant - 54: TypeVector 35(float) 4 - 55: TypePointer RayPayloadKHR 54(fvec4) - 56(payload): 55(ptr) Variable RayPayloadKHR + 35: 6(int) Constant 768 + 36: TypeFloat 32 + 37: TypeVector 36(float) 3 + 38(block): TypeStruct 37(fvec3) 37(fvec3) + 39: TypePointer ShaderRecordBufferKHR 38(block) + 40: 39(ptr) Variable ShaderRecordBufferKHR + 41: TypeInt 32 1 + 42: 41(int) Constant 1 + 43: TypePointer ShaderRecordBufferKHR 37(fvec3) + 46: 36(float) Constant 1056964608 + 47: 41(int) Constant 0 + 50: 36(float) Constant 1061158912 + 51(accEXT1): 28(ptr) Variable UniformConstant + 52: TypeImage 6(int) 2D nonsampled format:R32ui + 53: TypePointer UniformConstant 52 + 54(imageu): 53(ptr) Variable UniformConstant + 55: TypeVector 36(float) 4 + 56: TypePointer RayPayloadKHR 55(fvec4) + 57(payload): 56(ptr) Variable RayPayloadKHR 4(main): 2 Function None 3 5: Label 8(lx): 7(ptr) Variable Function @@ -92,10 +95,10 @@ spv.ext.RayGenShader.rgen 32: 6(int) Load 16(ly) 33: 6(int) Load 20(sx) 34: 6(int) Load 24(sy) - 43: 42(ptr) AccessChain 39 41 - 44: 36(fvec3) Load 43 - 47: 42(ptr) AccessChain 39 46 - 48: 36(fvec3) Load 47 - TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41 + 44: 43(ptr) AccessChain 40 42 + 45: 37(fvec3) Load 44 + 48: 43(ptr) AccessChain 40 47 + 49: 37(fvec3) Load 48 + TraceRayKHR 30 31 32 33 34 35 45 46 49 50 42 Return FunctionEnd diff --git a/Test/rayQuery-allOps.comp b/Test/rayQuery-allOps.comp index 9fdf0c0676..80f2593d67 100644 --- a/Test/rayQuery-allOps.comp +++ b/Test/rayQuery-allOps.comp @@ -1,6 +1,6 @@ #version 460 -#extension GL_NV_ray_tracing : enable #extension GL_EXT_ray_query : enable +#extension GL_EXT_ray_flags_primitive_culling : enable struct Ray { @@ -192,7 +192,7 @@ void main() doSomething(); } - if (rayQueryGetRayFlagsEXT(rayQuery) > 0) + if (rayQueryGetRayFlagsEXT(rayQuery) > gl_RayFlagsSkipTrianglesEXT) { doSomething(); } diff --git a/Test/spv.ext.ClosestHitShader_Errors.rchit b/Test/spv.ext.ClosestHitShader_Errors.rchit index fe484a1b14..05e05fe956 100644 --- a/Test/spv.ext.ClosestHitShader_Errors.rchit +++ b/Test/spv.ext.ClosestHitShader_Errors.rchit @@ -9,4 +9,5 @@ void main() reportIntersectionEXT(1.0, 1U); // ERROR, unsupported builtin in stage terminateRayEXT(); ignoreIntersectionEXT(); + bool e1 = gl_IncomingRayFlagsEXT == gl_RayFlagsSkipAABBEXT; } diff --git a/Test/spv.ext.RayGenShader.rgen b/Test/spv.ext.RayGenShader.rgen index cd2de69f7e..c92772ee62 100644 --- a/Test/spv.ext.RayGenShader.rgen +++ b/Test/spv.ext.RayGenShader.rgen @@ -1,5 +1,6 @@ #version 460 #extension GL_EXT_ray_tracing : enable +#extension GL_EXT_ray_flags_primitive_culling : enable layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT0; layout(binding = 1, set = 0) uniform accelerationStructureEXT accEXT1; // Unused layout(binding = 2, r32ui) shadercallcoherent uniform uimage2D imageu; @@ -16,5 +17,5 @@ void main() uint ly = gl_LaunchIDEXT.y; uint sx = gl_LaunchSizeEXT.x; uint sy = gl_LaunchSizeEXT.y; - traceRayEXT(accEXT0, lx, ly, sx, sy, 0u, origin, 0.5f, dir, 0.75f, 1); + traceRayEXT(accEXT0, lx, ly, sx, sy, gl_RayFlagsSkipTrianglesEXT | gl_RayFlagsSkipAABBEXT, origin, 0.5f, dir, 0.75f, 1); } diff --git a/Test/spv.ext.RayGenShader_Errors.rgen b/Test/spv.ext.RayGenShader_Errors.rgen index a480b19c33..349834242e 100644 --- a/Test/spv.ext.RayGenShader_Errors.rgen +++ b/Test/spv.ext.RayGenShader_Errors.rgen @@ -34,6 +34,7 @@ void main() mat4x3 e11 = gl_WorldToObjectEXT; // ERROR, unsupported builtin in stage float e12 = gl_HitTEXT; // ERROR, unsupported builtin in stage float e13 = gl_HitKindEXT; // ERROR, unsupported builtin in stage + int e14 = gl_RayFlagsSkipAABBEXT; // ERROR, unsupported builtin in stage reportIntersectionEXT(1.0, 1U); // ERROR, unsupported builtin in stage ignoreIntersectionEXT(); // ERROR, unsupported builtin in stage terminateRayEXT(); // ERROR, unsupported builtin in stage diff --git a/glslang/MachineIndependent/Initialize.cpp b/glslang/MachineIndependent/Initialize.cpp index 865eab2eef..344594af7b 100644 --- a/glslang/MachineIndependent/Initialize.cpp +++ b/glslang/MachineIndependent/Initialize.cpp @@ -5457,6 +5457,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV "const uint gl_RayFlagsCullOpaqueEXT = 64U;" "const uint gl_RayFlagsCullNoOpaqueNV = 128U;" "const uint gl_RayFlagsCullNoOpaqueEXT = 128U;" + "const uint gl_RayFlagsSkipTrianglesEXT = 256U;" + "const uint gl_RayFlagsSkipAABBEXT = 512U;" "const uint gl_HitKindFrontFacingTriangleEXT = 254U;" "const uint gl_HitKindBackFacingTriangleEXT = 255U;" "\n"; @@ -7572,6 +7574,8 @@ void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion symbolTable.setFunctionExtensions("rayQueryGetIntersectionWorldToObjectEXT", 1, &E_GL_EXT_ray_query); symbolTable.setFunctionExtensions("rayQueryGetWorldRayOriginEXT", 1, &E_GL_EXT_ray_query); symbolTable.setFunctionExtensions("rayQueryGetWorldRayDirectionEXT", 1, &E_GL_EXT_ray_query); + symbolTable.setVariableExtensions("gl_RayFlagsSkipAABBEXT", 1, &E_GL_EXT_ray_flags_primitive_culling); + symbolTable.setVariableExtensions("gl_RayFlagsSkipTrianglesEXT", 1, &E_GL_EXT_ray_flags_primitive_culling); } if ((profile != EEsProfile && version >= 130) || diff --git a/glslang/MachineIndependent/Versions.cpp b/glslang/MachineIndependent/Versions.cpp index 180f5b3d1f..d6b961d548 100644 --- a/glslang/MachineIndependent/Versions.cpp +++ b/glslang/MachineIndependent/Versions.cpp @@ -293,11 +293,12 @@ void TParseVersions::initializeExtensionBehavior() extensionBehavior[E_GL_OES_texture_cube_map_array] = EBhDisable; // EXT extensions - extensionBehavior[E_GL_EXT_device_group] = EBhDisable; - extensionBehavior[E_GL_EXT_multiview] = EBhDisable; - extensionBehavior[E_GL_EXT_shader_realtime_clock] = EBhDisable; - extensionBehavior[E_GL_EXT_ray_tracing] = EBhDisable; - extensionBehavior[E_GL_EXT_ray_query] = EBhDisable; + extensionBehavior[E_GL_EXT_device_group] = EBhDisable; + extensionBehavior[E_GL_EXT_multiview] = EBhDisable; + extensionBehavior[E_GL_EXT_shader_realtime_clock] = EBhDisable; + extensionBehavior[E_GL_EXT_ray_tracing] = EBhDisable; + extensionBehavior[E_GL_EXT_ray_query] = EBhDisable; + extensionBehavior[E_GL_EXT_ray_flags_primitive_culling] = EBhDisable; // OVR extensions extensionBehavior[E_GL_OVR_multiview] = EBhDisable; @@ -438,6 +439,7 @@ void TParseVersions::getPreamble(std::string& preamble) "#define E_GL_EXT_shader_realtime_clock 1\n" "#define E_GL_EXT_ray_tracing 1\n" "#define E_GL_EXT_ray_query 1\n" + "#define E_GL_EXT_ray_flags_primitive_culling 1\n" "#define GL_AMD_shader_ballot 1\n" "#define GL_AMD_shader_trinary_minmax 1\n" diff --git a/glslang/MachineIndependent/Versions.h b/glslang/MachineIndependent/Versions.h index e8cebebf9c..170efb00ed 100644 --- a/glslang/MachineIndependent/Versions.h +++ b/glslang/MachineIndependent/Versions.h @@ -189,6 +189,7 @@ const char* const E_GL_EXT_shader_realtime_clock = "GL_EXT_shader_rea const char* const E_GL_EXT_debug_printf = "GL_EXT_debug_printf"; const char* const E_GL_EXT_ray_tracing = "GL_EXT_ray_tracing"; const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query"; +const char* const E_GL_EXT_ray_flags_primitive_culling = "GL_EXT_ray_flags_primitive_culling"; // Arrays of extensions for the above viewportEXTs duplications