From 9b913de8779ee6a6d1f92f0e15b97d477f88a96d Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 29 Jun 2017 19:37:07 +0100 Subject: [PATCH] Release references to duplicate states before re-using existing wrapper * Fixes a dangling reference that ends up keeing the D3D11 device alive and so leaking a lot of memory each time the capture is opened. --- renderdoc/driver/d3d11/d3d11_device1_wrap.cpp | 2 ++ renderdoc/driver/d3d11/d3d11_device3_wrap.cpp | 1 + renderdoc/driver/d3d11/d3d11_device_wrap.cpp | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/renderdoc/driver/d3d11/d3d11_device1_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device1_wrap.cpp index 74c83c264..2bda6d439 100644 --- a/renderdoc/driver/d3d11/d3d11_device1_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device1_wrap.cpp @@ -91,6 +91,7 @@ bool WrappedID3D11Device::Serialise_CreateBlendState1(const D3D11_BLEND_DESC1 *p { if(GetResourceManager()->HasWrapper(ret)) { + ret->Release(); ret = (ID3D11BlendState1 *)GetResourceManager()->GetWrapper(ret); ret->AddRef(); @@ -181,6 +182,7 @@ bool WrappedID3D11Device::Serialise_CreateRasterizerState1( { if(GetResourceManager()->HasWrapper(ret)) { + ret->Release(); ret = (ID3D11RasterizerState1 *)GetResourceManager()->GetWrapper(ret); ret->AddRef(); diff --git a/renderdoc/driver/d3d11/d3d11_device3_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device3_wrap.cpp index 7dd9136ac..6e2636228 100644 --- a/renderdoc/driver/d3d11/d3d11_device3_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device3_wrap.cpp @@ -663,6 +663,7 @@ bool WrappedID3D11Device::Serialise_CreateRasterizerState2( { if(GetResourceManager()->HasWrapper(ret)) { + ret->Release(); ret = (ID3D11RasterizerState2 *)GetResourceManager()->GetWrapper(ret); ret->AddRef(); diff --git a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp index ff603d43c..b63749e5b 100644 --- a/renderdoc/driver/d3d11/d3d11_device_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_device_wrap.cpp @@ -1995,6 +1995,7 @@ bool WrappedID3D11Device::Serialise_CreateBlendState(const D3D11_BLEND_DESC *pBl { if(GetResourceManager()->HasWrapper(ret)) { + ret->Release(); ret = (ID3D11BlendState *)GetResourceManager()->GetWrapper(ret); ret->AddRef(); @@ -2079,6 +2080,7 @@ bool WrappedID3D11Device::Serialise_CreateDepthStencilState( { if(GetResourceManager()->HasWrapper(ret)) { + ret->Release(); ret = (ID3D11DepthStencilState *)GetResourceManager()->GetWrapper(ret); ret->AddRef(); @@ -2163,6 +2165,7 @@ bool WrappedID3D11Device::Serialise_CreateRasterizerState(const D3D11_RASTERIZER { if(GetResourceManager()->HasWrapper(ret)) { + ret->Release(); ret = (ID3D11RasterizerState *)GetResourceManager()->GetWrapper(ret); ret->AddRef(); @@ -2247,6 +2250,7 @@ bool WrappedID3D11Device::Serialise_CreateSamplerState(const D3D11_SAMPLER_DESC { if(GetResourceManager()->HasWrapper(ret)) { + ret->Release(); ret = (ID3D11SamplerState *)GetResourceManager()->GetWrapper(ret); ret->AddRef();