From 21bbebb19dfdbbee107b9fd9830e18d5fb6a573a Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Mon, 10 Jun 2024 16:29:56 -0400 Subject: Address glslang ordering requirments for 'derivative_group_*NV' (#4323) * Address glslang ordering requirments for 'derivative_group_*NV' fixes: #4305 The solution is to emit some `layout`s after a module source is emitted. Added to slangs gfx backend code to enable the compute shader derivative extension for testing purposes. * address review * enable removed test --------- Co-authored-by: Yong He --- source/slang/slang-emit-c-like.cpp | 7 +++++-- source/slang/slang-emit-c-like.h | 8 ++++++-- source/slang/slang-emit-glsl.cpp | 8 +++----- source/slang/slang-emit.cpp | 4 ++++ 4 files changed, 18 insertions(+), 9 deletions(-) (limited to 'source') diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index d85c72ae5..6412ff730 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -129,9 +129,12 @@ void CLikeSourceEmitter::emitPreModuleImpl() m_writer->emit(prelude->getStringSlice()); m_writer->emit("\n"); } - for (auto prelude : m_requiredPreludesRaw) +} +void CLikeSourceEmitter::emitPostModuleImpl() +{ + if(m_requiredAfter.requireComputeDerivatives.getLength() > 0) { - m_writer->emit(prelude); + m_writer->emit(m_requiredAfter.requireComputeDerivatives); m_writer->emit("\n"); } } diff --git a/source/slang/slang-emit-c-like.h b/source/slang/slang-emit-c-like.h index 9b39aa6f4..ecff57296 100644 --- a/source/slang/slang-emit-c-like.h +++ b/source/slang/slang-emit-c-like.h @@ -431,7 +431,7 @@ public: void emitFrontMatter(TargetRequest* targetReq) { emitFrontMatterImpl(targetReq); } void emitPreModule() { emitPreModuleImpl(); } - + void emitPostModule() { emitPostModuleImpl(); } void emitModule(IRModule* module, DiagnosticSink* sink) { m_irModule = module; emitModuleImpl(module, sink); } @@ -476,6 +476,7 @@ public: /// For example on targets that don't have built in vector/matrix support, this is where /// the appropriate generated declarations occur. virtual void emitPreModuleImpl(); + virtual void emitPostModuleImpl(); virtual void beforeComputeEmitActions(IRModule* module) { SLANG_UNUSED(module); }; @@ -590,8 +591,11 @@ public: // to use for it when emitting code. Dictionary m_mapInstToName; - OrderedHashSet m_requiredPreludesRaw; OrderedHashSet m_requiredPreludes; + struct RequiredAfter + { + String requireComputeDerivatives; + }m_requiredAfter; }; } diff --git a/source/slang/slang-emit-glsl.cpp b/source/slang/slang-emit-glsl.cpp index 8063fcc1d..d13bc96d1 100644 --- a/source/slang/slang-emit-glsl.cpp +++ b/source/slang/slang-emit-glsl.cpp @@ -2208,9 +2208,7 @@ void GLSLSourceEmitter::handleRequiredCapabilitiesImpl(IRInst* inst) { // only allowed 1 of derivative_group_quadsNV or derivative_group_linearNV if (m_entryPointStage != Stage::Compute - || m_requiredPreludesRaw.contains("layout(derivative_group_quadsNV) in;") - || m_requiredPreludesRaw.contains("layout(derivative_group_linearNV) in;") - ) + || m_requiredAfter.requireComputeDerivatives.getLength() > 0) return; _requireGLSLExtension(UnownedStringSlice("GL_NV_compute_shader_derivatives")); @@ -2225,12 +2223,12 @@ void GLSLSourceEmitter::handleRequiredCapabilitiesImpl(IRInst* inst) if (isQuad) { verifyComputeDerivativeGroupModifiers(getSink(), inst->sourceLoc, true, false, numThreadsDecor); - m_requiredPreludesRaw.add("layout(derivative_group_quadsNV) in;"); + m_requiredAfter.requireComputeDerivatives = "layout(derivative_group_quadsNV) in;"; } else { verifyComputeDerivativeGroupModifiers(getSink(), inst->sourceLoc, false, true, numThreadsDecor); - m_requiredPreludesRaw.add("layout(derivative_group_linearNV) in;"); + m_requiredAfter.requireComputeDerivatives = "layout(derivative_group_linearNV) in;"; } } } diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp index da348fa64..6d0ab1daa 100644 --- a/source/slang/slang-emit.cpp +++ b/source/slang/slang-emit.cpp @@ -1587,6 +1587,10 @@ SlangResult CodeGenContext::emitEntryPointsSourceFromIR(ComPtr& outAr // Append the modules output code finalResult.append(code); + // Append all content that should be at the end of a module + sourceEmitter->emitPostModule(); + finalResult.append(sourceWriter.getContentAndClear()); + // Write out the result auto artifact = ArtifactUtil::createArtifactForCompileTarget(asExternal(target)); -- cgit v1.2.3