From 475c0dab7c1af2a6cae34d8a33db0b4cf4826f97 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 13 Sep 2014 18:05:57 +0100 Subject: [PATCH] Improve type display in constant buffer previewer --- renderdoc/api/replay/shader_types.h | 2 + renderdoc/core/replay_proxy.cpp | 2 + renderdoc/driver/d3d11/d3d11_analyse.cpp | 12 ++++++ renderdoc/driver/gl/gl_replay.cpp | 7 ++++ renderdocui/Interop/Shader.cs | 47 ++++++++++++++++-------- 5 files changed, 54 insertions(+), 16 deletions(-) diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h index da8ede0d0..5e43f62a2 100644 --- a/renderdoc/api/replay/shader_types.h +++ b/renderdoc/api/replay/shader_types.h @@ -85,6 +85,8 @@ struct ShaderVariable uint32_t uv[16]; } value; + bool32 isStruct; + rdctype::array members; }; diff --git a/renderdoc/core/replay_proxy.cpp b/renderdoc/core/replay_proxy.cpp index d664e390a..e4c98d4f2 100644 --- a/renderdoc/core/replay_proxy.cpp +++ b/renderdoc/core/replay_proxy.cpp @@ -542,6 +542,8 @@ void Serialiser::Serialise(const char *name, ShaderVariable &el) Serialise<16>("", el.value.uv); + Serialise("", el.isStruct); + Serialise("", el.members); } diff --git a/renderdoc/driver/d3d11/d3d11_analyse.cpp b/renderdoc/driver/d3d11/d3d11_analyse.cpp index c13fa5ea9..50945f28f 100644 --- a/renderdoc/driver/d3d11/d3d11_analyse.cpp +++ b/renderdoc/driver/d3d11/d3d11_analyse.cpp @@ -92,14 +92,20 @@ void D3D11DebugManager::FillCBufferVariables(const string &prefix, size_t &offse FillCBufferVariables("", vec, flatten, invars[v].type.members, mems, data); + vr.isStruct = true; + vr.members = mems; varmembers.push_back(vr); } } + + var.isStruct = false; } else { + var.isStruct = true; + if(flatten) FillCBufferVariables(basename + ".", vec, flatten, invars[v].type.members, outvars, data); else @@ -168,6 +174,7 @@ void D3D11DebugManager::FillCBufferVariables(const string &prefix, size_t &offse combinedName += ", " + basename; outvars[outIdx].name = combinedName; outvars[outIdx].rows = 1; + outvars[outIdx].isStruct = false; outvars[outIdx].columns += cols; if(dataOffset < data.size()) @@ -182,6 +189,7 @@ void D3D11DebugManager::FillCBufferVariables(const string &prefix, size_t &offse outvars[outIdx].name = basename; outvars[outIdx].rows = 1; outvars[outIdx].type = type; + outvars[outIdx].isStruct = false; outvars[outIdx].columns = cols; ShaderVariable &var = outvars[outIdx]; @@ -289,6 +297,7 @@ void D3D11DebugManager::FillCBufferVariables(const string &prefix, size_t &offse (*out)[outIdx+r].name = base + buf; (*out)[outIdx+r].rows = (uint32_t)rowCopy; (*out)[outIdx+r].type = type; + (*out)[outIdx+r].isStruct = false; (*out)[outIdx+r].columns = regLen; size_t dataOffset = (vec+r*rowCopy)*16; @@ -311,7 +320,10 @@ void D3D11DebugManager::FillCBufferVariables(const string &prefix, size_t &offse } if(!flatten) + { + var.isStruct = false; var.members = varmembers; + } } } } diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 6458b4250..6fcda2e78 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -1214,6 +1214,7 @@ void GLReplay::FillCBufferVariables(WrappedOpenGL &gl, GLuint prog, bool bufferB { vector ov; FillCBufferVariables(gl, prog, bufferBacked, prefix + var.name.elems + ".", variables[i].type.members, ov, data); + var.isStruct = true; var.members = ov; } else @@ -1227,10 +1228,13 @@ void GLReplay::FillCBufferVariables(WrappedOpenGL &gl, GLuint prog, bool bufferB vector ov; FillCBufferVariables(gl, prog, bufferBacked, prefix + arrEl.name.elems + ".", variables[i].type.members, ov, data); arrEl.members = ov; + + arrEl.isStruct = true; arrelems.push_back(arrEl); } var.members = arrelems; + var.isStruct = false; var.rows = var.columns = 0; } } @@ -1277,10 +1281,13 @@ void GLReplay::FillCBufferVariables(WrappedOpenGL &gl, GLuint prog, bool bufferB FillCBufferValue(gl, prog, bufferBacked, desc.rowMajorStorage ? true : false, values[0] + values[2] * a, values[1], data, el); + el.isStruct = false; + elems.push_back(el); } var.members = elems; + var.isStruct = false; var.rows = var.columns = 0; } } diff --git a/renderdocui/Interop/Shader.cs b/renderdocui/Interop/Shader.cs index ceeca0b49..0c035c912 100644 --- a/renderdocui/Interop/Shader.cs +++ b/renderdocui/Interop/Shader.cs @@ -81,18 +81,21 @@ namespace renderdoc [CustomMarshalAs(CustomUnmanagedType.Union)] public ValueUnion value; + public bool isStruct; + [CustomMarshalAs(CustomUnmanagedType.TemplatedArray)] public ShaderVariable[] members; - - public override string ToString() - { - if(members.Length > 0) return String.Format("struct[{0}]", members.Length); - if(rows == 1) return Row(0); - + + public override string ToString() + { + if (members.Length > 0) + return ""; + if (rows == 1) return Row(0); + string ret = ""; - for (int i = 0; i < (int)rows; i++) + for (int i = 0; i < (int)rows; i++) { - if(i > 0) ret += ", "; + if (i > 0) ret += ", "; ret += "{" + Row(i) + "}"; } @@ -101,24 +104,36 @@ namespace renderdoc public string RowTypeString() { - if (members.Length > 0) return "struct"; + if (members.Length > 0) + { + if (isStruct) + return "struct"; + else + return "flibbertygibbet"; + } - if(rows == 0 && columns == 0) + if (rows == 0 && columns == 0) return "-"; - if(columns == 1) + if (columns == 1) return type.Str(); - return String.Format("{0}{1}", type.Str(), columns); + return String.Format("{0}{1}", type.Str(), columns); } public string TypeString() { - if (members.Length > 0) return "struct"; + if (members.Length > 0) + { + if (isStruct) + return "struct"; + else + return String.Format("{0}[{1}]", members[0].TypeString(), members.Length); + } - if (rows == 1 && columns == 1) return type.Str(); - if (rows == 1) return String.Format("{0}{1}", type.Str(), columns); - else return String.Format("{0}{1}x{2}", type.Str(), rows, columns); + if (rows == 1 && columns == 1) return type.Str(); + if (rows == 1) return String.Format("{0}{1}", type.Str(), columns); + else return String.Format("{0}{1}x{2}", type.Str(), rows, columns); } public string RowValuesToString(int cols, double x, double y)