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 | |
| parent | 6684d32db1f5693bcfb4971558cb30e855cd3bad (diff) | |
Safer binary compatibilty betwee 1.0 and 1.1 versions, without using struct embedding. (#1257)
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang-glslang/slang-glslang.cpp | 31 | ||||
| -rw-r--r-- | source/slang-glslang/slang-glslang.h | 58 | ||||
| -rw-r--r-- | source/slang/slang-compiler.cpp | 47 |
3 files changed, 89 insertions, 47 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); diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp index 4ee69f1ad..7eb5f145b 100644 --- a/source/slang/slang-compiler.cpp +++ b/source/slang/slang-compiler.cpp @@ -1063,8 +1063,6 @@ SlangResult dissassembleDXILUsingDXC( BackEndCompileRequest* slangCompileRequest, glslang_CompileRequest_1_1& request) { - auto& request_1_0 = request.request_1_0; - Session* session = slangCompileRequest->getSession(); auto sink = slangCompileRequest->getSink(); auto linkage = slangCompileRequest->getLinkage(); @@ -1087,11 +1085,11 @@ SlangResult dissassembleDXILUsingDXC( (*(StringBuilder*)userData).append((char const*)data, (char const*)data + size); }; - request_1_0.diagnosticFunc = diagnosticOutputFunc; - request_1_0.diagnosticUserData = &diagnosticOutput; + request.diagnosticFunc = diagnosticOutputFunc; + request.diagnosticUserData = &diagnosticOutput; - request_1_0.optimizationLevel = (unsigned)linkage->optimizationLevel; - request_1_0.debugInfoType = (unsigned)linkage->debugInfoLevel; + request.optimizationLevel = (unsigned)linkage->optimizationLevel; + request.debugInfoType = (unsigned)linkage->debugInfoLevel; int err = 1; if (glslang_compile_1_1) @@ -1100,7 +1098,9 @@ SlangResult dissassembleDXILUsingDXC( } else if (glslang_compile_1_0) { - err = glslang_compile_1_0(&request.request_1_0); + glslang_CompileRequest_1_0 request_1_0; + request_1_0.set(request); + err = glslang_compile_1_0(&request_1_0); } if (err) @@ -1130,19 +1130,16 @@ SlangResult dissassembleDXILUsingDXC( memset(&request, 0, sizeof(request)); request.sizeInBytes = sizeof(request); - { - auto& request_1_0 = request.request_1_0; - - request_1_0.action = GLSLANG_ACTION_DISSASSEMBLE_SPIRV; + + request.action = GLSLANG_ACTION_DISSASSEMBLE_SPIRV; - request_1_0.sourcePath = nullptr; + request.sourcePath = nullptr; - request_1_0.inputBegin = data; - request_1_0.inputEnd = (char*)data + size; + request.inputBegin = data; + request.inputEnd = (char*)data + size; - request_1_0.outputFunc = outputFunc; - request_1_0.outputUserData = &output; - } + request.outputFunc = outputFunc; + request.outputUserData = &output; SLANG_RETURN_ON_FAIL(invokeGLSLCompiler(slangRequest, request)); @@ -1481,14 +1478,12 @@ SlangResult dissassembleDXILUsingDXC( memset(&request, 0, sizeof(request)); request.sizeInBytes = sizeof(request); - auto& request_1_0 = request.request_1_0; - - request_1_0.action = GLSLANG_ACTION_COMPILE_GLSL_TO_SPIRV; - request_1_0.sourcePath = sourcePath.getBuffer(); - request_1_0.slangStage = (SlangStage)entryPoint->getStage(); + request.action = GLSLANG_ACTION_COMPILE_GLSL_TO_SPIRV; + request.sourcePath = sourcePath.getBuffer(); + request.slangStage = (SlangStage)entryPoint->getStage(); - request_1_0.inputBegin = rawGLSL.begin(); - request_1_0.inputEnd = rawGLSL.end(); + request.inputBegin = rawGLSL.begin(); + request.inputEnd = rawGLSL.end(); if (GLSLExtensionTracker* tracker = as<GLSLExtensionTracker>(source.extensionTracker.Ptr())) { @@ -1500,8 +1495,8 @@ SlangResult dissassembleDXILUsingDXC( request.spirvVersion.patch = spirvLanguageVersion.m_patch; } - request_1_0.outputFunc = outputFunc; - request_1_0.outputUserData = &spirvOut; + request.outputFunc = outputFunc; + request.outputUserData = &spirvOut; SLANG_RETURN_ON_FAIL(invokeGLSLCompiler(slangRequest, request)); return SLANG_OK; |
