summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-07-13 12:10:08 -0700
committerTim Foley <tfoley@nvidia.com>2017-07-13 13:00:38 -0700
commit6d7be3694fbaae525b2f4463630c35bed487cd5b (patch)
treea9bac151f79bba23df11c90d5906a3009dad29bd /tools
parent4bc59f896c9df970ec27a57c397977fc4721d3cd (diff)
Add support for dumping intermediates for debugging.
Calling: spSetDumpIntermedites(compileRequest, true); will set up a mode where Slang tries to dump every intermediate HLSL, GLSL, DXBC, SPIR-V, etc. file it generates. If SPIR-V or DXBC is requested then we also dump assembly of those. Right now the files are all named as `slang-<counter>.<ext>`, and get dropped in whatever the working directory is, but I'm open to ideas on how to improve that. Note: this change introduces a new binary interface to `glslang`, so pulling it requires an updated `glslang.dll`.
Diffstat (limited to 'tools')
-rw-r--r--tools/glslang/glslang.cpp69
-rw-r--r--tools/glslang/glslang.h12
2 files changed, 60 insertions, 21 deletions
diff --git a/tools/glslang/glslang.cpp b/tools/glslang/glslang.cpp
index f07937b97..98bcf14d6 100644
--- a/tools/glslang/glslang.cpp
+++ b/tools/glslang/glslang.cpp
@@ -78,12 +78,8 @@ static void dumpDiagnostics(
dump(log.c_str(), log.length(), request->diagnosticFunc, request->diagnosticUserData, stderr);
}
-extern "C"
-_declspec(dllexport)
-int glslang_compile(glslang_CompileRequest* request)
+static int glslang_compileGLSLToSPIRV(glslang_CompileRequest* request)
{
- glslang::InitializeProcess();
-
EShLanguage glslangStage;
switch( request->slangStage )
{
@@ -109,12 +105,15 @@ int glslang_compile(glslang_CompileRequest* request)
glslang::TProgram* program = new glslang::TProgram();
auto programPtr = std::unique_ptr<glslang::TProgram>(program);
- int sourceTextLength = (int) strlen(request->sourceText);
+ char const* sourceText = (char const*)request->inputBegin;
+ char const* sourceTextEnd = (char const*)request->inputEnd;
+
+ int sourceTextLength = (int)(sourceTextEnd - sourceText);
shader->setPreamble("#extension GL_GOOGLE_cpp_style_line_directive : require\n");
shader->setStringsWithLengthsAndNames(
- &request->sourceText,
+ &sourceText,
&sourceTextLength,
&request->sourcePath,
1);
@@ -163,20 +162,52 @@ int glslang_compile(glslang_CompileRequest* request)
dumpDiagnostics(request, logger.getAllMessages());
- if (request->disassembleResult)
- {
- std::stringstream spirvAsmStream;
- spv::Disassemble(spirvAsmStream, spirv);
- std::string result = spirvAsmStream.str();
- dump(result.c_str(), result.length(), request->outputFunc, request->outputUserData, stdout);
- }
- else
- {
- dump(spirv.data(), spirv.size() * sizeof(unsigned int), request->outputFunc, request->outputUserData, stdout);
- }
+ dump(spirv.data(), spirv.size() * sizeof(unsigned int), request->outputFunc, request->outputUserData, stdout);
}
- glslang::FinalizeProcess();
+ return 0;
+}
+
+static int glslang_dissassembleSPIRV(glslang_CompileRequest* request)
+{
+ typedef unsigned int SPIRVWord;
+
+ 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->outputFunc, request->outputUserData, stdout);
return 0;
}
+
+extern "C"
+_declspec(dllexport)
+int glslang_compile(glslang_CompileRequest* request)
+{
+ glslang::InitializeProcess();
+
+ int result = 0;
+ switch(request->action)
+ {
+ default:
+ result = 1;
+ break;
+
+ case GLSLANG_ACTION_COMPILE_GLSL_TO_SPIRV:
+ result = glslang_compileGLSLToSPIRV(request);
+ break;
+
+ case GLSLANG_ACTION_DISSASSEMBLE_SPIRV:
+ result = glslang_dissassembleSPIRV(request);
+ break;
+ }
+
+ glslang::FinalizeProcess();
+
+ return result;
+}
diff --git a/tools/glslang/glslang.h b/tools/glslang/glslang.h
index 8686f019e..f02d43882 100644
--- a/tools/glslang/glslang.h
+++ b/tools/glslang/glslang.h
@@ -4,10 +4,18 @@
typedef void (*glslang_OutputFunc)(void const* data, size_t size, void* userData);
+enum
+{
+ GLSLANG_ACTION_COMPILE_GLSL_TO_SPIRV,
+ GLSLANG_ACTION_DISSASSEMBLE_SPIRV,
+};
+
struct glslang_CompileRequest
{
char const* sourcePath;
- char const* sourceText;
+
+ void const* inputBegin;
+ void const* inputEnd;
glslang_OutputFunc diagnosticFunc;
void* diagnosticUserData;
@@ -17,7 +25,7 @@ struct glslang_CompileRequest
int slangStage;
- bool disassembleResult;
+ unsigned action;
};
typedef int (*glslang_CompileFunc)(glslang_CompileRequest* request);