diff options
| author | Yong He <yonghe@outlook.com> | 2023-10-09 14:03:43 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-10-09 14:03:43 -0700 |
| commit | 67e186f0169591c48d24bd8ff7e4e4e715e8fa45 (patch) | |
| tree | 9b46dc35145d18d5b25d9b3b16759c9b7343615c /source/slang/slang-emit.cpp | |
| parent | 17c7163c2ae8fc290e70b43d8700b68ef18b1ee1 (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.cpp | 32 |
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); |
