summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-03-05 12:14:59 -0500
committerGitHub <noreply@github.com>2020-03-05 12:14:59 -0500
commit3c7c38d1ee3f22b321da2227398b4400cd59db13 (patch)
tree76f8fcb0c52e026f676288ac3c6572fd3ce42b8e /source
parent6684d32db1f5693bcfb4971558cb30e855cd3bad (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.cpp31
-rw-r--r--source/slang-glslang/slang-glslang.h58
-rw-r--r--source/slang/slang-compiler.cpp47
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;