|
@@ -9883,6 +9883,8 @@ SpirvInstruction *SpirvEmitter::processReportHit(const CallExpr *callExpr) {
|
|
|
}
|
|
|
|
|
|
void SpirvEmitter::processCallShader(const CallExpr *callExpr) {
|
|
|
+ bool nvRayTracing =
|
|
|
+ featureManager.isExtensionEnabled(Extension::NV_ray_tracing);
|
|
|
SpirvInstruction *callDataLocInst = nullptr;
|
|
|
SpirvInstruction *callDataStageVar = nullptr;
|
|
|
const VarDecl *callDataArg = nullptr;
|
|
@@ -9937,10 +9939,16 @@ void SpirvEmitter::processCallShader(const CallExpr *callExpr) {
|
|
|
// Id)
|
|
|
llvm::SmallVector<SpirvInstruction *, 2> callShaderArgs;
|
|
|
callShaderArgs.push_back(doExpr(args[0]));
|
|
|
- callShaderArgs.push_back(callDataLocInst);
|
|
|
|
|
|
- spvBuilder.createRayTracingOpsNV(spv::Op::OpExecuteCallableNV, QualType(),
|
|
|
- callShaderArgs, callExpr->getExprLoc());
|
|
|
+ if (nvRayTracing) {
|
|
|
+ callShaderArgs.push_back(callDataLocInst);
|
|
|
+ spvBuilder.createRayTracingOpsNV(spv::Op::OpExecuteCallableNV, QualType(),
|
|
|
+ callShaderArgs, callExpr->getExprLoc());
|
|
|
+ } else {
|
|
|
+ callShaderArgs.push_back(callDataStageVar);
|
|
|
+ spvBuilder.createRayTracingOpsNV(spv::Op::OpExecuteCallableKHR, QualType(),
|
|
|
+ callShaderArgs, callExpr->getExprLoc());
|
|
|
+ }
|
|
|
|
|
|
// Copy data back to argument
|
|
|
tempLoad = spvBuilder.createLoad(callDataArg->getType(), callDataStageVar,
|
|
@@ -9950,6 +9958,9 @@ void SpirvEmitter::processCallShader(const CallExpr *callExpr) {
|
|
|
}
|
|
|
|
|
|
void SpirvEmitter::processTraceRay(const CallExpr *callExpr) {
|
|
|
+ bool nvRayTracing =
|
|
|
+ featureManager.isExtensionEnabled(Extension::NV_ray_tracing);
|
|
|
+
|
|
|
SpirvInstruction *rayPayloadLocInst = nullptr;
|
|
|
SpirvInstruction *rayPayloadStageVar = nullptr;
|
|
|
const VarDecl *rayPayloadArg = nullptr;
|
|
@@ -10047,10 +10058,16 @@ void SpirvEmitter::processTraceRay(const CallExpr *callExpr) {
|
|
|
traceArgs.push_back(tMin);
|
|
|
traceArgs.push_back(direction);
|
|
|
traceArgs.push_back(tMax);
|
|
|
- traceArgs.push_back(rayPayloadLocInst);
|
|
|
|
|
|
- spvBuilder.createRayTracingOpsNV(spv::Op::OpTraceNV, QualType(), traceArgs,
|
|
|
- callExpr->getExprLoc());
|
|
|
+ if (nvRayTracing) {
|
|
|
+ traceArgs.push_back(rayPayloadLocInst);
|
|
|
+ spvBuilder.createRayTracingOpsNV(spv::Op::OpTraceNV, QualType(), traceArgs,
|
|
|
+ callExpr->getExprLoc());
|
|
|
+ } else {
|
|
|
+ traceArgs.push_back(rayPayloadStageVar);
|
|
|
+ spvBuilder.createRayTracingOpsNV(spv::Op::OpTraceRayKHR, QualType(),
|
|
|
+ traceArgs, callExpr->getExprLoc());
|
|
|
+ }
|
|
|
|
|
|
// Copy arguments back to stage variable
|
|
|
tempLoad = spvBuilder.createLoad(rayPayloadArg->getType(), rayPayloadStageVar,
|
|
@@ -11626,9 +11643,6 @@ void SpirvEmitter::addFunctionToWorkQueue(hlsl::DXIL::ShaderKind shaderKind,
|
|
|
|
|
|
SpirvInstruction *
|
|
|
SpirvEmitter::processTraceRayInline(const CXXMemberCallExpr *expr) {
|
|
|
- emitWarning("SPV_KHR_ray_query is currently a provisional extension and "
|
|
|
- "might change in ways that are not backwards compatible",
|
|
|
- expr->getExprLoc());
|
|
|
const auto object = expr->getImplicitObjectArgument();
|
|
|
uint32_t templateFlags = hlsl::GetHLSLResourceTemplateUInt(object->getType());
|
|
|
const auto constFlags = spvBuilder.getConstantInt(
|
|
@@ -11709,9 +11723,6 @@ SpirvEmitter::processTraceRayInline(const CXXMemberCallExpr *expr) {
|
|
|
SpirvInstruction *
|
|
|
SpirvEmitter::processRayQueryIntrinsics(const CXXMemberCallExpr *expr,
|
|
|
hlsl::IntrinsicOp opcode) {
|
|
|
- emitWarning("SPV_KHR_ray_query is currently a provisional extension and "
|
|
|
- "might change in ways that are not backwards compatible",
|
|
|
- expr->getExprLoc());
|
|
|
const auto object = expr->getImplicitObjectArgument();
|
|
|
SpirvInstruction *rayqueryObj = loadIfAliasVarRef(object);
|
|
|
|