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 ++++++++++++++++++++++++++++++ source/slang-glslang/slang-glslang.h | 8 ++++---- 2 files changed, 34 insertions(+), 4 deletions(-) (limited to 'source/slang-glslang') 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; diff --git a/source/slang-glslang/slang-glslang.h b/source/slang-glslang/slang-glslang.h index 40c574e08..68c24d889 100644 --- a/source/slang-glslang/slang-glslang.h +++ b/source/slang-glslang/slang-glslang.h @@ -12,6 +12,7 @@ enum { GLSLANG_ACTION_COMPILE_GLSL_TO_SPIRV, GLSLANG_ACTION_DISSASSEMBLE_SPIRV, + GLSLANG_ACTION_OPTIMIZE_SPIRV, }; struct glsl_SPIRVVersion @@ -128,17 +129,17 @@ struct glslang_CompileRequest_1_2 const char* entryPointName; // The name of the entrypoint that will appear in output spirv. }; -void glslang_CompileRequest_1_0::set(const glslang_CompileRequest_1_1& in) +inline void glslang_CompileRequest_1_0::set(const glslang_CompileRequest_1_1& in) { SLANG_GLSLANG_COMPILE_REQUEST_1_0(SLANG_GLSLANG_FIELD_COPY) } -void glslang_CompileRequest_1_1::set(const glslang_CompileRequest_1_0& in) +inline void glslang_CompileRequest_1_1::set(const glslang_CompileRequest_1_0& in) { SLANG_GLSLANG_COMPILE_REQUEST_1_0(SLANG_GLSLANG_FIELD_COPY) } -void glslang_CompileRequest_1_2::set(const glslang_CompileRequest_1_1& in) +inline void glslang_CompileRequest_1_2::set(const glslang_CompileRequest_1_1& in) { memcpy(this, &in, sizeof(in)); } @@ -147,5 +148,4 @@ typedef int (*glslang_CompileFunc_1_0)(glslang_CompileRequest_1_0* request); typedef int (*glslang_CompileFunc_1_1)(glslang_CompileRequest_1_1* request); typedef int (*glslang_CompileFunc_1_2)(glslang_CompileRequest_1_2* request); - #endif -- cgit v1.2.3