diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 05caf25c7..b09524870 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -438,7 +438,8 @@ HRESULT WrappedID3D12GraphicsCommandList::ResetInternal(ID3D12CommandAllocator * m_ListRecord->bakedCommands->InternalResource = true; m_ListRecord->bakedCommands->cmdInfo = new CmdListRecordingInfo(); - m_ListRecord->cmdInfo->alloc = &((WrappedID3D12CommandAllocator *)pAllocator)->alloc; + m_ListRecord->cmdInfo->alloc = ((WrappedID3D12CommandAllocator *)pAllocator)->alloc; + m_ListRecord->cmdInfo->allocRecord = GetRecord(pAllocator); { CACHE_THREAD_SERIALISER(); diff --git a/renderdoc/driver/d3d12/d3d12_command_queue.h b/renderdoc/driver/d3d12/d3d12_command_queue.h index d7e05f7a5..7588e0963 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue.h +++ b/renderdoc/driver/d3d12/d3d12_command_queue.h @@ -155,6 +155,7 @@ class WrappedID3D12CommandQueue : public ID3D12CommandQueue, WrappedID3D12CompatibilityQueue m_WrappedCompat; rdcarray m_CmdListRecords; + rdcarray m_CmdListAllocators; std::unordered_set m_SparseBindResources; diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index 373212363..9da3def2f 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -850,6 +850,9 @@ void WrappedID3D12CommandQueue::ExecuteCommandListsInternal(UINT NumCommandLists m_CmdListRecords.push_back(record->bakedCommands->cmdInfo->bundles[sub]->bakedCommands); } + m_CmdListAllocators.push_back(record->bakedCommands->cmdInfo->allocRecord); + record->bakedCommands->cmdInfo->allocRecord->AddRef(); + record->bakedCommands->AddRef(); } diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 817d00817..466367952 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -535,7 +535,11 @@ void WrappedID3D12CommandQueue::ClearAfterCapture() for(size_t i = 0; i < m_CmdListRecords.size(); i++) m_CmdListRecords[i]->Delete(GetResourceManager()); + for(size_t i = 0; i < m_CmdListAllocators.size(); i++) + m_CmdListAllocators[i]->Delete(GetResourceManager()); + m_CmdListRecords.clear(); + m_CmdListAllocators.clear(); m_QueueRecord->DeleteChunks(); } diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index 8301f9695..43a1b1fc3 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -231,6 +231,11 @@ HRESULT WrappedID3D12Device::CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE type record->Length = 0; wrapped->SetResourceRecord(record); + record->cmdInfo = new CmdListRecordingInfo; + + record->cmdInfo->allocPool = new ChunkPagePool(32 * 1024); + record->cmdInfo->alloc = new ChunkAllocator(*record->cmdInfo->allocPool); + record->AddChunk(scope.Get()); } else diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index 184f614ec..aca09f375 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -420,7 +420,10 @@ struct D3D12ResourceRecord; struct CmdListRecordingInfo { - ChunkAllocator *alloc; + ChunkPagePool *allocPool = NULL; + ChunkAllocator *alloc = NULL; + + D3D12ResourceRecord *allocRecord = NULL; rdcarray barriers; @@ -503,6 +506,11 @@ struct D3D12ResourceRecord : public ResourceRecord } ~D3D12ResourceRecord() { + if(type == Resource_CommandAllocator) + { + SAFE_DELETE(cmdInfo->alloc); + SAFE_DELETE(cmdInfo->allocPool); + } SAFE_DELETE(cmdInfo); SAFE_DELETE(sparseTable); SAFE_DELETE_ARRAY(m_Maps); @@ -515,6 +523,8 @@ struct D3D12ResourceRecord : public ResourceRecord cmdInfo->dirtied.swap(bakedCommands->cmdInfo->dirtied); cmdInfo->boundDescs.swap(bakedCommands->cmdInfo->boundDescs); cmdInfo->bundles.swap(bakedCommands->cmdInfo->bundles); + bakedCommands->cmdInfo->alloc = cmdInfo->alloc; + bakedCommands->cmdInfo->allocRecord = cmdInfo->allocRecord; } D3D12ResourceType type; diff --git a/renderdoc/driver/d3d12/d3d12_resources.h b/renderdoc/driver/d3d12/d3d12_resources.h index a6a04eb93..0347c2150 100644 --- a/renderdoc/driver/d3d12/d3d12_resources.h +++ b/renderdoc/driver/d3d12/d3d12_resources.h @@ -333,8 +333,7 @@ class WrappedID3D12CommandAllocator : public WrappedDeviceChild12Reset(); return m_pReal->Reset(); } };