From 6df25922354ea9663c1011054020f22bdcbb3034 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 26 Nov 2022 19:50:26 +0200 Subject: [PATCH] Direct3D11 shader support render target leak fix --- od-win32/direct3d11.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) 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; -- 2.47.3