Fix refcounting on D3D11 devices

This commit is contained in:
baldurk
2018-02-26 15:40:20 +00:00
parent f3a210c636
commit d130b9652f
6 changed files with 63 additions and 10 deletions
+22 -4
View File
@@ -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();
}
}
+2
View File
@@ -242,6 +242,8 @@ WrappedID3D11Device::~WrappedID3D11Device()
m_CachedStateObjects.clear();
GetResourceManager()->ClearReferencedResources();
SAFE_RELEASE(m_pDevice1);
SAFE_RELEASE(m_pDevice2);
SAFE_RELEASE(m_pDevice3);
+7 -1
View File
@@ -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(
+25 -3
View File
@@ -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);
+5 -2
View File
@@ -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);
+2
View File
@@ -759,6 +759,8 @@ WrappedOpenGL::~WrappedOpenGL()
SAFE_DELETE(m_FrameReader);
GetResourceManager()->ClearReferencedResources();
GetResourceManager()->ReleaseCurrentResource(m_DeviceResourceID);
GetResourceManager()->ReleaseCurrentResource(m_ContextResourceID);