summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-spirv.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-09-28 18:08:06 -0700
committerGitHub <noreply@github.com>2023-09-28 18:08:06 -0700
commitaf61737e7ba107e9e92164bf39ce6ab34e05ce82 (patch)
tree37747b26fb951548256669124adb83c0246a8f32 /source/slang/slang-emit-spirv.cpp
parentb7d318f48db2cb83a41d665f1727ae93fc555124 (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.cpp42
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: