From 6b42e75bb2a808ea5b849d63e5fcdcabe009ccdb Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 31 Jul 2024 16:24:47 +0100 Subject: [PATCH] Don't initialise a new ResourceRange while destroying D3D11 objects * This can cause a recursive call and crash if we are destroying the D3D11 device at the time --- renderdoc/driver/d3d11/d3d11_device.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 3bfa5d7b1..a6dd62bb5 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -1830,21 +1830,28 @@ void WrappedID3D11Device::ReportDeath(ID3D11DeviceChild *obj) ID3D11DeviceChild *texObj = obj; - ResourceRange range = ResourceRange::Null; - // backbuffers and their views are destroyed immediately to accommodate D3D's refcounting rules for // backbuffers. For views, get the resource to check and for everything else check the object directly if(WrappedID3D11ShaderResourceView1::IsAlloc(obj)) - range = ResourceRange((WrappedID3D11ShaderResourceView1 *)obj); + { + WrappedID3D11ShaderResourceView1 *view = (WrappedID3D11ShaderResourceView1 *)obj; + texObj = view->GetResourceRange().GetResource(); + } else if(WrappedID3D11UnorderedAccessView1::IsAlloc(obj)) - range = ResourceRange((WrappedID3D11UnorderedAccessView1 *)obj); + { + WrappedID3D11UnorderedAccessView1 *view = (WrappedID3D11UnorderedAccessView1 *)obj; + texObj = view->GetResourceRange().GetResource(); + } else if(WrappedID3D11RenderTargetView1::IsAlloc(obj)) - range = ResourceRange((WrappedID3D11RenderTargetView1 *)obj); + { + WrappedID3D11RenderTargetView1 *view = (WrappedID3D11RenderTargetView1 *)obj; + texObj = view->GetResourceRange().GetResource(); + } else if(WrappedID3D11DepthStencilView::IsAlloc(obj)) - range = ResourceRange((WrappedID3D11DepthStencilView *)obj); - - if(range.GetResource() != NULL) - texObj = range.GetResource(); + { + WrappedID3D11DepthStencilView *view = (WrappedID3D11DepthStencilView *)obj; + texObj = view->GetResourceRange().GetResource(); + } // if this is a wrapped 2D texture and is a backbuffer, destroy whatever object we were reporting // the death of and stop