diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2020-03-05 12:14:59 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-05 12:14:59 -0500 |
| commit | 3c7c38d1ee3f22b321da2227398b4400cd59db13 (patch) | |
| tree | 76f8fcb0c52e026f676288ac3c6572fd3ce42b8e /source/slang-glslang | |
| parent | 6684d32db1f5693bcfb4971558cb30e855cd3bad (diff) | |
Safer binary compatibilty betwee 1.0 and 1.1 versions, without using struct embedding. (#1257)
Diffstat (limited to 'source/slang-glslang')
| -rw-r--r-- | source/slang-glslang/slang-glslang.cpp | 31 | ||||
| -rw-r--r-- | source/slang-glslang/slang-glslang.h | 58 |
2 files changed, 68 insertions, 21 deletions
diff --git a/source/slang-glslang/slang-glslang.cpp b/source/slang-glslang/slang-glslang.cpp index 4015e00d9..64680fe54 100644 --- a/source/slang-glslang/slang-glslang.cpp +++ b/source/slang-glslang/slang-glslang.cpp @@ -86,8 +86,7 @@ static void dumpDiagnostics( const glslang_CompileRequest_1_1& request, std::string const& log) { - const auto& request_1_0 = request.request_1_0; - dump(log.c_str(), log.length(), request_1_0.diagnosticFunc, request_1_0.diagnosticUserData, stderr); + dump(log.c_str(), log.length(), request.diagnosticFunc, request.diagnosticUserData, stderr); } // Apply the SPIRV-Tools optimizer to generated SPIR-V based on the desired optimization level @@ -302,10 +301,8 @@ static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_1& request) // Check that the encoding matches assert(glslang::EShTargetSpv_1_4 == _makeTargetLanguageVersion(1, 4)); - const auto& request_1_0 = request.request_1_0; - EShLanguage glslangStage; - switch( request_1_0.slangStage ) + switch( request.slangStage ) { #define CASE(SP, GL) case SLANG_STAGE_##SP: glslangStage = EShLang##GL; break CASE(VERTEX, Vertex); @@ -374,8 +371,8 @@ static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_1& request) glslang::TProgram* program = new glslang::TProgram(); auto programPtr = std::unique_ptr<glslang::TProgram>(program); - char const* sourceText = (char const*)request_1_0.inputBegin; - char const* sourceTextEnd = (char const*)request_1_0.inputEnd; + char const* sourceText = (char const*)request.inputBegin; + char const* sourceTextEnd = (char const*)request.inputEnd; int sourceTextLength = (int)(sourceTextEnd - sourceText); @@ -384,7 +381,7 @@ static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_1& request) shader->setStringsWithLengthsAndNames( &sourceText, &sourceTextLength, - &request_1_0.sourcePath, + &request.sourcePath, 1); EShMessages messages = EShMessages(EShMsgSpvRules | EShMsgVulkanRules); @@ -420,14 +417,14 @@ static int glslang_compileGLSLToSPIRV(const glslang_CompileRequest_1_1& request) spv::SpvBuildLogger logger; glslang::GlslangToSpv(*stageIntermediate, spirv, &logger); - if (request_1_0.optimizationLevel != SLANG_OPTIMIZATION_LEVEL_NONE) + if (request.optimizationLevel != SLANG_OPTIMIZATION_LEVEL_NONE) { - glslang_optimizeSPIRV(spirv, targetEnv, request_1_0.optimizationLevel, request_1_0.debugInfoType); + glslang_optimizeSPIRV(spirv, targetEnv, request.optimizationLevel, request.debugInfoType); } dumpDiagnostics(request, logger.getAllMessages()); - dump(spirv.data(), spirv.size() * sizeof(unsigned int), request_1_0.outputFunc, request_1_0.outputUserData, stdout); + dump(spirv.data(), spirv.size() * sizeof(unsigned int), request.outputFunc, request.outputUserData, stdout); } return 0; @@ -437,17 +434,15 @@ static int glslang_dissassembleSPIRV(const glslang_CompileRequest_1_1& request) { typedef unsigned int SPIRVWord; - auto& request_1_0 = request.request_1_0; - - SPIRVWord const* spirvBegin = (SPIRVWord const*)request_1_0.inputBegin; - SPIRVWord const* spirvEnd = (SPIRVWord const*)request_1_0.inputEnd; + SPIRVWord const* spirvBegin = (SPIRVWord const*)request.inputBegin; + SPIRVWord const* spirvEnd = (SPIRVWord const*)request.inputEnd; std::vector<SPIRVWord> spirv(spirvBegin, spirvEnd); std::stringstream spirvAsmStream; spv::Disassemble(spirvAsmStream, spirv); std::string result = spirvAsmStream.str(); - dump(result.c_str(), result.length(), request_1_0.outputFunc, request_1_0.outputUserData, stdout); + dump(result.c_str(), result.length(), request.outputFunc, request.outputUserData, stdout); return 0; } @@ -491,7 +486,7 @@ public: static int _compile(const glslang_CompileRequest_1_1& request) { int result = 0; - switch (request.request_1_0.action) + switch (request.action) { default: result = 1; @@ -563,6 +558,6 @@ int glslang_compile(glslang_CompileRequest_1_0* inRequest) glslang_CompileRequest_1_1 request; memset(&request, 0, sizeof(request)); request.sizeInBytes = sizeof(request); - request.request_1_0 = *inRequest; + request.set(*inRequest); return glslang_compile_1_1(&request); } diff --git a/source/slang-glslang/slang-glslang.h b/source/slang-glslang/slang-glslang.h index ac59e9bfa..88cab0bf9 100644 --- a/source/slang-glslang/slang-glslang.h +++ b/source/slang-glslang/slang-glslang.h @@ -17,8 +17,29 @@ struct glsl_SPIRVVersion int major, minor, patch; }; +#define SLANG_GLSLANG_COMPILE_REQUEST_1_0(x) \ + x(sourcePath) \ + x(inputBegin) \ + x(inputEnd) \ + x(diagnosticFunc) \ + x(diagnosticUserData) \ + x(outputFunc) \ + x(outputUserData) \ + x(slangStage) \ + x(action) \ + x(optimizationLevel) \ + x(debugInfoType) + +#define SLANG_GLSLANG_FIELD_COPY(name) name = in.name; + +// Pre-declare +struct glslang_CompileRequest_1_1; + +// 1.0 version struct glslang_CompileRequest_1_0 { + void set(const glslang_CompileRequest_1_1& in); + char const* sourcePath; void const* inputBegin; @@ -35,20 +56,51 @@ struct glslang_CompileRequest_1_0 unsigned action; unsigned optimizationLevel; - unsigned debugInfoType; + unsigned debugInfoType; }; - +// 1.1 version struct glslang_CompileRequest_1_1 { + /// Set from 1.0 + void set(const glslang_CompileRequest_1_0& in); + size_t sizeInBytes; ///< Size in bytes of this structure - glslang_CompileRequest_1_0 request_1_0; + // START! Embed the glslang_CompileRequest_1_0 fields + char const* sourcePath; + + void const* inputBegin; + void const* inputEnd; + + glslang_OutputFunc diagnosticFunc; + void* diagnosticUserData; + + glslang_OutputFunc outputFunc; + void* outputUserData; + + int slangStage; + + unsigned action; + + unsigned optimizationLevel; + unsigned debugInfoType; + // END! Embed the glslang_CompileRequest_1_0 fields const char* spirvTargetName; /// A valid TargetName. If null will use universal based on the spirVersion. glsl_SPIRVVersion spirvVersion; ///< The SPIR-V version. If all are 0 will use the default which is 1.2 currently }; +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) +{ + SLANG_GLSLANG_COMPILE_REQUEST_1_0(SLANG_GLSLANG_FIELD_COPY) +} + typedef int (*glslang_CompileFunc_1_0)(glslang_CompileRequest_1_0* request); typedef int (*glslang_CompileFunc_1_1)(glslang_CompileRequest_1_1* request); |
