diff options
Diffstat (limited to 'source/slang-glslang/slang-glslang.cpp')
| -rw-r--r-- | source/slang-glslang/slang-glslang.cpp | 30 |
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; |
