diff options
| author | Yong He <yonghe@outlook.com> | 2023-09-28 18:08:06 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-28 18:08:06 -0700 |
| commit | af61737e7ba107e9e92164bf39ce6ab34e05ce82 (patch) | |
| tree | 37747b26fb951548256669124adb83c0246a8f32 /source/slang/slang-emit-spirv.cpp | |
| parent | b7d318f48db2cb83a41d665f1727ae93fc555124 (diff) | |
[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 <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-emit-spirv.cpp')
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 42 |
1 files changed, 36 insertions, 6 deletions
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<IRGlobalParam>(inst)); case kIROp_GlobalVar: return emitGlobalVar(as<IRGlobalVar>(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: |
