]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Direct3D11 shader support render target leak fix
authorToni Wilen <twilen@winuae.net>
Sat, 26 Nov 2022 17:50:26 +0000 (19:50 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 26 Nov 2022 17:50:26 +0000 (19:50 +0200)
od-win32/direct3d11.cpp

index f4c3407ddc5832e585ec15cf203e1604f757d5fd..71effa3bbfeb9af616d6b3c3c9e88911b92f6989 100644 (file)
@@ -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;