From: Toni Wilen Date: Sat, 26 Nov 2022 17:50:26 +0000 (+0200) Subject: Direct3D11 shader support render target leak fix X-Git-Tag: 41000~51 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=6df25922354ea9663c1011054020f22bdcbb3034;p=francis%2Fwinuae.git Direct3D11 shader support render target leak fix --- diff --git a/od-win32/direct3d11.cpp b/od-win32/direct3d11.cpp index f4c3407d..71effa3b 100644 --- a/od-win32/direct3d11.cpp +++ b/od-win32/direct3d11.cpp @@ -1357,7 +1357,7 @@ static bool psEffect_End(struct d3d11struct *d3d, struct shaderdata11 *s) static bool processshader(struct d3d11struct *d3d, struct shadertex *st, struct shaderdata11 *s, bool rendertarget) { int uPasses, uPass, uIndex; - ID3D11RenderTargetView *lpRenderTarget; + ID3D11RenderTargetView *lpRenderTarget = NULL; ID3D11RenderTargetView *lpNewRenderTarget; struct shadertex *lpWorkTexture; @@ -1391,8 +1391,9 @@ pass2: psEffect_End(d3d, s); } - if (lpRenderTarget) + if (lpRenderTarget) { d3d->m_deviceContext->OMSetRenderTargets(1, &lpRenderTarget, NULL); + } lpNewRenderTarget = NULL; if (psEffect_hasPreProcess2(s) && lpWorkTexture == &s->lpWorkTexture1) { @@ -1400,7 +1401,10 @@ pass2: goto pass2; } - lpRenderTarget = NULL; + if (lpRenderTarget) { + lpRenderTarget->Release(); + lpRenderTarget = NULL; + } } psEffect_SetMatrices(&d3d->m_matProj2, &d3d->m_matView2, &d3d->m_matWorld2, s); @@ -1415,8 +1419,12 @@ pass2: uPasses = 0; if (psEffect_Begin(d3d, psEffect_Combine, &uPasses, &uIndex, s)) { for (uPass = 0; uPass < uPasses; uPass++) { - if (!psEffect_BeginPass(d3d, s, uPass, uIndex)) - return NULL; + if (!psEffect_BeginPass(d3d, s, uPass, uIndex)) { + if (lpRenderTarget) { + lpRenderTarget->Release(); + } + return false; + } d3d->m_deviceContext->DrawIndexed(6, 0, 0); psEffect_EndPass(d3d, s); } @@ -1424,10 +1432,13 @@ pass2: } if (rendertarget) { - d3d->m_deviceContext->OMSetRenderTargets(1, &lpRenderTarget, NULL); } + if (lpRenderTarget) { + lpRenderTarget->Release(); + } + memcpy(st, &s->lpTempTexture, sizeof(struct shadertex)); return true;