From 810a3e77a50dd84f69e74edf225fb4dc2870a40d Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 16 Jul 2018 17:32:11 +0100 Subject: [PATCH] Reset command allocators each frame, after syncing GPU --- renderdoc/driver/d3d12/d3d12_device.cpp | 7 +++++++ renderdoc/driver/d3d12/d3d12_device.h | 2 ++ renderdoc/driver/d3d12/d3d12_device_wrap.cpp | 2 ++ 3 files changed, 11 insertions(+) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index 2527db5a6..0a20c78be 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -2783,6 +2783,13 @@ void WrappedID3D12Device::ReplayLog(uint32_t startEventID, uint32_t endEventID, m_Queues[i]->Signal(m_QueueFences[i], m_GPUSyncCounter); FlushLists(true); + + // take this opportunity to reset command allocators to ensure we don't steadily leak over time. + if(m_DataUploadAlloc) + m_DataUploadAlloc->Reset(); + + for(ID3D12CommandAllocator *alloc : m_CommandAllocators) + alloc->Reset(); } if(!partial) diff --git a/renderdoc/driver/d3d12/d3d12_device.h b/renderdoc/driver/d3d12/d3d12_device.h index 9419a8705..d7f04716a 100644 --- a/renderdoc/driver/d3d12/d3d12_device.h +++ b/renderdoc/driver/d3d12/d3d12_device.h @@ -250,6 +250,8 @@ private: HANDLE m_GPUSyncHandle; UINT64 m_GPUSyncCounter; + std::vector m_CommandAllocators; + D3D12_CPU_DESCRIPTOR_HANDLE AllocRTV(); void FreeRTV(D3D12_CPU_DESCRIPTOR_HANDLE handle); diff --git a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp index bdf0f7f4d..6240bf614 100644 --- a/renderdoc/driver/d3d12/d3d12_device_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_device_wrap.cpp @@ -159,6 +159,8 @@ bool WrappedID3D12Device::Serialise_CreateCommandAllocator(SerialiserType &ser, { ret = new WrappedID3D12CommandAllocator(ret, this); + m_CommandAllocators.push_back(ret); + GetResourceManager()->AddLiveResource(pCommandAllocator, ret); AddResource(pCommandAllocator, ResourceType::Pool, "Command Queue");