Markus Amsler : Revert "d3d: Remove AddRef from IWineD3DDevice_GetSwapChain .".

Alexandre Julliard julliard at wine.codeweavers.com
Thu Nov 30 13:40:56 CST 2006


Module: wine
Branch: master
Commit: c40501db50ebb9a7a6dcd3014b3dad138c0fd3ad
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c40501db50ebb9a7a6dcd3014b3dad138c0fd3ad

Author: Markus Amsler <markus.amsler at oribi.org>
Date:   Thu Nov 30 13:33:11 2006 +0100

Revert "d3d: Remove AddRef from IWineD3DDevice_GetSwapChain.".

This reverts commit f84f687e6d3d8f432de2c5d9b2af13d2c5cedfb2.

---

 dlls/d3d9/swapchain.c    |    1 +
 dlls/wined3d/device.c    |   19 ++++++++++++++-----
 dlls/wined3d/drawprim.c  |    1 +
 dlls/wined3d/surface.c   |    3 +++
 dlls/wined3d/swapchain.c |    1 +
 5 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c
index 2ead3ed..a4007ad 100644
--- a/dlls/d3d9/swapchain.c
+++ b/dlls/d3d9/swapchain.c
@@ -219,6 +219,7 @@ HRESULT  WINAPI  IDirect3DDevice9Impl_Ge
     hrc = IWineD3DDevice_GetSwapChain(This->WineD3DDevice, iSwapChain, &swapchain);
     if (hrc == D3D_OK && NULL != swapchain) {
        IWineD3DSwapChain_GetParent(swapchain, (IUnknown **)pSwapChain);
+       IWineD3DSwapChain_Release(swapchain);
     } else {
         *pSwapChain = NULL;
     }
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 57318d4..597fcac 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1614,6 +1614,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
             /* TODO: don't use Impl structures outside of create functions! (a context manager will replace the ->glCtx) */
             /* and create a new context with the implicit swapchains context as the shared context */
             object->glCtx = glXCreateContext(object->display, object->visInfo, ((IWineD3DSwapChainImpl *)implSwapChain)->glCtx, GL_TRUE);
+            IWineD3DSwapChain_Release(implSwapChain);
         }
     }
 
@@ -1931,6 +1932,7 @@ static HRESULT  WINAPI  IWineD3DDeviceIm
 
     if(iSwapChain < This->NumberOfSwapChains) {
         *pSwapChain = This->swapchains[iSwapChain];
+        IWineD3DSwapChain_AddRef(*pSwapChain);
         TRACE("(%p) returning %p\n", This, *pSwapChain);
         return WINED3D_OK;
     } else {
@@ -5849,6 +5851,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     hr = IWineD3DDeviceImpl_GetSwapChain(iface,  iSwapChain, &swapChain);
     if (hr == WINED3D_OK) {
         hr = IWineD3DSwapChain_GetBackBuffer(swapChain, BackBuffer, Type, ppBackBuffer);
+            IWineD3DSwapChain_Release(swapChain);
     } else {
         *ppBackBuffer = NULL;
     }
@@ -5870,6 +5873,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
         hr = IWineD3DDeviceImpl_GetSwapChain(iface,  iSwapChain, (IWineD3DSwapChain **)&swapChain);
         if (hr == WINED3D_OK) {
             hr = IWineD3DSwapChain_GetDisplayMode(swapChain, pMode);
+            IWineD3DSwapChain_Release(swapChain);
         } else {
             FIXME("(%p) Error getting display mode\n", This);
         }
@@ -6024,6 +6028,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
         IWineD3DDeviceImpl_GetSwapChain(iface, i , (IWineD3DSwapChain **)&swapChain);
         TRACE("presentinng chain %d, %p\n", i, swapChain);
         IWineD3DSwapChain_Present(swapChain, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion, 0);
+        IWineD3DSwapChain_Release(swapChain);
     }
 
     return WINED3D_OK;
@@ -6492,6 +6497,7 @@ static HRESULT  WINAPI  IWineD3DDeviceIm
     hr = IWineD3DDeviceImpl_GetSwapChain(iface,  iSwapChain, (IWineD3DSwapChain **)&swapChain);
     if(hr == WINED3D_OK) {
         hr = IWineD3DSwapChain_GetFrontBufferData(swapChain, pDestSurface);
+                IWineD3DSwapChain_Release(swapChain);
     }
     return hr;
 }
@@ -6600,6 +6606,7 @@ static HRESULT  WINAPI  IWineD3DDeviceIm
     hr = IWineD3DDeviceImpl_GetSwapChain(iface,  iSwapChain, (IWineD3DSwapChain **)&swapChain);
     if(hr == WINED3D_OK){
         hr = IWineD3DSwapChain_GetRasterStatus(swapChain, pRasterStatus);
+        IWineD3DSwapChain_Release(swapChain);
     }else{
         FIXME("(%p) IWineD3DSwapChain_GetRasterStatus returned in error\n", This);
     }
@@ -6905,6 +6912,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl
         return hr;
     }
 
+    /* Make sure to release the swapchain */
+    IWineD3DSwapChain_Release((IWineD3DSwapChain *) Swapchain);
+
     if(FrontImpl && !(FrontImpl->resource.usage & WINED3DUSAGE_RENDERTARGET) ) {
         ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
         return WINED3DERR_INVALIDCALL;
@@ -7431,12 +7441,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     IWineD3DDevice_GetSwapChain(iface, 0, &implicitSwapchain);
     IWineD3DSurface_GetContainer(RenderSurface, &IID_IWineD3DSwapChain, (void**) &renderSurfaceSwapchain);
     IWineD3DSurface_GetContainer(This->renderTarget, &IID_IWineD3DSwapChain, (void **)&currentSwapchain);
-    if (currentSwapchain == NULL) {
+    if (currentSwapchain == NULL)
         IWineD3DDevice_GetSwapChain(iface, 0, &currentSwapchain);
-        /* GetContainer currently AddRefs, but GetSwapChain doesn't.
-         * Like this the release code for both is the same. */
-        IWineD3DDevice_AddRef(currentSwapchain);
-    }
 
     currentSwapchainImpl = (IWineD3DSwapChainImpl*) currentSwapchain;
     implicitSwapchainImpl = (IWineD3DSwapChainImpl*) implicitSwapchain;
@@ -7588,6 +7594,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl
     }
 
     if (cfgs != NULL)                   XFree(cfgs);
+    if (implicitSwapchain != NULL)       IWineD3DSwapChain_Release(implicitSwapchain);
     if (currentSwapchain != NULL)       IWineD3DSwapChain_Release(currentSwapchain);
     if (renderSurfaceSwapchain != NULL) IWineD3DSwapChain_Release(renderSurfaceSwapchain);
     LEAVE_GL();
@@ -7742,6 +7749,7 @@ static void WINAPI IWineD3DDeviceImpl_Se
 
     if ((hrc = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, &swapchain)) == WINED3D_OK) {
         IWineD3DSwapChain_SetGammaRamp(swapchain, Flags, (WINED3DGAMMARAMP *)pRamp);
+        IWineD3DSwapChain_Release(swapchain);
     }
     return;
 }
@@ -7754,6 +7762,7 @@ static void WINAPI IWineD3DDeviceImpl_Ge
 
     if ((hrc = IWineD3DDeviceImpl_GetSwapChain(iface, iSwapChain, &swapchain)) == WINED3D_OK) {
         hrc =IWineD3DSwapChain_GetGammaRamp(swapchain, pRamp);
+        IWineD3DSwapChain_Release(swapchain);
     }
     return;
 }
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 05e8f78..7dc33e0 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -2156,6 +2156,7 @@ void drawPrimitive(IWineD3DDevice *iface
         IWineD3DDevice_GetSwapChain(iface, i, (IWineD3DSwapChain **) &swapchain);
         if(swapchain) {
             if(swapchain->backBuffer) ((IWineD3DSurfaceImpl *) swapchain->backBuffer[0])->Flags |= SFLAG_GLDIRTY;
+            IWineD3DSwapChain_Release( (IWineD3DSwapChain *) swapchain);
         }
     }
 
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 42e5d04..84a838f 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -750,6 +750,7 @@ static HRESULT WINAPI IWineD3DSurfaceImp
                     notInContext = TRUE;
                     /* TODO: check the contexts, to see if were shared with the current context */
                 }
+                IWineD3DSwapChain_Release((IWineD3DSwapChain *)implSwapChain);
             }
             if (swapchain != NULL)       IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
             if (targetSwapChain != NULL) IWineD3DSwapChain_Release((IWineD3DSwapChain *)targetSwapChain);
@@ -1237,6 +1238,7 @@ static HRESULT WINAPI IWineD3DSurfaceImp
         } else {
             FIXME("unsupported unlocking to Rendering surface surf@%p usage(%s)\n", This, debug_d3dusage(This->resource.usage));
         }
+        IWineD3DSwapChain_Release((IWineD3DSwapChain *)implSwapChain);
 
     } else if (WINED3DUSAGE_DEPTHSTENCIL & This->resource.usage) { /* stencil surfaces */
 
@@ -2702,6 +2704,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOv
 
         TRACE("Calling GetSwapChain with mydevice = %p\n", myDevice);
         IWineD3DDevice_GetSwapChain((IWineD3DDevice *)myDevice, 0, (IWineD3DSwapChain **)&implSwapChain);
+        IWineD3DSwapChain_Release( (IWineD3DSwapChain *) implSwapChain );
         if(implSwapChain->backBuffer && This == (IWineD3DSurfaceImpl*) implSwapChain->backBuffer[0]) {
             glDrawBuffer(GL_BACK);
             checkGLcall("glDrawBuffer(GL_BACK)");
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 93cdbb4..4e8f97f 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -294,6 +294,7 @@ static HRESULT WINAPI IWineD3DSwapChainI
                 glXDestroyContext(oldDisplay, oldContext); /* Should this happen on an active context? seems a bad idea */
                 LEAVE_GL();
             }
+            IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapChainImpl);
 
         }
 




More information about the wine-cvs mailing list