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.
This commit is contained in:
baldurk committed 2016-04-23 13:03:41 +02:00
1 parent e89fab7802
commit 5867d7ada1
4 files changed
+24 -3

No files matched your search

+2 -1
View File
@@ -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;
+19
View File
@@ -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;