From 16ac0efa3e1e834e3b12af8ac34cf47a6418bb34 Mon Sep 17 00:00:00 2001 From: Darren Wihandi <65404740+fairywreath@users.noreply.github.com> Date: Fri, 21 Mar 2025 10:31:07 -0400 Subject: Apply pixel interlock execution mode to entry-point functions only (#6661) Co-authored-by: Ellie Hermaszewska --- source/slang/slang-emit-spirv.cpp | 64 ++++++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 28 deletions(-) (limited to 'source') 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(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 + 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) { -- cgit v1.2.3