mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-06 10:00:40 +00:00
Fix refcounting on D3D11 devices
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -242,6 +242,8 @@ WrappedID3D11Device::~WrappedID3D11Device()
|
||||
|
||||
m_CachedStateObjects.clear();
|
||||
|
||||
GetResourceManager()->ClearReferencedResources();
|
||||
|
||||
SAFE_RELEASE(m_pDevice1);
|
||||
SAFE_RELEASE(m_pDevice2);
|
||||
SAFE_RELEASE(m_pDevice3);
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -759,6 +759,8 @@ WrappedOpenGL::~WrappedOpenGL()
|
||||
|
||||
SAFE_DELETE(m_FrameReader);
|
||||
|
||||
GetResourceManager()->ClearReferencedResources();
|
||||
|
||||
GetResourceManager()->ReleaseCurrentResource(m_DeviceResourceID);
|
||||
GetResourceManager()->ReleaseCurrentResource(m_ContextResourceID);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user