From 5867d7ada1e4822be7c080f22d3fd74349c7d4e6 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 23 Apr 2016 13:03:41 +0200 Subject: [PATCH] Pass through resource view element size in D3D11 pipeline state * This lets us calculate the offset and visible length when opening a buffer view from a resource binding. --- renderdoc/api/replay/d3d11_pipestate.h | 3 ++- renderdoc/driver/d3d11/d3d11_replay.cpp | 19 +++++++++++++++++++ renderdocui/Interop/D3D11PipelineState.cs | 1 + .../PipelineState/D3D11PipelineStateViewer.cs | 4 ++-- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/renderdoc/api/replay/d3d11_pipestate.h b/renderdoc/api/replay/d3d11_pipestate.h index 3b8c43dc4..ddfa05cca 100644 --- a/renderdoc/api/replay/d3d11_pipestate.h +++ b/renderdoc/api/replay/d3d11_pipestate.h @@ -82,7 +82,7 @@ struct D3D11PipelineState { ResourceView() : View(), Resource(), Format(), - Structured(false), BufferStructCount(0), + Structured(false), BufferStructCount(0), ElementSize(0), ElementOffset(0), ElementWidth(0), FirstElement(0), NumElements(0), Flags(0), @@ -96,6 +96,7 @@ struct D3D11PipelineState bool32 Structured; uint32_t BufferStructCount; + uint32_t ElementSize; // Buffer (SRV) uint32_t ElementOffset; diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index c8810dff0..3ec5194e6 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -648,6 +648,8 @@ D3D11PipelineState D3D11Replay::MakePipelineState() view.Structured = false; view.BufferStructCount = 0; + view.ElementSize = desc.Format == DXGI_FORMAT_UNKNOWN ? 1 : GetByteSize(1, 1, 1, desc.Format, 0); + view.Resource = rm->GetOriginalID(GetIDForResource(res)); view.Type = ToStr::Get(desc.ViewDimension); @@ -658,6 +660,14 @@ D3D11PipelineState D3D11Replay::MakePipelineState() view.NumElements = desc.Buffer.NumElements; view.ElementOffset = desc.Buffer.ElementOffset; view.ElementWidth = desc.Buffer.ElementWidth; + + 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_SRV_DIMENSION_BUFFEREX) { @@ -737,9 +747,15 @@ D3D11PipelineState D3D11Replay::MakePipelineState() view.Structured = false; view.BufferStructCount = 0; + view.ElementSize = GetByteSize(1, 1, 1, desc.Format, 0); + 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]); } @@ -919,6 +935,7 @@ D3D11PipelineState D3D11Replay::MakePipelineState() view.Structured = false; view.BufferStructCount = 0; + view.ElementSize = desc.Format == DXGI_FORMAT_UNKNOWN ? 1 : GetByteSize(1, 1, 1, desc.Format, 0); view.Resource = rm->GetOriginalID(GetIDForResource(res)); @@ -985,6 +1002,7 @@ D3D11PipelineState D3D11Replay::MakePipelineState() view.Structured = false; view.BufferStructCount = 0; + view.ElementSize = desc.Format == DXGI_FORMAT_UNKNOWN ? 1 : GetByteSize(1, 1, 1, desc.Format, 0); if(desc.Buffer.Flags & (D3D11_BUFFER_UAV_FLAG_APPEND|D3D11_BUFFER_UAV_FLAG_COUNTER)) { @@ -1056,6 +1074,7 @@ D3D11PipelineState D3D11Replay::MakePipelineState() view.Structured = false; view.BufferStructCount = 0; + view.ElementSize = desc.Format == DXGI_FORMAT_UNKNOWN ? 1 : GetByteSize(1, 1, 1, desc.Format, 0); ret.m_OM.DepthReadOnly = false; ret.m_OM.StencilReadOnly = false; diff --git a/renderdocui/Interop/D3D11PipelineState.cs b/renderdocui/Interop/D3D11PipelineState.cs index bd90c01da..599f5686e 100644 --- a/renderdocui/Interop/D3D11PipelineState.cs +++ b/renderdocui/Interop/D3D11PipelineState.cs @@ -126,6 +126,7 @@ namespace renderdoc public bool Structured; public UInt32 BufferStructCount; + public UInt32 ElementSize; // Buffer (SRV) public UInt32 ElementOffset; diff --git a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs index 1714ee8f9..c3b205f89 100644 --- a/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs +++ b/renderdocui/Windows/PipelineState/D3D11PipelineStateViewer.cs @@ -1698,9 +1698,9 @@ namespace renderdocui.Windows.PipelineState { var viewer = new BufferViewer(m_Core, false); if (format.Length == 0) - viewer.ViewRawBuffer(true, 0, ulong.MaxValue, buf.ID); + viewer.ViewRawBuffer(true, view.FirstElement * view.ElementSize, view.NumElements * view.ElementSize, buf.ID); else - viewer.ViewRawBuffer(true, 0, ulong.MaxValue, buf.ID, format); + viewer.ViewRawBuffer(true, view.FirstElement * view.ElementSize, view.NumElements * view.ElementSize, buf.ID, format); viewer.Show(m_DockContent.DockPanel); } }