diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index 2a8a03ab7..62b5b46b0 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -1309,6 +1309,9 @@ HRESULT WrappedID3D12Device::CreateCommittedResource(const D3D12_HEAP_PROPERTIES record->Length = 0; wrapped->SetResourceRecord(record); + record->m_MapsCount = GetNumSubresources(this, pDesc); + record->m_Maps = new D3D12ResourceRecord::MapData[record->m_MapsCount]; + record->AddChunk(scope.Get()); { @@ -1550,6 +1553,9 @@ HRESULT WrappedID3D12Device::CreatePlacedResource(ID3D12Heap *pHeap, UINT64 Heap record->Length = 0; wrapped->SetResourceRecord(record); + record->m_MapsCount = GetNumSubresources(this, pDesc); + record->m_Maps = new D3D12ResourceRecord::MapData[record->m_MapsCount]; + RDCASSERT(pHeap); record->AddParent(GetRecord(pHeap)); diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index 1ad8f5596..9b832930f 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -389,10 +389,16 @@ struct D3D12ResourceRecord : public ResourceRecord type(Resource_Unknown), ContainsExecuteIndirect(false), cmdInfo(NULL), + m_Maps(NULL), + m_MapsCount(0), bakedCommands(NULL) { } - ~D3D12ResourceRecord() { SAFE_DELETE(cmdInfo); } + ~D3D12ResourceRecord() + { + SAFE_DELETE(cmdInfo); + SAFE_DELETE_ARRAY(m_Maps); + } void Bake() { RDCASSERT(cmdInfo); @@ -434,7 +440,8 @@ struct D3D12ResourceRecord : public ResourceRecord byte *shadowPtr; }; - vector m_Map; + MapData *m_Maps; + size_t m_MapsCount; }; typedef vector SubresourceStateVector; diff --git a/renderdoc/driver/d3d12/d3d12_resources.cpp b/renderdoc/driver/d3d12/d3d12_resources.cpp index af84718e9..c0b03a582 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.cpp +++ b/renderdoc/driver/d3d12/d3d12_resources.cpp @@ -285,10 +285,11 @@ WrappedID3D12Resource::~WrappedID3D12Resource() // perform an implicit unmap on release if(GetResourceRecord()) { - vector &map = GetResourceRecord()->m_Map; + D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps; + size_t mapcount = GetResourceRecord()->m_MapsCount; // may not have a map if e.g. no pointer was requested - for(size_t i = 0; i < map.size(); i++) + for(size_t i = 0; i < mapcount; i++) { if(map[i].refcount > 0) { @@ -315,9 +316,10 @@ WrappedID3D12Resource::~WrappedID3D12Resource() byte *WrappedID3D12Resource::GetMap(UINT Subresource) { - vector &map = GetResourceRecord()->m_Map; + D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps; + size_t mapcount = GetResourceRecord()->m_MapsCount; - if(Subresource < map.size()) + if(Subresource < mapcount) return map[Subresource].realPtr; return NULL; @@ -325,20 +327,14 @@ byte *WrappedID3D12Resource::GetMap(UINT Subresource) byte *WrappedID3D12Resource::GetShadow(UINT Subresource) { - vector &map = GetResourceRecord()->m_Map; - - if(Subresource >= map.size()) - map.resize(Subresource + 1); + D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps; return map[Subresource].shadowPtr; } void WrappedID3D12Resource::AllocShadow(UINT Subresource, size_t size) { - vector &map = GetResourceRecord()->m_Map; - - if(Subresource >= map.size()) - map.resize(Subresource + 1); + D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps; if(map[Subresource].shadowPtr == NULL) map[Subresource].shadowPtr = AllocAlignedBuffer(size); @@ -346,9 +342,10 @@ void WrappedID3D12Resource::AllocShadow(UINT Subresource, size_t size) void WrappedID3D12Resource::FreeShadow() { - vector &map = GetResourceRecord()->m_Map; + D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps; + size_t mapcount = GetResourceRecord()->m_MapsCount; - for(size_t i = 0; i < map.size(); i++) + for(size_t i = 0; i < mapcount; i++) { FreeAlignedBuffer(map[i].shadowPtr); map[i].shadowPtr = NULL; @@ -377,13 +374,7 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12Resource::Map(UINT Subresource, if(SUCCEEDED(hr) && GetResourceRecord()) { - vector &map = GetResourceRecord()->m_Map; - - if(Subresource >= map.size()) - map.resize(Subresource + 1); - - // the map pointer should be NULL or identical (if we are in a nested Map) - RDCASSERT(map[Subresource].realPtr == mapPtr || map[Subresource].realPtr == NULL); + D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps; map[Subresource].realPtr = (byte *)mapPtr; @@ -401,10 +392,11 @@ void STDMETHODCALLTYPE WrappedID3D12Resource::Unmap(UINT Subresource, const D3D1 { if(GetResourceRecord()) { - vector &map = GetResourceRecord()->m_Map; + D3D12ResourceRecord::MapData *map = GetResourceRecord()->m_Maps; + size_t mapcount = GetResourceRecord()->m_MapsCount; // may not have a map if e.g. no pointer was requested - if(Subresource < map.size()) + if(Subresource < mapcount) { int32_t refcount = Atomic::Dec32(&map[Subresource].refcount); @@ -435,9 +427,9 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12Resource::WriteToSubresource(UINT DstSubr if(GetResourceRecord()) { - vector &map = GetResourceRecord()->m_Map; + size_t mapcount = GetResourceRecord()->m_MapsCount; - if(DstSubresource < map.size()) + if(DstSubresource < mapcount) { m_pDevice->WriteToSubresource(this, DstSubresource, pDstBox, pSrcData, SrcDepthPitch, SrcDepthPitch);