Skip to content

Commit

Permalink
Add support for GL_NV_cluster_acceleration_structure.
Browse files Browse the repository at this point in the history
  • Loading branch information
alelenv authored and jeremy-lunarg committed Feb 4, 2025
1 parent 1b65bd6 commit 39766a0
Show file tree
Hide file tree
Showing 23 changed files with 502 additions and 3 deletions.
3 changes: 3 additions & 0 deletions SPIRV/GLSL.ext.NV.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,7 @@ const char* const E_SPV_NV_tensor_addressing = "SPV_NV_tensor_addressing";
//SPV_NV_cooperative_matrix2
const char* const E_SPV_NV_cooperative_matrix2 = "SPV_NV_cooperative_matrix2";

//SPV_NV_cluster_acceleration_structure
const char* const E_SPV_NV_cluster_acceleration_structure = "SPV_NV_cluster_acceleration_structure";

#endif // #ifndef GLSLextNV_H
31 changes: 30 additions & 1 deletion SPIRV/GlslangToSpv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1022,6 +1022,10 @@ spv::BuiltIn TGlslangToSpvTraverser::TranslateBuiltInDecoration(glslang::TBuiltI
builder.addCapability(spv::CapabilityRayTracingDisplacementMicromapNV);
builder.addExtension("SPV_NV_displacement_micromap");
return spv::BuiltInHitKindBackFacingMicroTriangleNV;
case glslang::EbvClusterIDNV:
builder.addCapability(spv::CapabilityRayTracingClusterAccelerationStructureNV);
builder.addExtension("SPV_NV_cluster_acceleration_structure");
return spv::BuiltInClusterIDNV;

// barycentrics
case glslang::EbvBaryCoordNV:
Expand Down Expand Up @@ -2654,6 +2658,7 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
case glslang::EOpHitObjectRecordEmptyNV:
case glslang::EOpHitObjectGetShaderBindingTableRecordIndexNV:
case glslang::EOpHitObjectGetShaderRecordBufferHandleNV:
case glslang::EOpHitObjectGetClusterIdNV:
return true;
default:
return false;
Expand Down Expand Up @@ -3454,6 +3459,12 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
builder.addCapability(spv::CapabilityDisplacementMicromapNV);
break;

case glslang::EOpRayQueryGetIntersectionClusterIdNV:
builder.addExtension(spv::E_SPV_NV_cluster_acceleration_structure);
builder.addCapability(spv::CapabilityRayQueryKHR);
builder.addCapability(spv::CapabilityRayTracingClusterAccelerationStructureNV);
break;

case glslang::EOpDebugPrintf:
noReturnValue = true;
break;
Expand Down Expand Up @@ -3521,6 +3532,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
case glslang::EOpHitObjectRecordMissNV:
case glslang::EOpHitObjectRecordMissMotionNV:
case glslang::EOpHitObjectGetAttributesNV:
case glslang::EOpHitObjectGetClusterIdNV:
if (arg == 0)
lvalue = true;
break;
Expand All @@ -3543,6 +3555,7 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
case glslang::EOpRayQueryGetIntersectionObjectRayOrigin:
case glslang::EOpRayQueryGetIntersectionObjectToWorld:
case glslang::EOpRayQueryGetIntersectionWorldToObject:
case glslang::EOpRayQueryGetIntersectionClusterIdNV:
if (arg == 0)
lvalue = true;
break;
Expand Down Expand Up @@ -3771,7 +3784,8 @@ bool TGlslangToSpvTraverser::visitAggregate(glslang::TVisit visit, glslang::TInt
glslangOp == glslang::EOpRayQueryGetIntersectionObjectRayOrigin ||
glslangOp == glslang::EOpRayQueryGetIntersectionObjectToWorld ||
glslangOp == glslang::EOpRayQueryGetIntersectionWorldToObject ||
glslangOp == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT
glslangOp == glslang::EOpRayQueryGetIntersectionTriangleVertexPositionsEXT ||
glslangOp == glslang::EOpRayQueryGetIntersectionClusterIdNV
)) {
bool cond = glslangOperands[arg]->getAsConstantUnion()->getConstArray()[0].getBConst();
operands.push_back(builder.makeIntConstant(cond ? 1 : 0));
Expand Down Expand Up @@ -7740,6 +7754,13 @@ spv::Id TGlslangToSpvTraverser::createUnaryOperation(glslang::TOperator op, OpDe
unaryOp = spv::OpHitObjectGetShaderRecordBufferHandleNV;
break;

case glslang::EOpHitObjectGetClusterIdNV:
unaryOp = spv::OpHitObjectGetClusterIdNV;
builder.addExtension(spv::E_SPV_NV_cluster_acceleration_structure);
builder.addCapability(spv::CapabilityShaderInvocationReorderNV);
builder.addCapability(spv::CapabilityRayTracingClusterAccelerationStructureNV);
break;

case glslang::EOpFetchMicroTriangleVertexPositionNV:
unaryOp = spv::OpFetchMicroTriangleVertexPositionNV;
break;
Expand Down Expand Up @@ -9326,6 +9347,10 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);
opCode = spv::OpRayQueryGetIntersectionObjectToWorldKHR;
break;
case glslang::EOpRayQueryGetIntersectionClusterIdNV:
typeId = builder.makeIntegerType(32, 1);
opCode = spv::OpRayQueryGetIntersectionClusterIdNV;
break;
case glslang::EOpRayQueryGetIntersectionWorldToObject:
typeId = builder.makeMatrixType(builder.makeFloatType(32), 4, 3);
opCode = spv::OpRayQueryGetIntersectionWorldToObjectKHR;
Expand Down Expand Up @@ -9451,6 +9476,10 @@ spv::Id TGlslangToSpvTraverser::createMiscOperation(glslang::TOperator op, spv::
typeId = builder.makeVectorType(builder.makeUintType(32), 2);
opCode = spv::OpHitObjectGetShaderRecordBufferHandleNV;
break;
case glslang::EOpHitObjectGetClusterIdNV:
typeId = builder.makeIntegerType(32, 1);
opCode = spv::OpHitObjectGetClusterIdNV;
break;
case glslang::EOpReorderThreadNV: {
if (operands.size() == 2) {
builder.createNoResultOp(spv::OpReorderThreadWithHintNV, operands);
Expand Down
12 changes: 12 additions & 0 deletions SPIRV/doc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,7 @@ const char* BuiltInString(int builtIn)
// case BuiltInInvocationsPerPixelNV: return "InvocationsPerPixelNV"; // superseded by BuiltInFragInvocationCountEXT
case BuiltInBaryCoordKHR: return "BaryCoordKHR";
case BuiltInBaryCoordNoPerspKHR: return "BaryCoordNoPerspKHR";
case BuiltInClusterIDNV: return "ClusterIDNV";

case BuiltInFragSizeEXT: return "FragSizeEXT";
case BuiltInFragInvocationCountEXT: return "FragInvocationCountEXT";
Expand Down Expand Up @@ -1097,6 +1098,8 @@ const char* CapabilityString(int info)
case CapabilityDotProductInput4x8BitKHR: return "DotProductInput4x8BitKHR";
case CapabilityDotProductInput4x8BitPackedKHR: return "DotProductInput4x8BitPackedKHR";

case CapabilityRayTracingClusterAccelerationStructureNV: return "RayTracingClusterAccelerationStructureNV";

default: return "Bad";
}
}
Expand Down Expand Up @@ -1549,6 +1552,7 @@ const char* OpcodeString(int op)
case OpRayQueryGetIntersectionObjectToWorldKHR: return "OpRayQueryGetIntersectionObjectToWorldKHR";
case OpRayQueryGetIntersectionWorldToObjectKHR: return "OpRayQueryGetIntersectionWorldToObjectKHR";
case OpRayQueryGetIntersectionTriangleVertexPositionsKHR: return "OpRayQueryGetIntersectionTriangleVertexPositionsKHR";
case OpRayQueryGetIntersectionClusterIdNV: return "OpRayQueryGetIntersectionClusterIdNV";

case OpTypeCooperativeMatrixNV: return "OpTypeCooperativeMatrixNV";
case OpCooperativeMatrixLoadNV: return "OpCooperativeMatrixLoadNV";
Expand Down Expand Up @@ -1626,6 +1630,7 @@ const char* OpcodeString(int op)
case OpHitObjectIsMissNV: return "OpHitObjectIsMissNV";
case OpHitObjectGetShaderBindingTableRecordIndexNV: return "OpHitObjectGetShaderBindingTableRecordIndexNV";
case OpHitObjectGetShaderRecordBufferHandleNV: return "OpHitObjectGetShaderRecordBufferHandleNV";
case OpHitObjectGetClusterIdNV: return "OpHitObjectGetClusterIdNV";

case OpFetchMicroTriangleVertexBarycentricNV: return "OpFetchMicroTriangleVertexBarycentricNV";
case OpFetchMicroTriangleVertexPositionNV: return "OpFetchMicroTriangleVertexPositionNV";
Expand Down Expand Up @@ -3213,6 +3218,10 @@ void Parameterize()
InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].operands.push(OperandId, "'Committed'");
InstructionDesc[OpRayQueryGetIntersectionTriangleVertexPositionsKHR].setResultAndType(true, true);

InstructionDesc[OpRayQueryGetIntersectionClusterIdNV].operands.push(OperandId, "'RayQuery'");
InstructionDesc[OpRayQueryGetIntersectionClusterIdNV].operands.push(OperandId, "'Committed'");
InstructionDesc[OpRayQueryGetIntersectionClusterIdNV].setResultAndType(true, true);

InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Sampled Image'");
InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Coordinate'");
InstructionDesc[OpImageSampleFootprintNV].operands.push(OperandId, "'Granularity'");
Expand Down Expand Up @@ -3532,6 +3541,9 @@ void Parameterize()
InstructionDesc[OpHitObjectTraceRayMotionNV].operands.push(OperandId, "'Payload'");
InstructionDesc[OpHitObjectTraceRayMotionNV].setResultAndType(false, false);

InstructionDesc[OpHitObjectGetClusterIdNV].operands.push(OperandId, "'HitObject'");
InstructionDesc[OpHitObjectGetClusterIdNV].setResultAndType(true, true);

InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Acceleration Structure'");
InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Instance ID'");
InstructionDesc[OpFetchMicroTriangleVertexBarycentricNV].operands.push(OperandId, "'Geometry Index'");
Expand Down
6 changes: 6 additions & 0 deletions SPIRV/spirv.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -786,6 +786,7 @@ enum BuiltIn {
BuiltInSMIDNV = 5377,
BuiltInHitKindFrontFacingMicroTriangleNV = 5405,
BuiltInHitKindBackFacingMicroTriangleNV = 5406,
BuiltInClusterIDNV = 5436,
BuiltInCullMaskKHR = 6021,
BuiltInMax = 0x7fffffff,
};
Expand Down Expand Up @@ -1177,6 +1178,7 @@ enum Capability {
CapabilityCooperativeMatrixTensorAddressingNV = 5433,
CapabilityCooperativeMatrixBlockLoadsNV = 5434,
CapabilityCooperativeVectorTrainingNV = 5435,
CapabilityRayTracingClusterAccelerationStructureNV = 5437,
CapabilityTensorAddressingNV = 5439,
CapabilitySubgroupShuffleINTEL = 5568,
CapabilitySubgroupBufferBlockIOINTEL = 5569,
Expand Down Expand Up @@ -1994,6 +1996,8 @@ enum Op {
OpTypeAccelerationStructureKHR = 5341,
OpTypeAccelerationStructureNV = 5341,
OpExecuteCallableNV = 5344,
OpRayQueryGetIntersectionClusterIdNV = 5345,
OpHitObjectGetClusterIdNV = 5346,
OpTypeCooperativeMatrixNV = 5358,
OpCooperativeMatrixLoadNV = 5359,
OpCooperativeMatrixStoreNV = 5360,
Expand Down Expand Up @@ -2747,6 +2751,7 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
case OpHitObjectIsEmptyNV: *hasResult = true; *hasResultType = true; break;
case OpHitObjectIsHitNV: *hasResult = true; *hasResultType = true; break;
case OpHitObjectIsMissNV: *hasResult = true; *hasResultType = true; break;
case OpHitObjectGetClusterIdNV: *hasResult = true; *hasResultType = true; break;
case OpReorderThreadWithHitObjectNV: *hasResult = false; *hasResultType = false; break;
case OpReorderThreadWithHintNV: *hasResult = false; *hasResultType = false; break;
case OpTypeHitObjectNV: *hasResult = true; *hasResultType = false; break;
Expand Down Expand Up @@ -3042,6 +3047,7 @@ inline void HasResultAndType(Op opcode, bool *hasResult, bool *hasResultType) {
case OpRayQueryGetWorldRayOriginKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionObjectToWorldKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionWorldToObjectKHR: *hasResult = true; *hasResultType = true; break;
case OpRayQueryGetIntersectionClusterIdNV: *hasResult = true; *hasResultType = true; break;
case OpAtomicFAddEXT: *hasResult = true; *hasResultType = true; break;
case OpTypeBufferSurfaceINTEL: *hasResult = true; *hasResultType = false; break;
case OpTypeStructContinuedINTEL: *hasResult = false; *hasResultType = false; break;
Expand Down
59 changes: 59 additions & 0 deletions Test/baseResults/spv.nv.cluster-allops.frag.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
spv.nv.cluster-allops.frag
// Module Version 10400
// Generated by (magic number): 8000b
// Id's are bound by 31

Capability Shader
Capability RayQueryKHR
Capability RayTracingClusterAccelerationStructureNV
Extension "SPV_KHR_ray_query"
Extension "SPV_NV_cluster_acceleration_structure"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint Fragment 4 "main" 11 30
ExecutionMode 4 OriginUpperLeft
Source GLSL 460
SourceExtension "GL_EXT_ray_query"
SourceExtension "GL_NV_cluster_acceleration_structure"
Name 4 "main"
Name 8 "id_candidate"
Name 11 "rq"
Name 16 "id_committed"
Name 21 "test"
Name 30 "as"
Decorate 30(as) Binding 1
Decorate 30(as) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: TypeRayQueryKHR
10: TypePointer Private 9
11(rq): 10(ptr) Variable Private
12: TypeBool
13: 12(bool) ConstantFalse
14: 6(int) Constant 0
17: 12(bool) ConstantTrue
18: 6(int) Constant 1
20: TypePointer Function 12(bool)
23: 6(int) Constant 4294967295
28: TypeAccelerationStructureKHR
29: TypePointer UniformConstant 28
30(as): 29(ptr) Variable UniformConstant
4(main): 2 Function None 3
5: Label
8(id_candidate): 7(ptr) Variable Function
16(id_committed): 7(ptr) Variable Function
21(test): 20(ptr) Variable Function
15: 6(int) RayQueryGetIntersectionClusterIdNV 11(rq) 14
Store 8(id_candidate) 15
19: 6(int) RayQueryGetIntersectionClusterIdNV 11(rq) 18
Store 16(id_committed) 19
22: 6(int) Load 8(id_candidate)
24: 12(bool) IEqual 22 23
25: 6(int) Load 16(id_committed)
26: 12(bool) IEqual 25 23
27: 12(bool) LogicalAnd 24 26
Store 21(test) 27
Return
FunctionEnd
68 changes: 68 additions & 0 deletions Test/baseResults/spv.nv.cluster-allops.rahit.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
spv.nv.cluster-allops.rahit
// Module Version 10400
// Generated by (magic number): 8000b
// Id's are bound by 35

Capability RayQueryKHR
Capability RayTracingKHR
Capability RayTracingClusterAccelerationStructureNV
Extension "SPV_KHR_ray_query"
Extension "SPV_KHR_ray_tracing"
Extension "SPV_NV_cluster_acceleration_structure"
1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450
EntryPoint AnyHitKHR 4 "main" 10 15 34
Source GLSL 460
SourceExtension "GL_EXT_ray_query"
SourceExtension "GL_EXT_ray_tracing"
SourceExtension "GL_NV_cluster_acceleration_structure"
Name 4 "main"
Name 8 "clusterid"
Name 10 "gl_ClusterIDNV"
Name 12 "id_candidate"
Name 15 "rq"
Name 20 "id_committed"
Name 25 "test"
Name 34 "as"
Decorate 10(gl_ClusterIDNV) BuiltIn ClusterIDNV
Decorate 34(as) Binding 1
Decorate 34(as) DescriptorSet 0
2: TypeVoid
3: TypeFunction 2
6: TypeInt 32 1
7: TypePointer Function 6(int)
9: TypePointer Input 6(int)
10(gl_ClusterIDNV): 9(ptr) Variable Input
13: TypeRayQueryKHR
14: TypePointer Private 13
15(rq): 14(ptr) Variable Private
16: TypeBool
17: 16(bool) ConstantFalse
18: 6(int) Constant 0
21: 16(bool) ConstantTrue
22: 6(int) Constant 1
24: TypePointer Function 16(bool)
27: 6(int) Constant 4294967295
32: TypeAccelerationStructureKHR
33: TypePointer UniformConstant 32
34(as): 33(ptr) Variable UniformConstant
4(main): 2 Function None 3
5: Label
8(clusterid): 7(ptr) Variable Function
12(id_candidate): 7(ptr) Variable Function
20(id_committed): 7(ptr) Variable Function
25(test): 24(ptr) Variable Function
11: 6(int) Load 10(gl_ClusterIDNV)
Store 8(clusterid) 11
19: 6(int) RayQueryGetIntersectionClusterIdNV 15(rq) 18
Store 12(id_candidate) 19
23: 6(int) RayQueryGetIntersectionClusterIdNV 15(rq) 22
Store 20(id_committed) 23
26: 6(int) Load 12(id_candidate)
28: 16(bool) IEqual 26 27
29: 6(int) Load 20(id_committed)
30: 16(bool) IEqual 29 27
31: 16(bool) LogicalAnd 28 30
Store 25(test) 31
Return
FunctionEnd
Loading

0 comments on commit 39766a0

Please sign in to comment.