From f00049bed3246cd8a81e149a9916786ea0ffa337 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 23 Jun 2016 11:46:32 +0200 Subject: [PATCH] Fixup display&export of byte address and structured (with/no counter) --- renderdoc/driver/d3d11/d3d11_replay.cpp | 16 +++-- renderdocui/Interop/D3D11PipelineState.cs | 2 +- renderdocui/Interop/Enums.cs | 8 +++ .../PipelineState/D3D11PipelineStateViewer.cs | 64 +++++++++++++++---- 4 files changed, 72 insertions(+), 18 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 8b6fcf547..6a773e633 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -769,11 +769,6 @@ D3D11PipelineState D3D11Replay::MakePipelineState() if(desc.ViewDimension == D3D11_UAV_DIMENSION_BUFFER && (desc.Buffer.Flags & (D3D11_BUFFER_UAV_FLAG_APPEND | D3D11_BUFFER_UAV_FLAG_COUNTER))) { - D3D11_BUFFER_DESC bufdesc; - ((ID3D11Buffer *)res)->GetDesc(&bufdesc); - - view.ElementSize = bufdesc.StructureByteStride; - view.Structured = true; view.BufferStructCount = m_pDevice->GetDebugManager()->GetStructCount(rs->CSUAVs[s]); } @@ -782,10 +777,19 @@ D3D11PipelineState D3D11Replay::MakePipelineState() view.Format = MakeResourceFormat(desc.Format); view.Type = ToStr::Get(desc.ViewDimension); - if(desc.ViewDimension == D3D11_RTV_DIMENSION_BUFFER) + if(desc.ViewDimension == D3D11_UAV_DIMENSION_BUFFER) { view.FirstElement = desc.Buffer.FirstElement; view.NumElements = desc.Buffer.NumElements; + view.Flags = desc.Buffer.Flags; + + D3D11_BUFFER_DESC bufdesc; + ((ID3D11Buffer *)res)->GetDesc(&bufdesc); + + view.Structured = bufdesc.StructureByteStride > 0 && desc.Format == DXGI_FORMAT_UNKNOWN; + + if(view.Structured) + view.ElementSize = bufdesc.StructureByteStride; } else if(desc.ViewDimension == D3D11_UAV_DIMENSION_TEXTURE1D) { diff --git a/renderdocui/Interop/D3D11PipelineState.cs b/renderdocui/Interop/D3D11PipelineState.cs index 640fd37e1..a8964af10 100644 --- a/renderdocui/Interop/D3D11PipelineState.cs +++ b/renderdocui/Interop/D3D11PipelineState.cs @@ -137,7 +137,7 @@ namespace renderdoc public UInt32 NumElements; // BufferEx - public UInt32 Flags; + public D3D11BufferViewFlags Flags; // Texture public UInt32 HighestMip; diff --git a/renderdocui/Interop/Enums.cs b/renderdocui/Interop/Enums.cs index 86ff730a1..b2f03d586 100644 --- a/renderdocui/Interop/Enums.cs +++ b/renderdocui/Interop/Enums.cs @@ -287,6 +287,14 @@ namespace renderdoc SwapBuffer = 0x10, }; + [Flags] + public enum D3D11BufferViewFlags + { + Raw = 0x1, + Append = 0x2, + Counter = 0x4, + }; + public enum ShaderStageType { Vertex = 0, diff --git a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs index 187b01cba..3dc9c8dbc 100644 --- a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs @@ -332,7 +332,18 @@ namespace renderdocui.Windows.PipelineState // for structured buffers, display how many 'elements' there are in the buffer if (bufs[t].structureSize > 0) + { typename = "StructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]"; + } + else if (r.Flags.HasFlag(D3D11BufferViewFlags.Raw)) + { + typename = "ByteAddressBuffer"; + } + + if (r.Flags.HasFlag(D3D11BufferViewFlags.Append) || r.Flags.HasFlag(D3D11BufferViewFlags.Counter)) + { + typename += " (Count: " + r.BufferStructCount + ")"; + } // get the buffer type, whether it's just a basic type or a complex struct if (shaderInput != null && !shaderInput.IsTexture) @@ -1011,9 +1022,15 @@ namespace renderdocui.Windows.PipelineState typename = "Buffer"; if (bufs[t].structureSize > 0) - typename = "StructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]"; + { + typename = "RWStructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]"; + } + else if (r.Flags.HasFlag(D3D11BufferViewFlags.Raw)) + { + typename = "RWByteAddressBuffer"; + } - if (r.Structured) + if (r.Flags.HasFlag(D3D11BufferViewFlags.Append) || r.Flags.HasFlag(D3D11BufferViewFlags.Counter)) { typename += " (Count: " + r.BufferStructCount + ")"; } @@ -1336,9 +1353,15 @@ namespace renderdocui.Windows.PipelineState typename = "Buffer"; if (bufs[t].structureSize > 0) - typename = "StructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]"; + { + typename = "RWStructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]"; + } + else if (r.Flags.HasFlag(D3D11BufferViewFlags.Raw)) + { + typename = "RWByteAddressBuffer"; + } - if (r.Structured) + if (r.Flags.HasFlag(D3D11BufferViewFlags.Append) || r.Flags.HasFlag(D3D11BufferViewFlags.Counter)) { typename += " (Count: " + r.BufferStructCount + ")"; } @@ -2566,13 +2589,24 @@ namespace renderdocui.Windows.PipelineState ShaderResource shaderInput = null; + bool rw = false; + if (refl != null) { + foreach (var bind in refl.ReadOnlyResources) + { + if (bind.bindPoint == i) + { + shaderInput = bind; + break; + } + } foreach (var bind in refl.ReadWriteResources) { if (bind.bindPoint == i) { shaderInput = bind; + rw = true; break; } } @@ -2583,6 +2617,8 @@ namespace renderdocui.Windows.PipelineState string format = "Unknown"; uint w = 0, h = 0, d = 0, a = 0; + string viewFormat = view.Format.ToString(); + FetchTexture tex = null; FetchBuffer buf = null; @@ -2618,9 +2654,15 @@ namespace renderdocui.Windows.PipelineState // for structured buffers, display how many 'elements' there are in the buffer if (bufs[t].structureSize > 0) - typename = "StructuredBuffer[" + (bufs[t].length / bufs[t].structureSize) + "]"; + { + typename = (rw ? "RWStructuredBuffer" : "StructuredBuffer") + "[" + (bufs[t].length / bufs[t].structureSize) + "]"; + } + else if (view.Flags.HasFlag(D3D11BufferViewFlags.Raw)) + { + typename = rw ? "RWByteAddressBuffer" : "ByteAddressBuffer"; + } - if (view.Structured) + if (view.Flags.HasFlag(D3D11BufferViewFlags.Append) || view.Flags.HasFlag(D3D11BufferViewFlags.Counter)) { typename += " (Count: " + view.BufferStructCount + ")"; } @@ -2630,9 +2672,9 @@ namespace renderdocui.Windows.PipelineState if (view.Format.compType == FormatComponentType.None) { if (shaderInput.variableType.members.Length > 0) - format = "struct " + shaderInput.variableType.Name; + viewFormat = format = "struct " + shaderInput.variableType.Name; else - format = shaderInput.variableType.Name; + viewFormat = format = shaderInput.variableType.Name; } else { @@ -2673,7 +2715,7 @@ namespace renderdocui.Windows.PipelineState i, name, view.Type, typename, w, h, d, a, - view.Format, format, + viewFormat, format, viewParams }; } @@ -2817,7 +2859,7 @@ namespace renderdocui.Windows.PipelineState { if (sh.SRVs[i].View == ResourceId.Null) continue; - rows.Add(ExportViewHTML(sh.SRVs[i], i, null, "")); + rows.Add(ExportViewHTML(sh.SRVs[i], i, sh.ShaderDetails, "")); } ExportHTMLTable(writer, @@ -2843,7 +2885,7 @@ namespace renderdocui.Windows.PipelineState { if (sh.UAVs[i].View == ResourceId.Null) continue; - rows.Add(ExportViewHTML(sh.UAVs[i], i, null, "")); + rows.Add(ExportViewHTML(sh.UAVs[i], i, sh.ShaderDetails, "")); } ExportHTMLTable(writer,