Skip to content

Commit b59fdbd

Browse files
committed
CRenderItemManager::PreDrawWorld: Fix D3D COM object reference leaks (COM objects with dangling references), GPU resource leaks, and avoid device state corruption
1 parent 96e88e8 commit b59fdbd

File tree

1 file changed

+38
-8
lines changed

1 file changed

+38
-8
lines changed

Client/core/Graphics/CRenderItemManager.cpp

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,20 +1117,50 @@ void CRenderItemManager::PreDrawWorld()
11171117
assert(!m_pNonAADepthSurface2);
11181118

11191119
const D3DPRESENT_PARAMETERS& pp = g_pDeviceState->CreationState.PresentationParameters;
1120+
HRESULT hr = D3D_OK;
11201121
if (!m_bIsSwiftShader)
1121-
m_pDevice->CreateRenderTarget(m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, pp.BackBufferFormat, D3DMULTISAMPLE_NONE, 0, false,
1122-
&m_pNonAARenderTarget, NULL);
1122+
{
1123+
hr = m_pDevice->CreateRenderTarget(m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, pp.BackBufferFormat, D3DMULTISAMPLE_NONE, 0, false,
1124+
&m_pNonAARenderTarget, NULL);
1125+
if (FAILED(hr) || !m_pNonAARenderTarget)
1126+
{
1127+
SAFE_RELEASE(m_pNonAARenderTarget);
1128+
hr = FAILED(hr) ? hr : E_FAIL;
1129+
}
1130+
}
11231131
else
11241132
{
11251133
// Render target texture is needed when emulating StretchRect
1126-
m_pDevice->CreateTexture(m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, 1, D3DUSAGE_RENDERTARGET, pp.BackBufferFormat, D3DPOOL_DEFAULT,
1127-
&m_pNonAARenderTargetTexture, NULL);
1128-
if (m_pNonAARenderTargetTexture)
1129-
m_pNonAARenderTargetTexture->GetSurfaceLevel(0, &m_pNonAARenderTarget);
1134+
hr = m_pDevice->CreateTexture(m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, 1, D3DUSAGE_RENDERTARGET, pp.BackBufferFormat, D3DPOOL_DEFAULT,
1135+
&m_pNonAARenderTargetTexture, NULL);
1136+
if (FAILED(hr) || !m_pNonAARenderTargetTexture)
1137+
{
1138+
SAFE_RELEASE(m_pNonAARenderTargetTexture);
1139+
hr = FAILED(hr) ? hr : E_FAIL;
1140+
}
1141+
else
1142+
{
1143+
hr = m_pNonAARenderTargetTexture->GetSurfaceLevel(0, &m_pNonAARenderTarget);
1144+
if (FAILED(hr) || !m_pNonAARenderTarget)
1145+
{
1146+
SAFE_RELEASE(m_pNonAARenderTarget);
1147+
SAFE_RELEASE(m_pNonAARenderTargetTexture);
1148+
hr = FAILED(hr) ? hr : E_FAIL;
1149+
}
1150+
}
11301151
}
11311152

1132-
m_pDevice->CreateDepthStencilSurface(m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, pp.AutoDepthStencilFormat, D3DMULTISAMPLE_NONE, 0, true,
1133-
&m_pNonAADepthSurface2, NULL);
1153+
if (SUCCEEDED(hr))
1154+
{
1155+
hr = m_pDevice->CreateDepthStencilSurface(m_uiDefaultViewportSizeX, m_uiDefaultViewportSizeY, pp.AutoDepthStencilFormat, D3DMULTISAMPLE_NONE, 0,
1156+
true, &m_pNonAADepthSurface2, NULL);
1157+
if (FAILED(hr) || !m_pNonAADepthSurface2)
1158+
{
1159+
SAFE_RELEASE(m_pNonAADepthSurface2);
1160+
SAFE_RELEASE(m_pNonAARenderTarget);
1161+
SAFE_RELEASE(m_pNonAARenderTargetTexture);
1162+
}
1163+
}
11341164
}
11351165

11361166
// Set depth buffer and maybe render target

0 commit comments

Comments
 (0)