From c0be5552e883dfea27add015bf23919219b57bc5 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 29 Mar 2015 18:29:20 +0100 Subject: [PATCH] Extract command line #defines to fxc, roll them in when editing shaders --- .../driver/d3d11/shaders/dxbc_inspect.cpp | 45 +++++++++++++++++++ .../PipelineState/D3D11PipelineStateViewer.cs | 3 ++ 2 files changed, 48 insertions(+) diff --git a/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp b/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp index db074a1ce..8c6cc9b8f 100644 --- a/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp +++ b/renderdoc/driver/d3d11/shaders/dxbc_inspect.cpp @@ -1554,6 +1554,51 @@ SPDBChunk::SPDBChunk(void *chunk, uint32_t firstInstructionOffset) } } } + else if(!strcmp(key, "hlslDefines")) + { + string cmdlineDefines = "// Command line defines:\n\n"; + + char *c = value; + + while(*c) + { + // skip whitespace + while(*c && (*c == ' ' || *c == '\t' || *c == '\n')) + c++; + + if(*c == 0) break; + + // start of a definition + if(c[0] == '/' && c[1] == 'D') + { + c += 2; + // skip whitespace + while(*c && (*c == ' ' || *c == '\t' || *c == '\n')) c++; + + if(*c == 0) break; + + char *defstart = c; + char *defend = strchr(c, '='); + + if(defend == 0) break; + + c = defend+1; + + char *valstart = c; + + // skip to end or next whitespace + while(*c && *c != ' ' && *c != '\t' && *c != '\n') c++; + + char *valend = c; + + cmdlineDefines += "#define "; + cmdlineDefines += string(defstart, defend) + " " + string(valstart, valend); + cmdlineDefines += "\n"; + } + } + + Files.push_back(make_pair("@cmdline", cmdlineDefines)); + } key = value + strlen(value) + 1; } diff --git a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs index 4e3292ffb..3ff508559 100644 --- a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs @@ -1962,6 +1962,9 @@ namespace renderdocui.Windows.PipelineState offs = compileSource.IndexOf("#include"); } + if (updatedfiles.ContainsKey("@cmdline")) + compileSource = updatedfiles["@cmdline"] + "\n\n" + compileSource; + // invoke off to the ReplayRenderer to replace the log's shader // with our edited one m_Core.Renderer.BeginInvoke((ReplayRenderer r) =>