From 67e186f0169591c48d24bd8ff7e4e4e715e8fa45 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 9 Oct 2023 14:03:43 -0700 Subject: 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 --- source/slang-glslang/slang-glslang.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'source/slang-glslang/slang-glslang.cpp') 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 diagnostics; + std::vector 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; -- cgit v1.2.3