summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-10-09 14:03:43 -0700
committerGitHub <noreply@github.com>2023-10-09 14:03:43 -0700
commit67e186f0169591c48d24bd8ff7e4e4e715e8fa45 (patch)
tree9b46dc35145d18d5b25d9b3b16759c9b7343615c /source/slang/slang-emit.cpp
parent17c7163c2ae8fc290e70b43d8700b68ef18b1ee1 (diff)
Run curated spirv-opt passes through slang-glslang. (#3266)
* Run curated spirv-opt passes through slang-glslang. * Cleanup. * Replace spirv-dis downstream compiler with glslang. * delete slang-spirv-opt.cpp. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-emit.cpp')
-rw-r--r--source/slang/slang-emit.cpp32
1 files changed, 28 insertions, 4 deletions
diff --git a/source/slang/slang-emit.cpp b/source/slang/slang-emit.cpp
index 86136a010..57ca736e3 100644
--- a/source/slang/slang-emit.cpp
+++ b/source/slang/slang-emit.cpp
@@ -73,7 +73,6 @@
#include "slang-legalize-types.h"
#include "slang-lower-to-ir.h"
#include "slang-mangle.h"
-#include "slang-spirv-opt.h"
#include "slang-syntax.h"
#include "slang-type-layout.h"
#include "slang-visitor.h"
@@ -931,8 +930,7 @@ Result linkAndOptimizeIR(
if (isKhronosTarget(targetRequest) && targetRequest->shouldEmitSPIRVDirectly())
{
- //performIntrinsicFunctionFunctionInlining(irModule);
- performSpirvInlining(irModule);
+ performIntrinsicFunctionFunctionInlining(irModule);
eliminateDeadCode(irModule);
}
eliminateMultiLevelBreak(irModule);
@@ -1289,10 +1287,36 @@ SlangResult emitSPIRVForEntryPointsDirectly(
spirv = _Move(outSpirv);
}
#endif
-
auto artifact = ArtifactUtil::createArtifactForCompileTarget(asExternal(codeGenContext->getTargetFormat()));
artifact->addRepresentationUnknown(ListBlob::moveCreate(spirv));
+ IDownstreamCompiler* compiler = codeGenContext->getSession()->getOrLoadDownstreamCompiler(
+ PassThroughMode::SpirvOpt, codeGenContext->getSink());
+ if (compiler)
+ {
+ ComPtr<IArtifact> optimizedArtifact;
+ DownstreamCompileOptions downstreamOptions;
+ downstreamOptions.sourceArtifacts = makeSlice(artifact.readRef(), 1);
+ downstreamOptions.targetType = SLANG_SPIRV;
+ downstreamOptions.sourceLanguage = SLANG_SOURCE_LANGUAGE_SPIRV;
+ auto linkage = codeGenContext->getLinkage();
+ switch (linkage->optimizationLevel)
+ {
+ case OptimizationLevel::None: downstreamOptions.optimizationLevel = DownstreamCompileOptions::OptimizationLevel::None; break;
+ case OptimizationLevel::Default: downstreamOptions.optimizationLevel = DownstreamCompileOptions::OptimizationLevel::Default; break;
+ case OptimizationLevel::High: downstreamOptions.optimizationLevel = DownstreamCompileOptions::OptimizationLevel::High; break;
+ case OptimizationLevel::Maximal: downstreamOptions.optimizationLevel = DownstreamCompileOptions::OptimizationLevel::Maximal; break;
+ default: SLANG_ASSERT(!"Unhandled optimization level"); break;
+ }
+
+ if (SLANG_SUCCEEDED(compiler->compile(downstreamOptions, optimizedArtifact.writeRef())))
+ {
+ artifact = _Move(optimizedArtifact);
+ }
+
+ SLANG_RETURN_ON_FAIL(passthroughDownstreamDiagnostics(codeGenContext->getSink(), compiler, artifact));
+ }
+
ArtifactUtil::addAssociated(artifact, linkedIR.metadata);
outArtifact.swap(artifact);