summaryrefslogtreecommitdiff
path: root/source/slang-glslang/slang-glslang.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-glslang/slang-glslang.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-glslang/slang-glslang.cpp')
-rw-r--r--source/slang-glslang/slang-glslang.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/source/slang-glslang/slang-glslang.cpp b/source/slang-glslang/slang-glslang.cpp
index 32834232f..fcaa9e70d 100644
--- a/source/slang-glslang/slang-glslang.cpp
+++ b/source/slang-glslang/slang-glslang.cpp
@@ -413,6 +413,32 @@ static void glslang_optimizeSPIRV(spv_target_env targetEnv, const glslang_Compil
}
}
+static int spirv_Optimize_1_2(const glslang_CompileRequest_1_2& request)
+{
+ std::vector<SPIRVOptimizationDiagnostic> diagnostics;
+ std::vector<uint32_t> spirvBuffer;
+ size_t inputBlobSize = (char*)request.inputEnd - (char*)request.inputBegin;
+ spirvBuffer.resize(inputBlobSize / sizeof(uint32_t));
+ memcpy(spirvBuffer.data(), request.inputBegin, inputBlobSize);
+
+ glslang_optimizeSPIRV(SPV_ENV_UNIVERSAL_1_5, request, diagnostics, spirvBuffer);
+ if (request.outputFunc)
+ {
+ request.outputFunc(spirvBuffer.data(), spirvBuffer.size() * sizeof(uint32_t), request.outputUserData);
+ }
+ if (request.diagnosticFunc)
+ {
+ for (auto& diagnostic : diagnostics)
+ {
+ request.diagnosticFunc(
+ (void*)diagnostic.message.c_str(),
+ diagnostic.message.size() * sizeof(char),
+ request.diagnosticUserData);
+ }
+ }
+ return SLANG_OK;
+}
+
static glslang::EShTargetLanguageVersion _makeTargetLanguageVersion(int majorVersion, int minorVersion)
{
return glslang::EShTargetLanguageVersion((uint32_t(majorVersion) << 16) | (uint32_t(minorVersion) << 8));
@@ -770,6 +796,10 @@ static int _compile(const glslang_CompileRequest_1_2& request)
case GLSLANG_ACTION_DISSASSEMBLE_SPIRV:
result = glslang_dissassembleSPIRV(request);
break;
+
+ case GLSLANG_ACTION_OPTIMIZE_SPIRV:
+ result = spirv_Optimize_1_2(request);
+ break;
}
return result;