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-glslang | |
| 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-glslang')
| -rw-r--r-- | source/slang-glslang/slang-glslang.cpp | 30 | ||||
| -rw-r--r-- | source/slang-glslang/slang-glslang.h | 8 |
2 files changed, 34 insertions, 4 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; 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 |
