From 106999a43a91b968b5b5f461ad7aa29d2d9a3041 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 25 Jan 2021 11:13:28 +0000 Subject: [PATCH] Fix leak of descriptor memory during each capture on D3D12 --- renderdoc/driver/d3d12/d3d12_manager.h | 1 + util/test/demos/d3d12/d3d12_leak_check.cpp | 17 +++++++++++++++-- util/test/tests/D3D11/D3D11_Leak_Check.py | 2 +- util/test/tests/D3D12/D3D12_Leak_Check.py | 2 +- util/test/tests/Vulkan/VK_Leak_Check.py | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_manager.h b/renderdoc/driver/d3d12/d3d12_manager.h index 2b0185ccb..10a642128 100644 --- a/renderdoc/driver/d3d12/d3d12_manager.h +++ b/renderdoc/driver/d3d12/d3d12_manager.h @@ -607,6 +607,7 @@ struct D3D12InitialContents template void Free(ResourceManager *rm) { + SAFE_DELETE_ARRAY(descriptors); SAFE_RELEASE(resource); FreeAlignedBuffer(srcData); } diff --git a/util/test/demos/d3d12/d3d12_leak_check.cpp b/util/test/demos/d3d12/d3d12_leak_check.cpp index b928480cb..91f495e63 100644 --- a/util/test/demos/d3d12/d3d12_leak_check.cpp +++ b/util/test/demos/d3d12/d3d12_leak_check.cpp @@ -51,10 +51,21 @@ RD_TEST(D3D12_Leak_Check, D3D12GraphicsTest) .RTV() .InitialState(D3D12_RESOURCE_STATE_RENDER_TARGET); + ID3D12DescriptorHeapPtr descHeap; + { + D3D12_DESCRIPTOR_HEAP_DESC desc; + desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + desc.NodeMask = 1; + desc.NumDescriptors = 1000000; + desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; + CHECK_HR(dev->CreateDescriptorHeap(&desc, __uuidof(ID3D12DescriptorHeap), (void **)&descHeap)); + } + while(Running()) { - // allow a generous 500MB, we're really only after catching big leaks here - if(GetMemoryUsage() > 500 * 1000 * 1000) + // allow a generous 750MB, we're really only after catching big leaks here and want to be able + // to run this test in debug + if(GetMemoryUsage() > 750 * 1000 * 1000) { TEST_ERROR("Memory usage of %llu is too high!", GetMemoryUsage()); break; @@ -75,6 +86,8 @@ RD_TEST(D3D12_Leak_Check, D3D12GraphicsTest) cmd->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + cmd->SetDescriptorHeaps(1, &descHeap.GetInterfacePtr()); + IASetVertexBuffer(cmd, vb, sizeof(DefaultA2V), 0); cmd->SetPipelineState(pso); cmd->SetGraphicsRootSignature(sig); diff --git a/util/test/tests/D3D11/D3D11_Leak_Check.py b/util/test/tests/D3D11/D3D11_Leak_Check.py index 0187cc69a..03977f22d 100644 --- a/util/test/tests/D3D11/D3D11_Leak_Check.py +++ b/util/test/tests/D3D11/D3D11_Leak_Check.py @@ -5,7 +5,7 @@ import rdtest class D3D11_Leak_Check(rdtest.TestCase): demos_test_name = 'D3D11_Leak_Check' demos_frame_cap = 50000 - demos_frame_count = 1 + demos_frame_count = 10 def check_capture(self): memory: int = rd.GetCurrentProcessMemoryUsage() diff --git a/util/test/tests/D3D12/D3D12_Leak_Check.py b/util/test/tests/D3D12/D3D12_Leak_Check.py index e4f24b740..e8275260a 100644 --- a/util/test/tests/D3D12/D3D12_Leak_Check.py +++ b/util/test/tests/D3D12/D3D12_Leak_Check.py @@ -5,7 +5,7 @@ import rdtest class D3D12_Leak_Check(rdtest.TestCase): demos_test_name = 'D3D12_Leak_Check' demos_frame_cap = 50000 - demos_frame_count = 1 + demos_frame_count = 10 def check_capture(self): memory: int = rd.GetCurrentProcessMemoryUsage() diff --git a/util/test/tests/Vulkan/VK_Leak_Check.py b/util/test/tests/Vulkan/VK_Leak_Check.py index 9916531c6..9d38980a6 100644 --- a/util/test/tests/Vulkan/VK_Leak_Check.py +++ b/util/test/tests/Vulkan/VK_Leak_Check.py @@ -5,7 +5,7 @@ import rdtest class VK_Leak_Check(rdtest.TestCase): demos_test_name = 'VK_Leak_Check' demos_frame_cap = 50000 - demos_frame_count = 1 + demos_frame_count = 10 def check_capture(self): memory: int = rd.GetCurrentProcessMemoryUsage()