diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-07-13 12:10:08 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-07-13 13:00:38 -0700 |
| commit | 6d7be3694fbaae525b2f4463630c35bed487cd5b (patch) | |
| tree | a9bac151f79bba23df11c90d5906a3009dad29bd /tools | |
| parent | 4bc59f896c9df970ec27a57c397977fc4721d3cd (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.cpp | 69 | ||||
| -rw-r--r-- | tools/glslang/glslang.h | 12 |
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); |
