Commit 50a72281 by Neslisah Torosdagli

GL_EXT_ray_query glslang updates, and test cases added.

parent 34e87422
...@@ -1477,6 +1477,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, ...@@ -1477,6 +1477,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,
builder.addExecutionMode(shaderEntry, spv::ExecutionModeDepthReplacing); builder.addExecutionMode(shaderEntry, spv::ExecutionModeDepthReplacing);
#ifndef GLSLANG_WEB #ifndef GLSLANG_WEB
switch(glslangIntermediate->getDepth()) { switch(glslangIntermediate->getDepth()) {
case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break; case glslang::EldGreater: mode = spv::ExecutionModeDepthGreater; break;
case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break; case glslang::EldLess: mode = spv::ExecutionModeDepthLess; break;
...@@ -1514,7 +1515,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, ...@@ -1514,7 +1515,7 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion,
builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock); builder.addExtension(spv::E_SPV_EXT_fragment_shader_interlock);
} }
#endif #endif
break; break;
case EShLangCompute: case EShLangCompute:
builder.addCapability(spv::CapabilityShader); builder.addCapability(spv::CapabilityShader);
...@@ -2289,6 +2290,13 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI ...@@ -2289,6 +2290,13 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
case glslang::EOpEndStreamPrimitive: case glslang::EOpEndStreamPrimitive:
builder.createNoResultOp(spv::OpEndStreamPrimitive, operand); builder.createNoResultOp(spv::OpEndStreamPrimitive, operand);
return false; return false;
case glslang::EOpRayQueryTerminate:
builder.createNoResultOp(spv::OpRayQueryTerminateKHR, operand);
return false;
case glslang::EOpRayQueryConfirmIntersection:
builder.createNoResultOp(spv::OpRayQueryConfirmIntersectionKHR, operand);
return false;
#endif #endif
default: default:
...@@ -2710,9 +2718,32 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt ...@@ -2710,9 +2718,32 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
case glslang::EOpRayQueryTerminate: case glslang::EOpRayQueryTerminate:
case glslang::EOpRayQueryGenerateIntersection: case glslang::EOpRayQueryGenerateIntersection:
case glslang::EOpRayQueryConfirmIntersection: case glslang::EOpRayQueryConfirmIntersection:
builder.addExtension("SPV_KHR_ray_query");
builder.addCapability(spv::CapabilityRayQueryProvisionalKHR);
noReturnValue = true; noReturnValue = true;
break; break;
case glslang::EOpRayQueryProceed:
case glslang::EOpRayQueryGetIntersectionType:
case glslang::EOpRayQueryGetRayTMin:
case glslang::EOpRayQueryGetRayFlags:
case glslang::EOpRayQueryGetIntersectionT:
case glslang::EOpRayQueryGetIntersectionInstanceCustomIndex:
case glslang::EOpRayQueryGetIntersectionInstanceId:
case glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:
case glslang::EOpRayQueryGetIntersectionGeometryIndex:
case glslang::EOpRayQueryGetIntersectionPrimitiveIndex:
case glslang::EOpRayQueryGetIntersectionBarycentrics:
case glslang::EOpRayQueryGetIntersectionFrontFace:
case glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque:
case glslang::EOpRayQueryGetIntersectionObjectRayDirection:
case glslang::EOpRayQueryGetIntersectionObjectRayOrigin:
case glslang::EOpRayQueryGetWorldRayDirection:
case glslang::EOpRayQueryGetWorldRayOrigin:
case glslang::EOpRayQueryGetIntersectionObjectToWorld:
case glslang::EOpRayQueryGetIntersectionWorldToObject:
builder.addExtension("SPV_KHR_ray_query");
builder.addCapability(spv::CapabilityRayQueryProvisionalKHR);
break;
case glslang::EOpCooperativeMatrixLoad: case glslang::EOpCooperativeMatrixLoad:
case glslang::EOpCooperativeMatrixStore: case glslang::EOpCooperativeMatrixStore:
noReturnValue = true; noReturnValue = true;
...@@ -2780,6 +2811,9 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt ...@@ -2780,6 +2811,9 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
break; break;
case glslang::EOpRayQueryInitialize: case glslang::EOpRayQueryInitialize:
case glslang::EOpRayQueryTerminate:
case glslang::EOpRayQueryConfirmIntersection:
case glslang::EOpRayQueryProceed:
case glslang::EOpRayQueryGenerateIntersection: case glslang::EOpRayQueryGenerateIntersection:
case glslang::EOpRayQueryGetIntersectionType: case glslang::EOpRayQueryGetIntersectionType:
case glslang::EOpRayQueryGetIntersectionT: case glslang::EOpRayQueryGetIntersectionT:
...@@ -5947,6 +5981,24 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe ...@@ -5947,6 +5981,24 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe
case glslang::EOpFwidthCoarse: case glslang::EOpFwidthCoarse:
unaryOp = spv::OpFwidthCoarse; unaryOp = spv::OpFwidthCoarse;
break; break;
case glslang::EOpRayQueryProceed:
unaryOp = spv::OpRayQueryProceedKHR;
break;
case glslang::EOpRayQueryGetRayTMin:
unaryOp = spv::OpRayQueryGetRayTMinKHR;
break;
case glslang::EOpRayQueryGetRayFlags:
unaryOp = spv::OpRayQueryGetRayFlagsKHR;
break;
case glslang::EOpRayQueryGetWorldRayOrigin:
unaryOp = spv::OpRayQueryGetWorldRayOriginKHR;
break;
case glslang::EOpRayQueryGetWorldRayDirection:
unaryOp = spv::OpRayQueryGetWorldRayDirectionKHR;
break;
case glslang::EOpRayQueryGetIntersectionCandidateAABBOpaque:
unaryOp = spv::OpRayQueryGetIntersectionCandidateAABBOpaqueKHR;
break;
case glslang::EOpInterpolateAtCentroid: case glslang::EOpInterpolateAtCentroid:
if (typeProxy == glslang::EbtFloat16) if (typeProxy == glslang::EbtFloat16)
builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float); builder.addExtension(spv::E_SPV_AMD_gpu_shader_half_float);
...@@ -7688,10 +7740,9 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: ...@@ -7688,10 +7740,9 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
case glslang::EOpRayQueryProceed: { case glslang::EOpRayQueryProceed: {
typeId = builder.makeBoolType(); typeId = builder.makeBoolType();
opCode = spv::OpRayQueryProceedKHR; opCode = spv::OpRayQueryProceedKHR;
} } break;
break;
case glslang::EOpRayQueryGetIntersectionType: { case glslang::EOpRayQueryGetIntersectionType: {
typeId = builder.makeIntType(32); typeId = builder.makeUintType(32);
opCode = spv::OpRayQueryGetIntersectionTypeKHR; opCode = spv::OpRayQueryGetIntersectionTypeKHR;
} break; } break;
case glslang::EOpRayQueryGetRayTMin: { case glslang::EOpRayQueryGetRayTMin: {
...@@ -7703,7 +7754,7 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: ...@@ -7703,7 +7754,7 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
opCode = spv::OpRayQueryGetRayFlagsKHR; opCode = spv::OpRayQueryGetRayFlagsKHR;
} break; } break;
case glslang::EOpRayQueryGetIntersectionT: { case glslang::EOpRayQueryGetIntersectionT: {
typeId = builder.makeIntType(32); typeId = builder.makeFloatType(32);
opCode = spv::OpRayQueryGetIntersectionTKHR; opCode = spv::OpRayQueryGetIntersectionTKHR;
} break; } break;
case glslang::EOpRayQueryGetIntersectionInstanceCustomIndex: { case glslang::EOpRayQueryGetIntersectionInstanceCustomIndex: {
...@@ -7756,14 +7807,10 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv:: ...@@ -7756,14 +7807,10 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
} break; } break;
case glslang::EOpRayQueryGetIntersectionObjectToWorld: { case glslang::EOpRayQueryGetIntersectionObjectToWorld: {
typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3); typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);
// https://gitlab.khronos.org/spirv/spirv-extensions/blob/cdf44fd4b854a5297bf2191d4f57f9bccbc49098/SPV_KHR_ray_query.asciidoc#ray_query_candidate_intersection_type
// or per description is it typeId = builder.makeVectorType(builder.makeVectorType(builder.makeFloatType(32), 3), 4);
opCode = spv::OpRayQueryGetIntersectionObjectToWorldKHR; opCode = spv::OpRayQueryGetIntersectionObjectToWorldKHR;
} break; } break;
case glslang::EOpRayQueryGetIntersectionWorldToObject: { case glslang::EOpRayQueryGetIntersectionWorldToObject: {
typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3); typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);
// https://gitlab.khronos.org/spirv/spirv-extensions/blob/cdf44fd4b854a5297bf2191d4f57f9bccbc49098/SPV_KHR_ray_query.asciidoc#ray_query_candidate_intersection_type
// or per description is it typeId = builder.makeVectorType(builder.makeVectorType(builder.makeFloatType(32), 3), 4);
opCode = spv::OpRayQueryGetIntersectionWorldToObjectKHR; opCode = spv::OpRayQueryGetIntersectionWorldToObjectKHR;
} break; } break;
case glslang::EOpWritePackedPrimitiveIndices4x8NV: case glslang::EOpWritePackedPrimitiveIndices4x8NV:
......
...@@ -1940,31 +1940,6 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) { ...@@ -1940,31 +1940,6 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break; case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break; case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;
case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break; case OpExecuteCallableNV: *hasResult = false; *hasResultType = false; break;
case OpTypeAccelerationStructureKHR: *hasResult = true; *hasResultType = false; break;
case OpTypeRayQueryProvisionalKHR: *hasResult = true; *hasResultType = false; break;
case OpRayQueryInitializeKHR: *hasResult = false; *hasResultType = false; break;
case OpRayQueryTerminateKHR: *hasResult = false; *hasResultType = false; break;
case OpRayQueryGenerateIntersectionKHR: *hasResult = false; *hasResultType = false; break;
case OpRayQueryConfirmIntersectionKHR: *hasResult = false; *hasResultType = false; break;
case OpRayQueryProceedKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionTypeKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetRayTMinKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetRayFlagsKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionTKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionInstanceCustomIndexKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionInstanceIdKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionGeometryIndexKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionPrimitiveIndexKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionBarycentricsKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionFrontFaceKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionCandidateAABBOpaqueKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionObjectRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionObjectRayOriginKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetWorldRayDirectionKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;
case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break; case OpTypeCooperativeMatrixNV: *hasResult = true; *hasResultType = false; break;
case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break; case OpCooperativeMatrixLoadNV: *hasResult = true; *hasResultType = true; break;
case OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break; case OpCooperativeMatrixStoreNV: *hasResult = false; *hasResultType = false; break;
......
rayQuery-initialize.rgen
// Module Version 10000
// Generated by (magic number): 80008
// Id's are bound by 103
Capability RayQueryProvisionalKHR
Capability RayTracingNV
Extension "SPV_KHR_ray_query"
Extension "SPV_NV_ray_tracing"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint RayGenerationKHR 4 "main" 23 28
Source GLSL 460
SourceExtension "GL_EXT_ray_query"
SourceExtension "GL_NV_ray_tracing"
Name 4 "main"
Name 8 "launchIndex("
Name 14 "Ray"
MemberName 14(Ray) 0 "pos"
MemberName 14(Ray) 1 "tmin"
MemberName 14(Ray) 2 "dir"
MemberName 14(Ray) 3 "tmax"
Name 19 "doInitialize(rq1;struct-Ray-vf3-f1-vf3-f11;"
Name 17 "rayQuery"
Name 18 "ray"
Name 23 "gl_LaunchIDNV"
Name 28 "gl_LaunchSizeNV"
Name 50 "rtas"
Name 68 "index"
Name 70 "ray"
Name 71 "Ray"
MemberName 71(Ray) 0 "pos"
MemberName 71(Ray) 1 "tmin"
MemberName 71(Ray) 2 "dir"
MemberName 71(Ray) 3 "tmax"
Name 73 "Rays"
MemberName 73(Rays) 0 "rays"
Name 75 ""
Name 88 "rayQuery"
Name 89 "param"
Name 91 "param"
Decorate 23(gl_LaunchIDNV) BuiltIn LaunchIdKHR
Decorate 28(gl_LaunchSizeNV) BuiltIn LaunchSizeKHR
Decorate 50(rtas) DescriptorSet 0
Decorate 50(rtas) Binding 0
MemberDecorate 71(Ray) 0 Offset 0
MemberDecorate 71(Ray) 1 Offset 12
MemberDecorate 71(Ray) 2 Offset 16
MemberDecorate 71(Ray) 3 Offset 28
Decorate 72 ArrayStride 32
MemberDecorate 73(Rays) 0 Offset 0
Decorate 73(Rays) BufferBlock
Decorate 75 DescriptorSet 0
Decorate 75 Binding 2
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 0
7: TypeFunction 6(int)
10: TypeRayQueryProvisionalKHR
11: TypePointer Function 10
12: TypeFloat 32
13: TypeVector 12(float) 3
14(Ray): TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
15: TypePointer Function 14(Ray)
16: TypeFunction 2 11(ptr) 15(ptr)
21: TypeVector 6(int) 3
22: TypePointer Input 21(ivec3)
23(gl_LaunchIDNV): 22(ptr) Variable Input
24: 6(int) Constant 2
25: TypePointer Input 6(int)
28(gl_LaunchSizeNV): 22(ptr) Variable Input
29: 6(int) Constant 0
33: 6(int) Constant 1
48: TypeAccelerationStructureKHR
49: TypePointer UniformConstant 48
50(rtas): 49(ptr) Variable UniformConstant
52: TypeInt 32 1
53: 52(int) Constant 0
54: TypePointer Function 13(fvec3)
57: 52(int) Constant 1
58: TypePointer Function 12(float)
61: 52(int) Constant 2
64: 52(int) Constant 3
67: TypePointer Function 6(int)
71(Ray): TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
72: TypeRuntimeArray 71(Ray)
73(Rays): TypeStruct 72
74: TypePointer Uniform 73(Rays)
75: 74(ptr) Variable Uniform
77: TypePointer Uniform 71(Ray)
4(main): 2 Function None 3
5: Label
68(index): 67(ptr) Variable Function
70(ray): 15(ptr) Variable Function
88(rayQuery): 11(ptr) Variable Function
89(param): 11(ptr) Variable Function
91(param): 15(ptr) Variable Function
69: 6(int) FunctionCall 8(launchIndex()
Store 68(index) 69
76: 6(int) Load 68(index)
78: 77(ptr) AccessChain 75 53 76
79: 71(Ray) Load 78
80: 13(fvec3) CompositeExtract 79 0
81: 54(ptr) AccessChain 70(ray) 53
Store 81 80
82: 12(float) CompositeExtract 79 1
83: 58(ptr) AccessChain 70(ray) 57
Store 83 82
84: 13(fvec3) CompositeExtract 79 2
85: 54(ptr) AccessChain 70(ray) 61
Store 85 84
86: 12(float) CompositeExtract 79 3
87: 58(ptr) AccessChain 70(ray) 64
Store 87 86
90: 10 Load 88(rayQuery)
Store 89(param) 90
92: 14(Ray) Load 70(ray)
Store 91(param) 92
93: 2 FunctionCall 19(doInitialize(rq1;struct-Ray-vf3-f1-vf3-f11;) 89(param) 91(param)
94: 48 Load 50(rtas)
95: 54(ptr) AccessChain 70(ray) 53
96: 13(fvec3) Load 95
97: 58(ptr) AccessChain 70(ray) 57
98: 12(float) Load 97
99: 54(ptr) AccessChain 70(ray) 61
100: 13(fvec3) Load 99
101: 58(ptr) AccessChain 70(ray) 64
102: 12(float) Load 101
RayQueryInitializeKHR 88(rayQuery) 94 33 24 96 98 100 102
Return
FunctionEnd
8(launchIndex(): 6(int) Function None 7
9: Label
26: 25(ptr) AccessChain 23(gl_LaunchIDNV) 24
27: 6(int) Load 26
30: 25(ptr) AccessChain 28(gl_LaunchSizeNV) 29
31: 6(int) Load 30
32: 6(int) IMul 27 31
34: 25(ptr) AccessChain 28(gl_LaunchSizeNV) 33
35: 6(int) Load 34
36: 6(int) IMul 32 35
37: 25(ptr) AccessChain 23(gl_LaunchIDNV) 33
38: 6(int) Load 37
39: 25(ptr) AccessChain 28(gl_LaunchSizeNV) 29
40: 6(int) Load 39
41: 6(int) IMul 38 40
42: 6(int) IAdd 36 41
43: 25(ptr) AccessChain 23(gl_LaunchIDNV) 29
44: 6(int) Load 43
45: 6(int) IAdd 42 44
ReturnValue 45
FunctionEnd
19(doInitialize(rq1;struct-Ray-vf3-f1-vf3-f11;): 2 Function None 16
17(rayQuery): 11(ptr) FunctionParameter
18(ray): 15(ptr) FunctionParameter
20: Label
51: 48 Load 50(rtas)
55: 54(ptr) AccessChain 18(ray) 53
56: 13(fvec3) Load 55
59: 58(ptr) AccessChain 18(ray) 57
60: 12(float) Load 59
62: 54(ptr) AccessChain 18(ray) 61
63: 13(fvec3) Load 62
65: 58(ptr) AccessChain 18(ray) 64
66: 12(float) Load 65
RayQueryInitializeKHR 17(rayQuery) 51 29 33 56 60 63 66
Return
FunctionEnd
rayQuery-no-cse.rgen
// Module Version 10000
// Generated by (magic number): 80008
// Id's are bound by 109
Capability RayQueryProvisionalKHR
Capability RayTracingNV
Extension "SPV_KHR_ray_query"
Extension "SPV_NV_ray_tracing"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint RayGenerationKHR 4 "main" 23 28
Source GLSL 460
SourceExtension "GL_EXT_ray_query"
SourceExtension "GL_NV_ray_tracing"
Name 4 "main"
Name 8 "launchIndex("
Name 14 "Ray"
MemberName 14(Ray) 0 "pos"
MemberName 14(Ray) 1 "tmin"
MemberName 14(Ray) 2 "dir"
MemberName 14(Ray) 3 "tmax"
Name 19 "doInitialize(rq1;struct-Ray-vf3-f1-vf3-f11;"
Name 17 "rayQuery"
Name 18 "ray"
Name 23 "gl_LaunchIDNV"
Name 28 "gl_LaunchSizeNV"
Name 50 "rtas"
Name 68 "index"
Name 70 "ray"
Name 71 "Ray"
MemberName 71(Ray) 0 "pos"
MemberName 71(Ray) 1 "tmin"
MemberName 71(Ray) 2 "dir"
MemberName 71(Ray) 3 "tmax"
Name 73 "Rays"
MemberName 73(Rays) 0 "rays"
Name 75 ""
Name 88 "rayQuery1"
Name 89 "param"
Name 91 "param"
Name 103 "rayQuery2"
Name 104 "param"
Name 106 "param"
Decorate 23(gl_LaunchIDNV) BuiltIn LaunchIdKHR
Decorate 28(gl_LaunchSizeNV) BuiltIn LaunchSizeKHR
Decorate 50(rtas) DescriptorSet 0
Decorate 50(rtas) Binding 0
MemberDecorate 71(Ray) 0 Offset 0
MemberDecorate 71(Ray) 1 Offset 12
MemberDecorate 71(Ray) 2 Offset 16
MemberDecorate 71(Ray) 3 Offset 28
Decorate 72 ArrayStride 32
MemberDecorate 73(Rays) 0 Offset 0
Decorate 73(Rays) BufferBlock
Decorate 75 DescriptorSet 0
Decorate 75 Binding 2
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 0
7: TypeFunction 6(int)
10: TypeRayQueryProvisionalKHR
11: TypePointer Function 10
12: TypeFloat 32
13: TypeVector 12(float) 3
14(Ray): TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
15: TypePointer Function 14(Ray)
16: TypeFunction 2 11(ptr) 15(ptr)
21: TypeVector 6(int) 3
22: TypePointer Input 21(ivec3)
23(gl_LaunchIDNV): 22(ptr) Variable Input
24: 6(int) Constant 2
25: TypePointer Input 6(int)
28(gl_LaunchSizeNV): 22(ptr) Variable Input
29: 6(int) Constant 0
33: 6(int) Constant 1
48: TypeAccelerationStructureKHR
49: TypePointer UniformConstant 48
50(rtas): 49(ptr) Variable UniformConstant
52: TypeInt 32 1
53: 52(int) Constant 0
54: TypePointer Function 13(fvec3)
57: 52(int) Constant 1
58: TypePointer Function 12(float)
61: 52(int) Constant 2
64: 52(int) Constant 3
67: TypePointer Function 6(int)
71(Ray): TypeStruct 13(fvec3) 12(float) 13(fvec3) 12(float)
72: TypeRuntimeArray 71(Ray)
73(Rays): TypeStruct 72
74: TypePointer Uniform 73(Rays)
75: 74(ptr) Variable Uniform
77: TypePointer Uniform 71(Ray)
4(main): 2 Function None 3
5: Label
68(index): 67(ptr) Variable Function
70(ray): 15(ptr) Variable Function
88(rayQuery1): 11(ptr) Variable Function
89(param): 11(ptr) Variable Function
91(param): 15(ptr) Variable Function
103(rayQuery2): 11(ptr) Variable Function
104(param): 11(ptr) Variable Function
106(param): 15(ptr) Variable Function
69: 6(int) FunctionCall 8(launchIndex()
Store 68(index) 69
76: 6(int) Load 68(index)
78: 77(ptr) AccessChain 75 53 76
79: 71(Ray) Load 78
80: 13(fvec3) CompositeExtract 79 0
81: 54(ptr) AccessChain 70(ray) 53
Store 81 80
82: 12(float) CompositeExtract 79 1
83: 58(ptr) AccessChain 70(ray) 57
Store 83 82
84: 13(fvec3) CompositeExtract 79 2
85: 54(ptr) AccessChain 70(ray) 61
Store 85 84
86: 12(float) CompositeExtract 79 3
87: 58(ptr) AccessChain 70(ray) 64
Store 87 86
90: 10 Load 88(rayQuery1)
Store 89(param) 90
92: 14(Ray) Load 70(ray)
Store 91(param) 92
93: 2 FunctionCall 19(doInitialize(rq1;struct-Ray-vf3-f1-vf3-f11;) 89(param) 91(param)
94: 48 Load 50(rtas)
95: 54(ptr) AccessChain 70(ray) 53
96: 13(fvec3) Load 95
97: 58(ptr) AccessChain 70(ray) 57
98: 12(float) Load 97
99: 54(ptr) AccessChain 70(ray) 61
100: 13(fvec3) Load 99
101: 58(ptr) AccessChain 70(ray) 64
102: 12(float) Load 101
RayQueryInitializeKHR 88(rayQuery1) 94 33 24 96 98 100 102
105: 10 Load 103(rayQuery2)
Store 104(param) 105
107: 14(Ray) Load 70(ray)
Store 106(param) 107
108: 2 FunctionCall 19(doInitialize(rq1;struct-Ray-vf3-f1-vf3-f11;) 104(param) 106(param)
Return
FunctionEnd
8(launchIndex(): 6(int) Function None 7
9: Label
26: 25(ptr) AccessChain 23(gl_LaunchIDNV) 24
27: 6(int) Load 26
30: 25(ptr) AccessChain 28(gl_LaunchSizeNV) 29
31: 6(int) Load 30
32: 6(int) IMul 27 31
34: 25(ptr) AccessChain 28(gl_LaunchSizeNV) 33
35: 6(int) Load 34
36: 6(int) IMul 32 35
37: 25(ptr) AccessChain 23(gl_LaunchIDNV) 33
38: 6(int) Load 37
39: 25(ptr) AccessChain 28(gl_LaunchSizeNV) 29
40: 6(int) Load 39
41: 6(int) IMul 38 40
42: 6(int) IAdd 36 41
43: 25(ptr) AccessChain 23(gl_LaunchIDNV) 29
44: 6(int) Load 43
45: 6(int) IAdd 42 44
ReturnValue 45
FunctionEnd
19(doInitialize(rq1;struct-Ray-vf3-f1-vf3-f11;): 2 Function None 16
17(rayQuery): 11(ptr) FunctionParameter
18(ray): 15(ptr) FunctionParameter
20: Label
51: 48 Load 50(rtas)
55: 54(ptr) AccessChain 18(ray) 53
56: 13(fvec3) Load 55
59: 58(ptr) AccessChain 18(ray) 57
60: 12(float) Load 59
62: 54(ptr) AccessChain 18(ray) 61
63: 13(fvec3) Load 62
65: 58(ptr) AccessChain 18(ray) 64
66: 12(float) Load 65
RayQueryInitializeKHR 17(rayQuery) 51 29 33 56 60 63 66
Return
FunctionEnd
rayQuery.rgen
// Module Version 10000
// Generated by (magic number): 80008
// Id's are bound by 46
Capability RayQueryProvisionalKHR
Capability RayTracingNV
Extension "SPV_KHR_ray_query"
Extension "SPV_NV_ray_tracing"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint RayGenerationKHR 4 "main"
Source GLSL 460
SourceExtension "GL_EXT_ray_query"
SourceExtension "GL_NV_ray_tracing"
Name 4 "main"
Name 8 "rayFlags"
Name 12 "tMin"
Name 14 "tMax"
Name 18 "localRayQuery"
Name 21 "accNV0"
Name 26 "block"
MemberName 26(block) 0 "dir"
MemberName 26(block) 1 "origin"
Name 28 ""
Decorate 21(accNV0) DescriptorSet 0
Decorate 21(accNV0) Binding 0
MemberDecorate 26(block) 0 Offset 0
MemberDecorate 26(block) 1 Offset 16
Decorate 26(block) BufferBlock
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 0
7: TypePointer Function 6(int)
9: 6(int) Constant 9
10: TypeFloat 32
11: TypePointer Function 10(float)
13: 10(float) Constant 0
15: 10(float) Constant 1148846080
16: TypeRayQueryProvisionalKHR
17: TypePointer Function 16
19: TypeAccelerationStructureKHR
20: TypePointer UniformConstant 19
21(accNV0): 20(ptr) Variable UniformConstant
24: 6(int) Constant 255
25: TypeVector 10(float) 3
26(block): TypeStruct 25(fvec3) 25(fvec3)
27: TypePointer ShaderRecordBufferKHR 26(block)
28: 27(ptr) Variable ShaderRecordBufferKHR
29: TypeInt 32 1
30: 29(int) Constant 1
31: TypePointer ShaderRecordBufferKHR 25(fvec3)
35: 29(int) Constant 0
40: TypeBool
4(main): 2 Function None 3
5: Label
8(rayFlags): 7(ptr) Variable Function
12(tMin): 11(ptr) Variable Function
14(tMax): 11(ptr) Variable Function
18(localRayQuery): 17(ptr) Variable Function
Store 8(rayFlags) 9
Store 12(tMin) 13
Store 14(tMax) 15
22: 19 Load 21(accNV0)
23: 6(int) Load 8(rayFlags)
32: 31(ptr) AccessChain 28 30
33: 25(fvec3) Load 32
34: 10(float) Load 12(tMin)
36: 31(ptr) AccessChain 28 35
37: 25(fvec3) Load 36
38: 10(float) Load 14(tMax)
RayQueryInitializeKHR 18(localRayQuery) 22 23 24 33 34 37 38
39: 16 Load 18(localRayQuery)
41: 40(bool) RayQueryProceedKHR 39
42: 40(bool) LogicalNot 41
SelectionMerge 44 None
BranchConditional 42 43 44
43: Label
45: 16 Load 18(localRayQuery)
RayQueryTerminateKHR 45
Branch 44
44: Label
Return
FunctionEnd
#version 460
#extension GL_NV_ray_tracing : enable
#extension GL_EXT_ray_query : enable
struct Ray
{
vec3 pos;
float tmin;
vec3 dir;
float tmax;
};
layout(std430, set = 0, binding = 0) buffer Log
{
uint x;
uint y;
};
layout(binding = 1, set = 0) uniform accelerationStructureNV rtas;
layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
void doSomething()
{
x = 0;
y = 0;
}
Ray makeRayDesc()
{
Ray ray;
ray.pos= vec3(0,0,0);
ray.dir = vec3(1,0,0);
ray.tmin = 0.0f;
ray.tmax = 9999.0;
return ray;
}
void main()
{
Ray ray;// = makeRayDesc();
rayQueryEXT rayQuery;
rayQueryInitializeEXT(rayQuery, rtas, 0, 0xFF, ray.pos, ray.tmin, ray.dir, ray.tmax);
mat4x3 _mat4x3;
mat3x4 _mat3x4;
while (rayQueryProceedEXT(rayQuery))
{
uint candidateType = rayQueryGetIntersectionTypeEXT(rayQuery, false);
switch(candidateType)
{
case gl_RayQueryCandidateIntersectionTriangleEXT:
rayQueryTerminateEXT(rayQuery);
_mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
_mat3x4 = transpose(_mat4x3);
rayQueryConfirmIntersectionEXT(rayQuery);
if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
{
doSomething();
}
if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).x == 0)
{
doSomething();
}
if (rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
{
doSomething();
}
if (rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
{
doSomething();
}
if (rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).x > 0)
{
doSomething();
}
if (rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
{
doSomething();
}
if (rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
{
doSomething();
}
if (rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
{
doSomething();
}
if (rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true) > 0)
{
doSomething();
}
break;
case gl_RayQueryCandidateIntersectionAABBEXT:
{
_mat4x3 = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, false);
_mat3x4 = transpose(_mat4x3);
if (rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery))
{
doSomething();
}
float t = 0.5;
rayQueryGenerateIntersectionEXT(rayQuery, t);
rayQueryTerminateEXT(rayQuery);
break;
}
}
}
if(_mat3x4[0][0] == _mat4x3[0][0])
{
doSomething();
}
uint committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);
switch(committedStatus)
{
case gl_RayQueryCommittedIntersectionNoneEXT :
_mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, false);
_mat3x4 = transpose(_mat4x3);
break;
case gl_RayQueryCommittedIntersectionTriangleEXT :
_mat4x3 = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
_mat3x4 = transpose(_mat4x3);
if (rayQueryGetIntersectionFrontFaceEXT(rayQuery, true))
{
doSomething();
}
if (rayQueryGetIntersectionBarycentricsEXT(rayQuery, true).y == 0)
{
doSomething();
}
break;
case gl_RayQueryCommittedIntersectionGeneratedEXT :
if(rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true) > 0)
{
doSomething();
}
if(rayQueryGetIntersectionInstanceIdEXT(rayQuery, true) > 0)
{
doSomething();
}
if(rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true) > 0)
{
doSomething();
}
if(rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true).z > 0)
{
doSomething();
}
if(rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true).x > 0)
{
doSomething();
}
if(rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true) > 0)
{
doSomething();
}
if(rayQueryGetIntersectionTEXT(rayQuery, true) > 0.f)
{
doSomething();
}
break;
}
if (_mat3x4[0][0] == _mat4x3[0][0])
{
doSomething();
}
if (rayQueryGetRayFlagsEXT(rayQuery) > 0)
{
doSomething();
}
if (rayQueryGetRayTMinEXT(rayQuery) > 0.0)
{
doSomething();
}
vec3 o = rayQueryGetWorldRayOriginEXT(rayQuery);
vec3 d = rayQueryGetWorldRayDirectionEXT(rayQuery);
if (o.x == d.z)
{
doSomething();
}
}
#version 460
#extension GL_NV_ray_tracing : enable
#extension GL_EXT_ray_query : enable
struct Ray
{
vec3 pos;
float tmin;
vec3 dir;
float tmax;
};
layout(binding = 0, set = 0) uniform accelerationStructureNV rtas;
layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
uint launchIndex()
{
return gl_LaunchIDNV.z*gl_LaunchSizeNV.x*gl_LaunchSizeNV.y + gl_LaunchIDNV.y*gl_LaunchSizeNV.x + gl_LaunchIDNV.x;
}
void doInitialize(rayQueryEXT rayQuery, Ray ray)
{
rayQueryInitializeEXT(rayQuery, rtas, 0, 1, ray.pos, ray.tmin, ray.dir, ray.tmax);
}
int C;
void main()
{
uint index = launchIndex();
Ray ray = rays[index];
rayQueryEXT rayQuery[2];
doInitialize(rayQuery[0], rays[index]);
rayQueryInitializeEXT(rayQuery[1], rtas, 1, 2, ray.pos, ray.tmin, ray.dir, ray.tmax);
doInitialize(rayQuery[C], ray);
}
#version 460
#extension GL_NV_ray_tracing : enable
#extension GL_EXT_ray_query : enable
struct Ray
{
vec3 pos;
float tmin;
vec3 dir;
float tmax;
};
layout(binding = 0, set = 0) uniform accelerationStructureNV rtas;
layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
layout(shaderRecordNV) buffer block
{
uint idx;
};
uint launchIndex()
{
return gl_LaunchIDNV.z*gl_LaunchSizeNV.x*gl_LaunchSizeNV.y + gl_LaunchIDNV.y*gl_LaunchSizeNV.x + gl_LaunchIDNV.x;
}
rayQueryEXT g_rayQueryArray[4];
rayQueryEXT g_rayQueryUnused;
void main()
{
uint index = launchIndex();
Ray ray = rays[index];
rayQueryEXT rayQuery0a;
rayQueryEXT rayQuery0b;
g_rayQueryArray[idx] = rayQuery0b; // Stored here, then overwritten with rayQuery0a
g_rayQueryArray[idx] = rayQuery0a;
// No separate allocation, just a handle copy
// optimizations should have eliminated load from global array
rayQueryEXT rayQuery0c = g_rayQueryArray[idx];
// rayQuery0a is the one actually used here
rayQueryInitializeEXT(rayQuery0c, rtas, gl_RayFlagsOpaqueEXT, 2, ray.pos, ray.tmin, ray.dir, ray.tmax);
// AllocateRayQuery occurs here, rather than next to allocas
// Should not be extray allocate, since above should allocate and copy
rayQueryEXT rayQuery1c;
// update the rayFlags as RAY_FLAG_FORCE_OPAQUE
rayQueryInitializeEXT(rayQuery1c, rtas, gl_RayFlagsOpaqueEXT, 1, ray.pos, ray.tmin, ray.dir, ray.tmax);
rayQueryInitializeEXT(rayQuery1c, rtas, 3, 4, ray.pos, ray.tmin, ray.dir, ray.tmax);
}
#version 460
#extension GL_NV_ray_tracing : enable
#extension GL_EXT_ray_query : enable
struct Ray
{
vec3 pos;
float tmin;
vec3 dir;
float tmax;
};
layout(binding = 0, set = 0) uniform accelerationStructureNV rtas;
layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
uint launchIndex()
{
return gl_LaunchIDNV.z*gl_LaunchSizeNV.x*gl_LaunchSizeNV.y + gl_LaunchIDNV.y*gl_LaunchSizeNV.x + gl_LaunchIDNV.x;
}
void doInitialize(rayQueryEXT rayQuery, Ray ray)
{
rayQueryInitializeEXT(rayQuery, rtas, 0, 1, ray.pos, ray.tmin, ray.dir, ray.tmax);
}
void main()
{
uint index = launchIndex();
Ray ray = rays[index];
rayQueryEXT rayQuery;
doInitialize(rayQuery, ray);
rayQueryInitializeEXT(rayQuery, rtas, 1, 2, ray.pos, ray.tmin, ray.dir, ray.tmax);
}
#version 460
#extension GL_NV_ray_tracing : enable
#extension GL_EXT_ray_query : enable
struct Ray
{
vec3 pos;
float tmin;
vec3 dir;
float tmax;
};
layout(binding = 0, set = 0) uniform accelerationStructureNV rtas;
layout(std430, set = 0, binding = 2) buffer Rays { Ray rays[]; };
uint launchIndex()
{
return gl_LaunchIDNV.z*gl_LaunchSizeNV.x*gl_LaunchSizeNV.y + gl_LaunchIDNV.y*gl_LaunchSizeNV.x + gl_LaunchIDNV.x;
}
void doInitialize(rayQueryEXT rayQuery, Ray ray)
{
rayQueryInitializeEXT(rayQuery, rtas, 0, 1, ray.pos, ray.tmin, ray.dir, ray.tmax);
}
void main()
{
uint index = launchIndex();
Ray ray = rays[index];
rayQueryEXT rayQuery1;
rayQueryEXT rayQuery2;
doInitialize(rayQuery1, ray);
rayQueryInitializeEXT(rayQuery1, rtas, 1, 2, ray.pos, ray.tmin, ray.dir, ray.tmax);
doInitialize(rayQuery2, ray);
}
#version 460
#extension GL_NV_ray_tracing : enable
#extension GL_EXT_ray_query : enable
layout(binding = 0, set = 0) uniform accelerationStructureNV accNV0;
layout(shaderRecordNV) buffer block
{
vec3 dir;
vec3 origin;
};
void main()
{
rayQueryEXT localRayQuery;
uint rayFlags = gl_RayFlagsOpaqueEXT | gl_RayFlagsSkipClosestHitShaderEXT;
float tMin = 0.f;
float tMax = 1000.f;
rayQueryInitializeEXT(localRayQuery, accNV0, rayFlags, 0xFF , origin, tMin, dir, tMax);
if (!rayQueryProceedEXT(localRayQuery))
{
rayQueryTerminateEXT(localRayQuery);
}
}
...@@ -1674,7 +1674,7 @@ public: ...@@ -1674,7 +1674,7 @@ public:
} }
virtual bool isOpaque() const { return basicType == EbtSampler virtual bool isOpaque() const { return basicType == EbtSampler
#ifndef GLSLANG_WEB #ifndef GLSLANG_WEB
|| basicType == EbtAtomicUint || basicType == EbtAccStruct || basicType == EbtRayQuery || basicType == EbtAtomicUint || basicType == EbtAccStruct
#endif #endif
; } ; }
virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; } virtual bool isBuiltIn() const { return getQualifier().builtIn != EbvNone; }
......
...@@ -4326,10 +4326,10 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV ...@@ -4326,10 +4326,10 @@ void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvV
// Builtins for GL_NV_ray_tracing/GL_EXT_ray_tracing/GL_EXT_ray_query // Builtins for GL_NV_ray_tracing/GL_EXT_ray_tracing/GL_EXT_ray_query
if (profile != EEsProfile && version >= 460) { if (profile != EEsProfile && version >= 460) {
commonBuiltins.append("void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);" commonBuiltins.append("void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);"
"bool rayQueryProceedEXT(rayQueryEXT);"
"void rayQueryTerminateEXT(rayQueryEXT);" "void rayQueryTerminateEXT(rayQueryEXT);"
"void rayQueryGenerateIntersectionEXT(rayQueryEXT, float);" "void rayQueryGenerateIntersectionEXT(rayQueryEXT, float);"
"void rayQueryConfirmIntersectionEXT(rayQueryEXT);" "void rayQueryConfirmIntersectionEXT(rayQueryEXT);"
"bool rayQueryProceedEXT(rayQueryEXT);"
"uint rayQueryGetIntersectionTypeEXT(rayQueryEXT, bool);" "uint rayQueryGetIntersectionTypeEXT(rayQueryEXT, bool);"
"float rayQueryGetRayTMinEXT(rayQueryEXT);" "float rayQueryGetRayTMinEXT(rayQueryEXT);"
"uint rayQueryGetRayFlagsEXT(rayQueryEXT);" "uint rayQueryGetRayFlagsEXT(rayQueryEXT);"
......
...@@ -540,7 +540,6 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const ...@@ -540,7 +540,6 @@ bool TIntermediate::isConversionAllowed(TOperator op, TIntermTyped* node) const
case EbtAtomicUint: case EbtAtomicUint:
case EbtSampler: case EbtSampler:
case EbtAccStruct: case EbtAccStruct:
case EbtRayQuery:
// opaque types can be passed to functions // opaque types can be passed to functions
if (op == EOpFunction) if (op == EOpFunction)
break; break;
......
...@@ -105,6 +105,7 @@ TEST_P(CompileVulkanToDebugSpirvTest, FromFile) ...@@ -105,6 +105,7 @@ TEST_P(CompileVulkanToDebugSpirvTest, FromFile)
"/baseResults/", false, true); "/baseResults/", false, true);
} }
TEST_P(CompileVulkan1_1ToSpirvTest, FromFile) TEST_P(CompileVulkan1_1ToSpirvTest, FromFile)
{ {
loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(), loadFileCompileAndCheck(GlobalTestSettings.testRoot, GetParam(),
...@@ -229,6 +230,12 @@ INSTANTIATE_TEST_CASE_P( ...@@ -229,6 +230,12 @@ INSTANTIATE_TEST_CASE_P(
"spv.while-continue-break.vert", "spv.while-continue-break.vert",
"spv.while-simple.vert", "spv.while-simple.vert",
// vulkan-specific tests // vulkan-specific tests
"rayQuery.rgen",
"rayQuery-array-2d-dynamic.rgen",
"rayQuery-decls.rgen",
"rayQuery-no-cse.rgen",
"rayQuery-initialize.rgen",
"rayQuery-allOps.rgen",
"spv.set.vert", "spv.set.vert",
"spv.double.comp", "spv.double.comp",
"spv.100ops.frag", "spv.100ops.frag",
...@@ -447,6 +454,7 @@ INSTANTIATE_TEST_CASE_P( ...@@ -447,6 +454,7 @@ INSTANTIATE_TEST_CASE_P(
FileNameAsCustomTestSuffix FileNameAsCustomTestSuffix
); );
// Cases with deliberately unreachable code. // Cases with deliberately unreachable code.
// By default the compiler will aggressively eliminate // By default the compiler will aggressively eliminate
// unreachable merges and continues. // unreachable merges and continues.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment