From af61737e7ba107e9e92164bf39ce6ab34e05ce82 Mon Sep 17 00:00:00 2001 From: Yong He Date: Thu, 28 Sep 2023 18:08:06 -0700 Subject: [Direct SPIRV]: ray tracing pipeline intrinsics. (#3244) * Use a dedicated inst opcode to retrieve ray payload locations. * [Direct SPIRV]: ray tracing pipeline intrinsics. * Fix. --------- Co-authored-by: Yong He --- source/slang/slang-emit-spirv.cpp | 42 +++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'source/slang/slang-emit-spirv.cpp') diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index 7cfd9ffad..6bd781e62 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -1443,6 +1443,8 @@ struct SPIRVEmitContext return emitGlobalParam(as(inst)); case kIROp_GlobalVar: return emitGlobalVar(as(inst)); + case kIROp_SPIRVAsmOperandBuiltinVar: + return emitBuiltinVar(inst); case kIROp_Var: return emitVar(getSection(SpvLogicalSectionID::GlobalVariables), inst); // ... @@ -1934,6 +1936,16 @@ struct SPIRVEmitContext return varInst; } + SpvInst* emitBuiltinVar(IRInst* spvAsmBuiltinVar) + { + const auto kind = (SpvBuiltIn)(getIntVal(spvAsmBuiltinVar->getOperand(0))); + IRBuilder builder(spvAsmBuiltinVar); + builder.setInsertBefore(spvAsmBuiltinVar); + auto varInst = getBuiltinGlobalVar(builder.getPtrType(kIROp_PtrType, spvAsmBuiltinVar->getDataType(), SpvStorageClassInput), kind); + registerInst(spvAsmBuiltinVar, varInst); + return varInst; + } + /// Emit the given `irFunc` to SPIR-V SpvInst* emitFunc(IRFunc* irFunc) { @@ -2575,6 +2587,14 @@ struct SPIRVEmitContext case Stage::Geometry: requireSPIRVCapability(SpvCapabilityGeometry); break; + case Stage::Miss: + case Stage::AnyHit: + case Stage::ClosestHit: + case Stage::Intersection: + case Stage::RayGeneration: + case Stage::Callable: + requireSPIRVCapability(SpvCapabilityRayTracingKHR); + ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_ray_tracing")); default: break; } @@ -2721,6 +2741,15 @@ struct SPIRVEmitContext ); } break; + + case kIROp_VulkanCallablePayloadDecoration: + case kIROp_VulkanHitObjectAttributesDecoration: + case kIROp_VulkanRayPayloadDecoration: + emitOpDecorateLocation(getSection(SpvLogicalSectionID::Annotations), + decoration, + dstID, + SpvLiteralInteger::from32(int32_t(getIntVal(decoration->getOperand(0))))); + break; // ... } } @@ -2862,7 +2891,12 @@ struct SPIRVEmitContext CASE(Compute, GLCompute); CASE(Mesh, MeshEXT); CASE(Amplification, TaskEXT); - + CASE(ClosestHit, ClosestHitKHR); + CASE(AnyHit, AnyHitKHR); + CASE(Callable, CallableKHR); + CASE(Miss, MissKHR); + CASE(Intersection, IntersectionKHR); + CASE(RayGeneration, RayGenerationKHR); // TODO: Extended execution models for ray tracing, etc. #undef CASE @@ -4437,11 +4471,7 @@ struct SPIRVEmitContext } case kIROp_SPIRVAsmOperandBuiltinVar: { - const auto kind = (SpvBuiltIn)(getIntVal(operand->getOperand(0))); - IRBuilder builder(operand); - builder.setInsertBefore(operand); - auto varInst = getBuiltinGlobalVar(builder.getPtrType(kIROp_PtrType, operand->getDataType(), SpvStorageClassInput), kind); - emitOperand(varInst); + emitOperand(ensureInst(operand)); break; } case kIROp_SPIRVAsmOperandGLSL450Set: -- cgit v1.2.3