From d130b9652fc10a2b1f1a770d5d96f31adc3d1064 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 26 Feb 2018 15:40:20 +0000 Subject: [PATCH] Fix refcounting on D3D11 devices --- renderdoc/driver/d3d11/d3d11_debug.cpp | 26 ++++++++++++++++--- renderdoc/driver/d3d11/d3d11_device.cpp | 2 ++ renderdoc/driver/d3d11/d3d11_hooks.cpp | 8 +++++- renderdoc/driver/d3d11/d3d11_rendertext.cpp | 28 ++++++++++++++++++--- renderdoc/driver/d3d11/d3d11_rendertext.h | 7 ++++-- renderdoc/driver/gl/gl_driver.cpp | 2 ++ 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_debug.cpp b/renderdoc/driver/d3d11/d3d11_debug.cpp index 33ee42d72..543d9084b 100644 --- a/renderdoc/driver/d3d11/d3d11_debug.cpp +++ b/renderdoc/driver/d3d11/d3d11_debug.cpp @@ -45,8 +45,6 @@ D3D11DebugManager::D3D11DebugManager(WrappedID3D11Device *wrapper) m_pDevice = wrapper; m_pImmediateContext = wrapper->GetImmediateContext(); - m_pDevice->InternalRef(); - m_pDevice->GetShaderCache()->SetCaching(true); // create things needed both during capture and replay @@ -70,8 +68,6 @@ D3D11DebugManager::~D3D11DebugManager() m_ShaderItemCache.pop_back(); } - m_pDevice->InternalRelease(); - if(RenderDoc::Inst().GetCrashHandler()) RenderDoc::Inst().GetCrashHandler()->UnregisterMemoryRegion(this); } @@ -139,25 +135,35 @@ void D3D11DebugManager::InitCommonResources() CopyMSToArrayPS = shaderCache->MakePShader(multisamplehlsl.c_str(), "RENDERDOC_CopyMSToArray", "ps_5_0"); + m_pDevice->InternalRef(); CopyArrayToMSPS = shaderCache->MakePShader(multisamplehlsl.c_str(), "RENDERDOC_CopyArrayToMS", "ps_5_0"); + m_pDevice->InternalRef(); FloatCopyMSToArrayPS = shaderCache->MakePShader(multisamplehlsl.c_str(), "RENDERDOC_FloatCopyMSToArray", "ps_5_0"); + m_pDevice->InternalRef(); FloatCopyArrayToMSPS = shaderCache->MakePShader(multisamplehlsl.c_str(), "RENDERDOC_FloatCopyArrayToMS", "ps_5_0"); + m_pDevice->InternalRef(); DepthCopyMSToArrayPS = shaderCache->MakePShader(multisamplehlsl.c_str(), "RENDERDOC_DepthCopyMSToArray", "ps_5_0"); + m_pDevice->InternalRef(); DepthCopyArrayToMSPS = shaderCache->MakePShader(multisamplehlsl.c_str(), "RENDERDOC_DepthCopyArrayToMS", "ps_5_0"); + m_pDevice->InternalRef(); std::string displayhlsl = GetEmbeddedResource(debugcbuffers_h); displayhlsl += GetEmbeddedResource(debugcommon_hlsl); displayhlsl += GetEmbeddedResource(debugdisplay_hlsl); MSArrayCopyVS = shaderCache->MakeVShader(displayhlsl.c_str(), "RENDERDOC_FullscreenVS", "vs_4_0"); + m_pDevice->InternalRef(); for(int i = 0; i < ARRAY_COUNT(PublicCBuffers); i++) + { PublicCBuffers[i] = MakeCBuffer(sizeof(float) * 4 * 100); + m_pDevice->InternalRef(); + } publicCBufIdx = 0; } @@ -248,17 +254,29 @@ void D3D11DebugManager::ShutdownResources() SAFE_RELEASE(PredicateDSV); SAFE_RELEASE(CopyMSToArrayPS); + m_pDevice->InternalRelease(); SAFE_RELEASE(CopyArrayToMSPS); + m_pDevice->InternalRelease(); SAFE_RELEASE(FloatCopyMSToArrayPS); + m_pDevice->InternalRelease(); SAFE_RELEASE(FloatCopyArrayToMSPS); + m_pDevice->InternalRelease(); SAFE_RELEASE(DepthCopyMSToArrayPS); + m_pDevice->InternalRelease(); SAFE_RELEASE(DepthCopyArrayToMSPS); + m_pDevice->InternalRelease(); SAFE_RELEASE(PixelHistoryUnusedCS); + m_pDevice->InternalRelease(); SAFE_RELEASE(PixelHistoryCopyCS); + m_pDevice->InternalRelease(); + + SAFE_RELEASE(MSArrayCopyVS); + m_pDevice->InternalRelease(); for(int i = 0; i < ARRAY_COUNT(PublicCBuffers); i++) { SAFE_RELEASE(PublicCBuffers[i]); + m_pDevice->InternalRelease(); } } diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index fb475b9c9..4b4d7c027 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -242,6 +242,8 @@ WrappedID3D11Device::~WrappedID3D11Device() m_CachedStateObjects.clear(); + GetResourceManager()->ClearReferencedResources(); + SAFE_RELEASE(m_pDevice1); SAFE_RELEASE(m_pDevice2); SAFE_RELEASE(m_pDevice3); diff --git a/renderdoc/driver/d3d11/d3d11_hooks.cpp b/renderdoc/driver/d3d11/d3d11_hooks.cpp index c6c5c6000..5f962c3b1 100644 --- a/renderdoc/driver/d3d11/d3d11_hooks.cpp +++ b/renderdoc/driver/d3d11/d3d11_hooks.cpp @@ -306,7 +306,13 @@ private: RDCDEBUG("created wrapped device."); *ppDevice = wrap; - wrap->GetImmediateContext(ppImmediateContext); + + if(ppImmediateContext) + { + if(*ppImmediateContext) + (*ppImmediateContext)->Release(); + wrap->GetImmediateContext(ppImmediateContext); + } if(ppSwapChain && *ppSwapChain) *ppSwapChain = new WrappedIDXGISwapChain4( diff --git a/renderdoc/driver/d3d11/d3d11_rendertext.cpp b/renderdoc/driver/d3d11/d3d11_rendertext.cpp index 8bb7852f0..c9bce1565 100644 --- a/renderdoc/driver/d3d11/d3d11_rendertext.cpp +++ b/renderdoc/driver/d3d11/d3d11_rendertext.cpp @@ -37,7 +37,7 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) RenderDoc::Inst().GetCrashHandler()->RegisterMemoryRegion(this, sizeof(D3D11TextRenderer)); m_pDevice = wrapper; - m_pDevice->GetImmediateContext(&m_pImmediateContext); + m_pImmediateContext = m_pDevice->GetImmediateContext(); HRESULT hr = S_OK; @@ -60,6 +60,8 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) if(FAILED(hr)) RDCERR("Failed to create font blendstate HRESULT: %s", ToStr(hr).c_str()); + m_pDevice->InternalRef(); + D3D11_SAMPLER_DESC sampDesc; RDCEraseEl(sampDesc); @@ -75,6 +77,8 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) if(FAILED(hr)) RDCERR("Failed to create linear sampler state HRESULT: %s", ToStr(hr).c_str()); + m_pDevice->InternalRef(); + D3D11_TEXTURE2D_DESC desc; RDCEraseEl(desc); @@ -130,6 +134,8 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) if(FAILED(hr)) RDCERR("Failed to create debugTex HRESULT: %s", ToStr(hr).c_str()); + m_pDevice->InternalRef(); + delete[] buf; hr = m_pDevice->CreateShaderResourceView(debugTex, NULL, &Tex); @@ -137,6 +143,8 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) if(FAILED(hr)) RDCERR("Failed to create Tex HRESULT: %s", ToStr(hr).c_str()); + m_pDevice->InternalRef(); + SAFE_RELEASE(debugTex); Vec4f glyphData[2 * (numChars + 1)]; @@ -155,6 +163,8 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) if(FAILED(hr)) RDCERR("Failed to create font GlyphData HRESULT: %s", ToStr(hr).c_str()); + m_pDevice->InternalRef(); + for(int i = 0; i < numChars; i++) { stbtt_bakedchar *b = chardata + i; @@ -188,12 +198,16 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) if(FAILED(hr)) RDCERR("Failed to create font CBuffer HRESULT: %s", ToStr(hr).c_str()); + m_pDevice->InternalRef(); + cbufDesc.ByteWidth = (2 + FONT_MAX_CHARS) * sizeof(uint32_t) * 4; hr = m_pDevice->CreateBuffer(&cbufDesc, NULL, &CharBuffer); if(FAILED(hr)) RDCERR("Failed to create font CharBuffer HRESULT: %s", ToStr(hr).c_str()); + m_pDevice->InternalRef(); + std::string fullhlsl = ""; { std::string debugShaderCBuf = GetEmbeddedResource(debugcbuffers_h); @@ -207,7 +221,9 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) shaderCache->SetCaching(true); VS = shaderCache->MakeVShader(fullhlsl.c_str(), "RENDERDOC_TextVS", "vs_4_0"); + m_pDevice->InternalRef(); PS = shaderCache->MakePShader(fullhlsl.c_str(), "RENDERDOC_TextPS", "ps_4_0"); + m_pDevice->InternalRef(); shaderCache->SetCaching(false); } @@ -215,15 +231,21 @@ D3D11TextRenderer::D3D11TextRenderer(WrappedID3D11Device *wrapper) D3D11TextRenderer::~D3D11TextRenderer() { SAFE_RELEASE(Tex); + m_pDevice->InternalRelease(); SAFE_RELEASE(LinearSampler); + m_pDevice->InternalRelease(); SAFE_RELEASE(BlendState); + m_pDevice->InternalRelease(); SAFE_RELEASE(CBuffer); + m_pDevice->InternalRelease(); SAFE_RELEASE(GlyphData); + m_pDevice->InternalRelease(); SAFE_RELEASE(CharBuffer); + m_pDevice->InternalRelease(); SAFE_RELEASE(VS); + m_pDevice->InternalRelease(); SAFE_RELEASE(PS); - - SAFE_RELEASE(m_pImmediateContext); + m_pDevice->InternalRelease(); if(RenderDoc::Inst().GetCrashHandler()) RenderDoc::Inst().GetCrashHandler()->UnregisterMemoryRegion(this); diff --git a/renderdoc/driver/d3d11/d3d11_rendertext.h b/renderdoc/driver/d3d11/d3d11_rendertext.h index 94d1de54d..05e5da5ed 100644 --- a/renderdoc/driver/d3d11/d3d11_rendertext.h +++ b/renderdoc/driver/d3d11/d3d11_rendertext.h @@ -26,6 +26,9 @@ #include "driver/dx/official/d3d11_4.h" +class WrappedID3D11Device; +class WrappedID3D11DeviceContext; + class D3D11TextRenderer { public: @@ -47,8 +50,8 @@ private: int m_width = 1, m_height = 1; float m_supersamplingX = 1.0f, m_supersamplingY = 1.0f; - ID3D11Device *m_pDevice = NULL; - ID3D11DeviceContext *m_pImmediateContext = NULL; + WrappedID3D11Device *m_pDevice = NULL; + WrappedID3D11DeviceContext *m_pImmediateContext = NULL; void RenderTextInternal(float x, float y, const char *text); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index dc0aa58e7..fb291681c 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -759,6 +759,8 @@ WrappedOpenGL::~WrappedOpenGL() SAFE_DELETE(m_FrameReader); + GetResourceManager()->ClearReferencedResources(); + GetResourceManager()->ReleaseCurrentResource(m_DeviceResourceID); GetResourceManager()->ReleaseCurrentResource(m_ContextResourceID);