diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 64 |
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) { |
