Fix SPV return type of rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT (#2484)

Issue #2483

According to GLSL spec the prototype is:
        uint rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQueryEXT q, bool committed);

but that was incorrectly getting translated to SPIRV as an `int`, and this was
causing SPIR-V validation errors when used.

Added explicit testing for the return types of all the builtin functions in GL_EXT_ray_query
This commit is contained in:
Daniel Koch 2020-12-12 12:34:24 -05:00 committed by GitHub
parent ab66a91d62
commit c0bcfaf3ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 202 additions and 4 deletions

View File

@ -7991,7 +7991,7 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
opCode = spv::OpRayQueryGetIntersectionInstanceIdKHR;
break;
case glslang::EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset:
typeId = builder.makeIntType(32);
typeId = builder.makeUintType(32);
opCode = spv::OpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR;
break;
case glslang::EOpRayQueryGetIntersectionGeometryIndex:

View File

@ -223,7 +223,7 @@ rayQuery-allOps.comp
129: 2 FunctionCall 6(doSomething()
Branch 128
128: Label
130: 18(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
130: 14(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
131: 66(bool) UGreaterThan 130 20
SelectionMerge 133 None
BranchConditional 131 132 133

View File

@ -221,7 +221,7 @@ rayQuery-allOps.frag
129: 2 FunctionCall 6(doSomething()
Branch 128
128: Label
130: 18(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
130: 14(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
131: 66(bool) UGreaterThan 130 20
SelectionMerge 133 None
BranchConditional 131 132 133

View File

@ -221,7 +221,7 @@ rayQuery-allOps.rgen
129: 2 FunctionCall 6(doSomething()
Branch 128
128: Label
130: 18(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
130: 14(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 47(rayQuery) 23
131: 66(bool) UGreaterThan 130 20
SelectionMerge 133 None
BranchConditional 131 132 133

View File

@ -0,0 +1,152 @@
rayQuery-types.comp
// Module Version 10000
// Generated by (magic number): 8000a
// Id's are bound by 86
Capability Shader
Capability RayQueryKHR
Extension "SPV_KHR_ray_query"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint GLCompute 4 "main"
ExecutionMode 4 LocalSize 16 8 1
Source GLSL 460
SourceExtension "GL_EXT_ray_query"
Name 4 "main"
Name 8 "rayQuery"
Name 11 "tlas"
Name 25 "rq_proceed"
Name 35 "intersectionType"
Name 41 "rayTMin"
Name 43 "rayFlags"
Name 46 "worldRayOrigin"
Name 48 "worldDirection"
Name 50 "intersectionT"
Name 53 "customIndex"
Name 55 "instanceId"
Name 57 "sbtOffset"
Name 59 "geometryIndex"
Name 61 "primitiveIndex"
Name 65 "barys"
Name 67 "frontface"
Name 69 "aabbOpaque"
Name 71 "objRayDirection"
Name 73 "objRayOrigin"
Name 77 "objToWorld"
Name 79 "worldToObj"
Decorate 11(tlas) DescriptorSet 0
Decorate 11(tlas) Binding 0
Decorate 85 BuiltIn WorkgroupSize
2: TypeVoid
3: TypeFunction 2
6: TypeRayQueryKHR
7: TypePointer Private 6
8(rayQuery): 7(ptr) Variable Private
9: TypeAccelerationStructureKHR
10: TypePointer UniformConstant 9
11(tlas): 10(ptr) Variable UniformConstant
13: TypeInt 32 0
14: 13(int) Constant 0
15: 13(int) Constant 255
16: TypeFloat 32
17: TypeVector 16(float) 3
18: 16(float) Constant 0
19: 17(fvec3) ConstantComposite 18 18 18
20: 16(float) Constant 1065353216
21: 17(fvec3) ConstantComposite 20 18 18
22: 16(float) Constant 1176256512
23: TypeBool
24: TypePointer Function 23(bool)
34: TypePointer Function 13(int)
36: 23(bool) ConstantTrue
37: TypeInt 32 1
38: 37(int) Constant 1
40: TypePointer Function 16(float)
45: TypePointer Function 17(fvec3)
52: TypePointer Function 37(int)
63: TypeVector 16(float) 2
64: TypePointer Function 63(fvec2)
75: TypeMatrix 17(fvec3) 4
76: TypePointer Function 75
81: TypeVector 13(int) 3
82: 13(int) Constant 16
83: 13(int) Constant 8
84: 13(int) Constant 1
85: 81(ivec3) ConstantComposite 82 83 84
4(main): 2 Function None 3
5: Label
25(rq_proceed): 24(ptr) Variable Function
35(intersectionType): 34(ptr) Variable Function
41(rayTMin): 40(ptr) Variable Function
43(rayFlags): 34(ptr) Variable Function
46(worldRayOrigin): 45(ptr) Variable Function
48(worldDirection): 45(ptr) Variable Function
50(intersectionT): 40(ptr) Variable Function
53(customIndex): 52(ptr) Variable Function
55(instanceId): 52(ptr) Variable Function
57(sbtOffset): 34(ptr) Variable Function
59(geometryIndex): 52(ptr) Variable Function
61(primitiveIndex): 52(ptr) Variable Function
65(barys): 64(ptr) Variable Function
67(frontface): 24(ptr) Variable Function
69(aabbOpaque): 24(ptr) Variable Function
71(objRayDirection): 45(ptr) Variable Function
73(objRayOrigin): 45(ptr) Variable Function
77(objToWorld): 76(ptr) Variable Function
79(worldToObj): 76(ptr) Variable Function
12: 9 Load 11(tlas)
RayQueryInitializeKHR 8(rayQuery) 12 14 15 19 18 21 22
26: 23(bool) RayQueryProceedKHR 8(rayQuery)
Store 25(rq_proceed) 26
Branch 27
27: Label
LoopMerge 29 30 None
Branch 31
31: Label
32: 23(bool) Load 25(rq_proceed)
BranchConditional 32 28 29
28: Label
33: 23(bool) RayQueryProceedKHR 8(rayQuery)
Store 25(rq_proceed) 33
Branch 30
30: Label
Branch 27
29: Label
39: 13(int) RayQueryGetIntersectionTypeKHR 8(rayQuery) 38
Store 35(intersectionType) 39
42: 16(float) RayQueryGetRayTMinKHR 8(rayQuery)
Store 41(rayTMin) 42
44: 13(int) RayQueryGetRayFlagsKHR 8(rayQuery)
Store 43(rayFlags) 44
47: 17(fvec3) RayQueryGetWorldRayOriginKHR 8(rayQuery)
Store 46(worldRayOrigin) 47
49: 17(fvec3) RayQueryGetWorldRayDirectionKHR 8(rayQuery)
Store 48(worldDirection) 49
51: 16(float) RayQueryGetIntersectionTKHR 8(rayQuery) 38
Store 50(intersectionT) 51
54: 37(int) RayQueryGetIntersectionInstanceCustomIndexKHR 8(rayQuery) 38
Store 53(customIndex) 54
56: 37(int) RayQueryGetIntersectionInstanceIdKHR 8(rayQuery) 38
Store 55(instanceId) 56
58: 13(int) RayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetKHR 8(rayQuery) 38
Store 57(sbtOffset) 58
60: 37(int) RayQueryGetIntersectionGeometryIndexKHR 8(rayQuery) 38
Store 59(geometryIndex) 60
62: 37(int) RayQueryGetIntersectionPrimitiveIndexKHR 8(rayQuery) 38
Store 61(primitiveIndex) 62
66: 63(fvec2) RayQueryGetIntersectionBarycentricsKHR 8(rayQuery) 38
Store 65(barys) 66
68: 23(bool) RayQueryGetIntersectionFrontFaceKHR 8(rayQuery) 38
Store 67(frontface) 68
70: 23(bool) RayQueryGetIntersectionCandidateAABBOpaqueKHR 8(rayQuery)
Store 69(aabbOpaque) 70
72: 17(fvec3) RayQueryGetIntersectionObjectRayDirectionKHR 8(rayQuery) 38
Store 71(objRayDirection) 72
74: 17(fvec3) RayQueryGetIntersectionObjectRayOriginKHR 8(rayQuery) 38
Store 73(objRayOrigin) 74
78: 75 RayQueryGetIntersectionObjectToWorldKHR 8(rayQuery) 38
Store 77(objToWorld) 78
80: 75 RayQueryGetIntersectionWorldToObjectKHR 8(rayQuery) 38
Store 79(worldToObj) 80
Return
FunctionEnd

45
Test/rayQuery-types.comp Normal file
View File

@ -0,0 +1,45 @@
#version 460
#extension GL_EXT_ray_query : require
layout(local_size_x = 16, local_size_y = 8, local_size_z = 1) in;
layout(binding = 0, set = 0) uniform accelerationStructureEXT tlas;
void main()
{
rayQueryEXT rayQuery;
rayQueryInitializeEXT(rayQuery, // Ray query
tlas, // Top-level acceleration structure
0, // Ray flags
0xFF, // 8-bit instance mask
vec3(0), // Ray origin
0.0, // Minimum t-value
vec3(1, 0, 0), // Ray direction
10000.0); // Maximum t-value
// yes this is silly, just want to verify the return types
bool rq_proceed = rayQueryProceedEXT(rayQuery);
while(rq_proceed)
{
rq_proceed = rayQueryProceedEXT(rayQuery);
}
const uint intersectionType = rayQueryGetIntersectionTypeEXT(rayQuery, true);
const float rayTMin = rayQueryGetRayTMinEXT(rayQuery);
const uint rayFlags = rayQueryGetRayFlagsEXT(rayQuery);
const vec3 worldRayOrigin = rayQueryGetWorldRayOriginEXT(rayQuery);
const vec3 worldDirection = rayQueryGetWorldRayDirectionEXT(rayQuery);
const float intersectionT = rayQueryGetIntersectionTEXT(rayQuery, true);
const int customIndex = rayQueryGetIntersectionInstanceCustomIndexEXT(rayQuery, true);
const int instanceId = rayQueryGetIntersectionInstanceIdEXT(rayQuery, true);
const uint sbtOffset = rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQuery, true);
const int geometryIndex = rayQueryGetIntersectionGeometryIndexEXT(rayQuery, true);
const int primitiveIndex = rayQueryGetIntersectionPrimitiveIndexEXT(rayQuery, true);
const vec2 barys = rayQueryGetIntersectionBarycentricsEXT(rayQuery, true);
const bool frontface = rayQueryGetIntersectionFrontFaceEXT(rayQuery, true);
const bool aabbOpaque = rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQuery);
const vec3 objRayDirection = rayQueryGetIntersectionObjectRayDirectionEXT(rayQuery, true);
const vec3 objRayOrigin = rayQueryGetIntersectionObjectRayOriginEXT(rayQuery, true);
const mat4x3 objToWorld = rayQueryGetIntersectionObjectToWorldEXT(rayQuery, true);
const mat4x3 worldToObj = rayQueryGetIntersectionWorldToObjectEXT(rayQuery, true);
}

View File

@ -241,6 +241,7 @@ INSTANTIATE_TEST_SUITE_P(
"rayQuery-allOps.frag",
"rayQuery-initialization.Error.comp",
"rayQuery-global.rgen",
"rayQuery-types.comp",
"spv.set.vert",
"spv.double.comp",
"spv.100ops.frag",