summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-emit-spirv.cpp64
1 files changed, 36 insertions, 28 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 266f3b7e9..8ecbe1bc7 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -3640,35 +3640,20 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
}
case kIROp_RequireMaximallyReconverges:
- if (auto entryPointsUsingInst =
- getReferencingEntryPoints(m_referencingEntryPoints, getParentFunc(inst)))
- {
- ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_maximal_reconvergence"));
- for (IRFunc* entryPoint : *entryPointsUsingInst)
- {
- requireSPIRVExecutionMode(
- nullptr,
- getIRInstSpvID(entryPoint),
- SpvExecutionModeMaximallyReconvergesKHR);
- }
- }
+ ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_maximal_reconvergence"));
+ requireSPIRVExecutionModeOnReferencingEntryPoints(
+ nullptr,
+ getParentFunc(inst),
+ SpvExecutionModeMaximallyReconvergesKHR);
break;
case kIROp_RequireQuadDerivatives:
- if (auto entryPointsUsingInst =
- getReferencingEntryPoints(m_referencingEntryPoints, getParentFunc(inst)))
- {
- ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_quad_control"));
- requireSPIRVCapability(SpvCapabilityQuadControlKHR);
- for (IRFunc* entryPoint : *entryPointsUsingInst)
- {
- requireSPIRVExecutionMode(
- nullptr,
- getIRInstSpvID(entryPoint),
- SpvExecutionModeQuadDerivativesKHR);
- }
- }
+ ensureExtensionDeclaration(UnownedStringSlice("SPV_KHR_quad_control"));
+ requireSPIRVCapability(SpvCapabilityQuadControlKHR);
+ requireSPIRVExecutionModeOnReferencingEntryPoints(
+ nullptr,
+ getParentFunc(inst),
+ SpvExecutionModeQuadDerivativesKHR);
break;
-
case kIROp_Return:
if (as<IRReturn>(inst)->getVal()->getOp() == kIROp_VoidLit)
result = emitOpReturn(parent, inst);
@@ -3691,9 +3676,9 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
case kIROp_BeginFragmentShaderInterlock:
ensureExtensionDeclaration(UnownedStringSlice("SPV_EXT_fragment_shader_interlock"));
requireSPIRVCapability(SpvCapabilityFragmentShaderPixelInterlockEXT);
- requireSPIRVExecutionMode(
+ requireSPIRVExecutionModeOnReferencingEntryPoints(
nullptr,
- getIRInstSpvID(getParentFunc(inst)),
+ getParentFunc(inst),
SpvExecutionModePixelInterlockOrderedEXT);
result = emitOpBeginInvocationInterlockEXT(parent, inst);
break;
@@ -8280,6 +8265,29 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex
}
}
+ // Applies execution mode to entry points that reference `childFunc`.
+ template<typename... Operands>
+ void requireSPIRVExecutionModeOnReferencingEntryPoints(
+ IRInst* parentInst,
+ IRFunc* childFunc,
+ SpvExecutionMode executionMode,
+ const Operands&... ops)
+ {
+
+ if (auto entryPointsUsingInst =
+ getReferencingEntryPoints(m_referencingEntryPoints, childFunc))
+ {
+ for (IRFunc* entryPoint : *entryPointsUsingInst)
+ {
+ requireSPIRVExecutionMode(
+ parentInst,
+ getIRInstSpvID(entryPoint),
+ executionMode,
+ ops...);
+ }
+ }
+ }
+
SPIRVEmitContext(IRModule* module, TargetProgram* program, DiagnosticSink* sink)
: SPIRVEmitSharedContext(module, program, sink), m_irModule(module), m_memoryArena(2048)
{