Add support for EXT_ray_flags_primitive_culling. (#2173)

Fixes issue #2169.
This commit is contained in:
alelenv 2020-04-08 21:09:20 -07:00 committed by GitHub
parent 9c3204a1fd
commit 75de196cec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 126 additions and 106 deletions

View file

@ -1448,6 +1448,10 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,
builder.addExecutionMode(shaderEntry, spv::ExecutionModeXfb); builder.addExecutionMode(shaderEntry, spv::ExecutionModeXfb);
} }
if (sourceExtensions.find("GL_EXT_ray_flags_primitive_culling") != sourceExtensions.end()) {
builder.addCapability(spv::CapabilityRayTraversalPrimitiveCullingProvisionalKHR);
}
unsigned int mode; unsigned int mode;
switch (glslangIntermediate->getStage()) { switch (glslangIntermediate->getStage()) {
case EShLangVertex: case EShLangVertex:

View file

@ -1,18 +1,19 @@
rayQuery-allOps.comp rayQuery-allOps.comp
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80008 // Generated by (magic number): 80008
// Id's are bound by 257 // Id's are bound by 258
Capability Shader Capability Shader
Capability RayQueryProvisionalKHR Capability RayQueryProvisionalKHR
Capability RayTraversalPrimitiveCullingProvisionalKHR
Extension "SPV_KHR_ray_query" Extension "SPV_KHR_ray_query"
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint GLCompute 4 "main" EntryPoint GLCompute 4 "main"
ExecutionMode 4 LocalSize 1 1 1 ExecutionMode 4 LocalSize 1 1 1
Source GLSL 460 Source GLSL 460
SourceExtension "GL_EXT_ray_flags_primitive_culling"
SourceExtension "GL_EXT_ray_query" SourceExtension "GL_EXT_ray_query"
SourceExtension "GL_NV_ray_tracing"
Name 4 "main" Name 4 "main"
Name 6 "doSomething(" Name 6 "doSomething("
Name 10 "Ray" Name 10 "Ray"
@ -34,16 +35,16 @@ rayQuery-allOps.comp
Name 83 "_mat3x4" Name 83 "_mat3x4"
Name 143 "t" Name 143 "t"
Name 156 "committedStatus" Name 156 "committedStatus"
Name 240 "o" Name 241 "o"
Name 242 "d" Name 243 "d"
Name 252 "Ray" Name 253 "Ray"
MemberName 252(Ray) 0 "pos" MemberName 253(Ray) 0 "pos"
MemberName 252(Ray) 1 "tmin" MemberName 253(Ray) 1 "tmin"
MemberName 252(Ray) 2 "dir" MemberName 253(Ray) 2 "dir"
MemberName 252(Ray) 3 "tmax" MemberName 253(Ray) 3 "tmax"
Name 254 "Rays" Name 255 "Rays"
MemberName 254(Rays) 0 "rays" MemberName 255(Rays) 0 "rays"
Name 256 "" Name 257 ""
MemberDecorate 15(Log) 0 Offset 0 MemberDecorate 15(Log) 0 Offset 0
MemberDecorate 15(Log) 1 Offset 4 MemberDecorate 15(Log) 1 Offset 4
Decorate 15(Log) BufferBlock Decorate 15(Log) BufferBlock
@ -51,15 +52,15 @@ rayQuery-allOps.comp
Decorate 17 Binding 0 Decorate 17 Binding 0
Decorate 50(rtas) DescriptorSet 0 Decorate 50(rtas) DescriptorSet 0
Decorate 50(rtas) Binding 1 Decorate 50(rtas) Binding 1
MemberDecorate 252(Ray) 0 Offset 0 MemberDecorate 253(Ray) 0 Offset 0
MemberDecorate 252(Ray) 1 Offset 12 MemberDecorate 253(Ray) 1 Offset 12
MemberDecorate 252(Ray) 2 Offset 16 MemberDecorate 253(Ray) 2 Offset 16
MemberDecorate 252(Ray) 3 Offset 28 MemberDecorate 253(Ray) 3 Offset 28
Decorate 253 ArrayStride 32 Decorate 254 ArrayStride 32
MemberDecorate 254(Rays) 0 Offset 0 MemberDecorate 255(Rays) 0 Offset 0
Decorate 254(Rays) BufferBlock Decorate 255(Rays) BufferBlock
Decorate 256 DescriptorSet 0 Decorate 257 DescriptorSet 0
Decorate 256 Binding 2 Decorate 257 Binding 2
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
8: TypeFloat 32 8: TypeFloat 32
@ -104,11 +105,12 @@ rayQuery-allOps.comp
144: 8(float) Constant 1056964608 144: 8(float) Constant 1056964608
175: 14(int) Constant 1 175: 14(int) Constant 1
198: 14(int) Constant 2 198: 14(int) Constant 2
252(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float) 231: 14(int) Constant 256
253: TypeRuntimeArray 252(Ray) 253(Ray): TypeStruct 9(fvec3) 8(float) 9(fvec3) 8(float)
254(Rays): TypeStruct 253 254: TypeRuntimeArray 253(Ray)
255: TypePointer Uniform 254(Rays) 255(Rays): TypeStruct 254
256: 255(ptr) Variable Uniform 256: TypePointer Uniform 255(Rays)
257: 256(ptr) Variable Uniform
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
43(ray): 25(ptr) Variable Function 43(ray): 25(ptr) Variable Function
@ -118,8 +120,8 @@ rayQuery-allOps.comp
83(_mat3x4): 82(ptr) Variable Function 83(_mat3x4): 82(ptr) Variable Function
143(t): 35(ptr) Variable Function 143(t): 35(ptr) Variable Function
156(committedStatus): 68(ptr) Variable Function 156(committedStatus): 68(ptr) Variable Function
240(o): 29(ptr) Variable Function 241(o): 29(ptr) Variable Function
242(d): 29(ptr) Variable Function 243(d): 29(ptr) Variable Function
44: 10(Ray) FunctionCall 12(makeRayDesc() 44: 10(Ray) FunctionCall 12(makeRayDesc()
Store 43(ray) 44 Store 43(ray) 44
51: 48 Load 50(rtas) 51: 48 Load 50(rtas)
@ -375,36 +377,36 @@ rayQuery-allOps.comp
Branch 228 Branch 228
228: Label 228: Label
230: 14(int) RayQueryGetRayFlagsKHR 47(rayQuery) 230: 14(int) RayQueryGetRayFlagsKHR 47(rayQuery)
231: 66(bool) UGreaterThan 230 20 232: 66(bool) UGreaterThan 230 231
SelectionMerge 233 None SelectionMerge 234 None
BranchConditional 231 232 233 BranchConditional 232 233 234
232: Label 233: Label
234: 2 FunctionCall 6(doSomething() 235: 2 FunctionCall 6(doSomething()
Branch 233 Branch 234
233: Label 234: Label
235: 8(float) RayQueryGetRayTMinKHR 47(rayQuery) 236: 8(float) RayQueryGetRayTMinKHR 47(rayQuery)
236: 66(bool) FOrdGreaterThan 235 27 237: 66(bool) FOrdGreaterThan 236 27
SelectionMerge 238 None SelectionMerge 239 None
BranchConditional 236 237 238 BranchConditional 237 238 239
237: Label 238: Label
239: 2 FunctionCall 6(doSomething() 240: 2 FunctionCall 6(doSomething()
Branch 238 Branch 239
238: Label 239: Label
241: 9(fvec3) RayQueryGetWorldRayOriginKHR 47(rayQuery) 242: 9(fvec3) RayQueryGetWorldRayOriginKHR 47(rayQuery)
Store 240(o) 241 Store 241(o) 242
243: 9(fvec3) RayQueryGetWorldRayDirectionKHR 47(rayQuery) 244: 9(fvec3) RayQueryGetWorldRayDirectionKHR 47(rayQuery)
Store 242(d) 243 Store 243(d) 244
244: 35(ptr) AccessChain 240(o) 20 245: 35(ptr) AccessChain 241(o) 20
245: 8(float) Load 244 246: 8(float) Load 245
246: 35(ptr) AccessChain 242(d) 198 247: 35(ptr) AccessChain 243(d) 198
247: 8(float) Load 246 248: 8(float) Load 247
248: 66(bool) FOrdEqual 245 247 249: 66(bool) FOrdEqual 246 248
SelectionMerge 250 None SelectionMerge 251 None
BranchConditional 248 249 250 BranchConditional 249 250 251
249: Label 250: Label
251: 2 FunctionCall 6(doSomething() 252: 2 FunctionCall 6(doSomething()
Branch 250 Branch 251
250: Label 251: Label
Return Return
FunctionEnd FunctionEnd
6(doSomething(): 2 Function None 3 6(doSomething(): 2 Function None 3

View file

@ -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:9: 'reportIntersectionEXT' : no matching overloaded function found
ERROR: 0:10: 'terminateRayEXT' : no matching overloaded function found ERROR: 0:10: 'terminateRayEXT' : no matching overloaded function found
ERROR: 0:11: 'ignoreIntersectionEXT' : 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 SPIR-V is not generated for failed compile or link

View file

@ -1,14 +1,16 @@
spv.ext.RayGenShader.rgen spv.ext.RayGenShader.rgen
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80008 // Generated by (magic number): 80008
// Id's are bound by 57 // Id's are bound by 58
Capability RayTraversalPrimitiveCullingProvisionalKHR
Capability RayTracingProvisionalKHR Capability RayTracingProvisionalKHR
Extension "SPV_KHR_ray_tracing" Extension "SPV_KHR_ray_tracing"
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint RayGenerationKHR 4 "main" 11 21 EntryPoint RayGenerationKHR 4 "main" 11 21
Source GLSL 460 Source GLSL 460
SourceExtension "GL_EXT_ray_flags_primitive_culling"
SourceExtension "GL_EXT_ray_tracing" SourceExtension "GL_EXT_ray_tracing"
Name 4 "main" Name 4 "main"
Name 8 "lx" Name 8 "lx"
@ -18,25 +20,25 @@ spv.ext.RayGenShader.rgen
Name 21 "gl_LaunchSizeEXT" Name 21 "gl_LaunchSizeEXT"
Name 24 "sy" Name 24 "sy"
Name 29 "accEXT0" Name 29 "accEXT0"
Name 37 "block" Name 38 "block"
MemberName 37(block) 0 "dir" MemberName 38(block) 0 "dir"
MemberName 37(block) 1 "origin" MemberName 38(block) 1 "origin"
Name 39 "" Name 40 ""
Name 50 "accEXT1" Name 51 "accEXT1"
Name 53 "imageu" Name 54 "imageu"
Name 56 "payload" Name 57 "payload"
Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR Decorate 11(gl_LaunchIDEXT) BuiltIn LaunchIdKHR
Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR Decorate 21(gl_LaunchSizeEXT) BuiltIn LaunchSizeKHR
Decorate 29(accEXT0) DescriptorSet 0 Decorate 29(accEXT0) DescriptorSet 0
Decorate 29(accEXT0) Binding 0 Decorate 29(accEXT0) Binding 0
MemberDecorate 37(block) 0 Offset 0 MemberDecorate 38(block) 0 Offset 0
MemberDecorate 37(block) 1 Offset 16 MemberDecorate 38(block) 1 Offset 16
Decorate 37(block) BufferBlock Decorate 38(block) BufferBlock
Decorate 50(accEXT1) DescriptorSet 0 Decorate 51(accEXT1) DescriptorSet 0
Decorate 50(accEXT1) Binding 1 Decorate 51(accEXT1) Binding 1
Decorate 53(imageu) DescriptorSet 0 Decorate 54(imageu) DescriptorSet 0
Decorate 53(imageu) Binding 2 Decorate 54(imageu) Binding 2
Decorate 56(payload) Location 0 Decorate 57(payload) Location 0
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 0 6: TypeInt 32 0
@ -51,24 +53,25 @@ spv.ext.RayGenShader.rgen
27: TypeAccelerationStructureKHR 27: TypeAccelerationStructureKHR
28: TypePointer UniformConstant 27 28: TypePointer UniformConstant 27
29(accEXT0): 28(ptr) Variable UniformConstant 29(accEXT0): 28(ptr) Variable UniformConstant
35: TypeFloat 32 35: 6(int) Constant 768
36: TypeVector 35(float) 3 36: TypeFloat 32
37(block): TypeStruct 36(fvec3) 36(fvec3) 37: TypeVector 36(float) 3
38: TypePointer ShaderRecordBufferKHR 37(block) 38(block): TypeStruct 37(fvec3) 37(fvec3)
39: 38(ptr) Variable ShaderRecordBufferKHR 39: TypePointer ShaderRecordBufferKHR 38(block)
40: TypeInt 32 1 40: 39(ptr) Variable ShaderRecordBufferKHR
41: 40(int) Constant 1 41: TypeInt 32 1
42: TypePointer ShaderRecordBufferKHR 36(fvec3) 42: 41(int) Constant 1
45: 35(float) Constant 1056964608 43: TypePointer ShaderRecordBufferKHR 37(fvec3)
46: 40(int) Constant 0 46: 36(float) Constant 1056964608
49: 35(float) Constant 1061158912 47: 41(int) Constant 0
50(accEXT1): 28(ptr) Variable UniformConstant 50: 36(float) Constant 1061158912
51: TypeImage 6(int) 2D nonsampled format:R32ui 51(accEXT1): 28(ptr) Variable UniformConstant
52: TypePointer UniformConstant 51 52: TypeImage 6(int) 2D nonsampled format:R32ui
53(imageu): 52(ptr) Variable UniformConstant 53: TypePointer UniformConstant 52
54: TypeVector 35(float) 4 54(imageu): 53(ptr) Variable UniformConstant
55: TypePointer RayPayloadKHR 54(fvec4) 55: TypeVector 36(float) 4
56(payload): 55(ptr) Variable RayPayloadKHR 56: TypePointer RayPayloadKHR 55(fvec4)
57(payload): 56(ptr) Variable RayPayloadKHR
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(lx): 7(ptr) Variable Function 8(lx): 7(ptr) Variable Function
@ -92,10 +95,10 @@ spv.ext.RayGenShader.rgen
32: 6(int) Load 16(ly) 32: 6(int) Load 16(ly)
33: 6(int) Load 20(sx) 33: 6(int) Load 20(sx)
34: 6(int) Load 24(sy) 34: 6(int) Load 24(sy)
43: 42(ptr) AccessChain 39 41 44: 43(ptr) AccessChain 40 42
44: 36(fvec3) Load 43 45: 37(fvec3) Load 44
47: 42(ptr) AccessChain 39 46 48: 43(ptr) AccessChain 40 47
48: 36(fvec3) Load 47 49: 37(fvec3) Load 48
TraceRayKHR 30 31 32 33 34 12 44 45 48 49 41 TraceRayKHR 30 31 32 33 34 35 45 46 49 50 42
Return Return
FunctionEnd FunctionEnd

View file

@ -1,6 +1,6 @@
#version 460 #version 460
#extension GL_NV_ray_tracing : enable
#extension GL_EXT_ray_query : enable #extension GL_EXT_ray_query : enable
#extension GL_EXT_ray_flags_primitive_culling : enable
struct Ray struct Ray
{ {
@ -192,7 +192,7 @@ void main()
doSomething(); doSomething();
} }
if (rayQueryGetRayFlagsEXT(rayQuery) > 0) if (rayQueryGetRayFlagsEXT(rayQuery) > gl_RayFlagsSkipTrianglesEXT)
{ {
doSomething(); doSomething();
} }

View file

@ -9,4 +9,5 @@ void main()
reportIntersectionEXT(1.0, 1U); // ERROR, unsupported builtin in stage reportIntersectionEXT(1.0, 1U); // ERROR, unsupported builtin in stage
terminateRayEXT(); terminateRayEXT();
ignoreIntersectionEXT(); ignoreIntersectionEXT();
bool e1 = gl_IncomingRayFlagsEXT == gl_RayFlagsSkipAABBEXT;
} }

View file

@ -1,5 +1,6 @@
#version 460 #version 460
#extension GL_EXT_ray_tracing : enable #extension GL_EXT_ray_tracing : enable
#extension GL_EXT_ray_flags_primitive_culling : enable
layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT0; layout(binding = 0, set = 0) uniform accelerationStructureEXT accEXT0;
layout(binding = 1, set = 0) uniform accelerationStructureEXT accEXT1; // Unused layout(binding = 1, set = 0) uniform accelerationStructureEXT accEXT1; // Unused
layout(binding = 2, r32ui) shadercallcoherent uniform uimage2D imageu; layout(binding = 2, r32ui) shadercallcoherent uniform uimage2D imageu;
@ -16,5 +17,5 @@ void main()
uint ly = gl_LaunchIDEXT.y; uint ly = gl_LaunchIDEXT.y;
uint sx = gl_LaunchSizeEXT.x; uint sx = gl_LaunchSizeEXT.x;
uint sy = gl_LaunchSizeEXT.y; 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);
} }

View file

@ -34,6 +34,7 @@ void main()
mat4x3 e11 = gl_WorldToObjectEXT; // ERROR, unsupported builtin in stage mat4x3 e11 = gl_WorldToObjectEXT; // ERROR, unsupported builtin in stage
float e12 = gl_HitTEXT; // ERROR, unsupported builtin in stage float e12 = gl_HitTEXT; // ERROR, unsupported builtin in stage
float e13 = gl_HitKindEXT; // 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 reportIntersectionEXT(1.0, 1U); // ERROR, unsupported builtin in stage
ignoreIntersectionEXT(); // ERROR, unsupported builtin in stage ignoreIntersectionEXT(); // ERROR, unsupported builtin in stage
terminateRayEXT(); // ERROR, unsupported builtin in stage terminateRayEXT(); // ERROR, unsupported builtin in stage

View file

@ -5457,6 +5457,8 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
"const uint gl_RayFlagsCullOpaqueEXT = 64U;" "const uint gl_RayFlagsCullOpaqueEXT = 64U;"
"const uint gl_RayFlagsCullNoOpaqueNV = 128U;" "const uint gl_RayFlagsCullNoOpaqueNV = 128U;"
"const uint gl_RayFlagsCullNoOpaqueEXT = 128U;" "const uint gl_RayFlagsCullNoOpaqueEXT = 128U;"
"const uint gl_RayFlagsSkipTrianglesEXT = 256U;"
"const uint gl_RayFlagsSkipAABBEXT = 512U;"
"const uint gl_HitKindFrontFacingTriangleEXT = 254U;" "const uint gl_HitKindFrontFacingTriangleEXT = 254U;"
"const uint gl_HitKindBackFacingTriangleEXT = 255U;" "const uint gl_HitKindBackFacingTriangleEXT = 255U;"
"\n"; "\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("rayQueryGetIntersectionWorldToObjectEXT", 1, &E_GL_EXT_ray_query);
symbolTable.setFunctionExtensions("rayQueryGetWorldRayOriginEXT", 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.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) || if ((profile != EEsProfile && version >= 130) ||

View file

@ -293,11 +293,12 @@ void TParseVersions::initializeExtensionBehavior()
extensionBehavior[E_GL_OES_texture_cube_map_array] = EBhDisable; extensionBehavior[E_GL_OES_texture_cube_map_array] = EBhDisable;
// EXT extensions // EXT extensions
extensionBehavior[E_GL_EXT_device_group] = EBhDisable; extensionBehavior[E_GL_EXT_device_group] = EBhDisable;
extensionBehavior[E_GL_EXT_multiview] = EBhDisable; extensionBehavior[E_GL_EXT_multiview] = EBhDisable;
extensionBehavior[E_GL_EXT_shader_realtime_clock] = EBhDisable; extensionBehavior[E_GL_EXT_shader_realtime_clock] = EBhDisable;
extensionBehavior[E_GL_EXT_ray_tracing] = EBhDisable; extensionBehavior[E_GL_EXT_ray_tracing] = EBhDisable;
extensionBehavior[E_GL_EXT_ray_query] = EBhDisable; extensionBehavior[E_GL_EXT_ray_query] = EBhDisable;
extensionBehavior[E_GL_EXT_ray_flags_primitive_culling] = EBhDisable;
// OVR extensions // OVR extensions
extensionBehavior[E_GL_OVR_multiview] = EBhDisable; 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_shader_realtime_clock 1\n"
"#define E_GL_EXT_ray_tracing 1\n" "#define E_GL_EXT_ray_tracing 1\n"
"#define E_GL_EXT_ray_query 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_ballot 1\n"
"#define GL_AMD_shader_trinary_minmax 1\n" "#define GL_AMD_shader_trinary_minmax 1\n"

View file

@ -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_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_tracing = "GL_EXT_ray_tracing";
const char* const E_GL_EXT_ray_query = "GL_EXT_ray_query"; 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 // Arrays of extensions for the above viewportEXTs duplications