From 5c0746e26191c3811e0fd495be4681da31f1af4b Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 14 Oct 2016 16:19:52 +0200 Subject: [PATCH] Account for number of planes when calculating subresource count --- renderdoc/driver/d3d12/d3d12_common.cpp | 14 ++++++++++---- renderdoc/driver/d3d12/d3d12_common.h | 2 +- renderdoc/driver/d3d12/d3d12_device_wrap.cpp | 8 ++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_common.cpp b/renderdoc/driver/d3d12/d3d12_common.cpp index 83b4adc7a..17c7f19ec 100644 --- a/renderdoc/driver/d3d12/d3d12_common.cpp +++ b/renderdoc/driver/d3d12/d3d12_common.cpp @@ -408,19 +408,25 @@ UINT GetResourceNumMipLevels(const D3D12_RESOURCE_DESC *desc) return 1; } -UINT GetNumSubresources(const D3D12_RESOURCE_DESC *desc) +UINT GetNumSubresources(ID3D12Device *dev, const D3D12_RESOURCE_DESC *desc) { + D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = {}; + formatInfo.Format = desc->Format; + dev->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo)); + + UINT planes = RDCMAX((UINT8)1, formatInfo.PlaneCount); + switch(desc->Dimension) { default: case D3D12_RESOURCE_DIMENSION_UNKNOWN: RDCERR("Unexpected resource dimension! %d", desc->Dimension); break; - case D3D12_RESOURCE_DIMENSION_BUFFER: return 1; + case D3D12_RESOURCE_DIMENSION_BUFFER: return planes; case D3D12_RESOURCE_DIMENSION_TEXTURE1D: case D3D12_RESOURCE_DIMENSION_TEXTURE2D: - return RDCMAX((UINT16)1, desc->DepthOrArraySize) * GetResourceNumMipLevels(desc); - case D3D12_RESOURCE_DIMENSION_TEXTURE3D: return GetResourceNumMipLevels(desc); + return RDCMAX((UINT16)1, desc->DepthOrArraySize) * GetResourceNumMipLevels(desc) * planes; + case D3D12_RESOURCE_DIMENSION_TEXTURE3D: return GetResourceNumMipLevels(desc) * planes; } return 1; diff --git a/renderdoc/driver/d3d12/d3d12_common.h b/renderdoc/driver/d3d12/d3d12_common.h index 58edc2513..901081fd6 100644 --- a/renderdoc/driver/d3d12/d3d12_common.h +++ b/renderdoc/driver/d3d12/d3d12_common.h @@ -58,7 +58,7 @@ void MakeShaderReflection(DXBC::DXBCFile *dxbc, ShaderReflection *refl, #define VERBOSE_PARTIAL_REPLAY ShaderStageBits ConvertVisibility(D3D12_SHADER_VISIBILITY ShaderVisibility); -UINT GetNumSubresources(const D3D12_RESOURCE_DESC *desc); +UINT GetNumSubresources(ID3D12Device *dev, const D3D12_RESOURCE_DESC *desc); class WrappedID3D12Device; diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index 641fdb89c..68b623688 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -845,7 +845,7 @@ bool WrappedID3D12Device::Serialise_CreateCommittedResource( GetResourceManager()->AddLiveResource(Res, ret); SubresourceStateVector &states = m_ResourceStates[GetResID(ret)]; - states.resize(GetNumSubresources(&desc), state); + states.resize(GetNumSubresources(m_pDevice, &desc), state); } } @@ -908,7 +908,7 @@ HRESULT WrappedID3D12Device::CreateCommittedResource(const D3D12_HEAP_PROPERTIES SCOPED_LOCK(m_ResourceStatesLock); SubresourceStateVector &states = m_ResourceStates[wrapped->GetResourceID()]; - states.resize(GetNumSubresources(pDesc), InitialResourceState); + states.resize(GetNumSubresources(m_pDevice, pDesc), InitialResourceState); } *ppvResource = (ID3D12Resource *)wrapped; @@ -1021,7 +1021,7 @@ bool WrappedID3D12Device::Serialise_CreatePlacedResource( GetResourceManager()->AddLiveResource(Res, ret); SubresourceStateVector &states = m_ResourceStates[GetResID(ret)]; - states.resize(GetNumSubresources(&desc), state); + states.resize(GetNumSubresources(m_pDevice, &desc), state); } } @@ -1084,7 +1084,7 @@ HRESULT WrappedID3D12Device::CreatePlacedResource(ID3D12Heap *pHeap, UINT64 Heap SCOPED_LOCK(m_ResourceStatesLock); SubresourceStateVector &states = m_ResourceStates[wrapped->GetResourceID()]; - states.resize(GetNumSubresources(pDesc), InitialState); + states.resize(GetNumSubresources(m_pDevice, pDesc), InitialState); } *ppvResource = (ID3D12Resource *)wrapped;