Henri Verbeet : wined3d: Set color / depth / stencil surfaces to NULL before releasing them in IWineD3DDeviceImpl_Uninit3D ().

Alexandre Julliard julliard at winehq.org
Mon Jan 31 11:26:12 CST 2011


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Fri Jan 28 20:05:40 2011 +0100

wined3d: Set color / depth / stencil surfaces to NULL before releasing them in IWineD3DDeviceImpl_Uninit3D().

---

 dlls/wined3d/device.c |   41 ++++++++++++++++++++++-------------------
 1 files changed, 22 insertions(+), 19 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 676eafc..d5ae431 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -2112,6 +2112,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
 {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     const struct wined3d_gl_info *gl_info;
+    struct IWineD3DSurfaceImpl *surface;
     struct wined3d_context *context;
     int sampler;
     UINT i;
@@ -2200,44 +2201,46 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
     /* Release the buffers (with sanity checks)*/
     if (This->onscreen_depth_stencil)
     {
-        IWineD3DSurface_Release((IWineD3DSurface *)This->onscreen_depth_stencil);
+        surface = This->onscreen_depth_stencil;
         This->onscreen_depth_stencil = NULL;
+        IWineD3DSurface_Release((IWineD3DSurface *)surface);
     }
 
     if (This->depth_stencil)
     {
-        IWineD3DSurfaceImpl *ds = This->depth_stencil;
+        surface = This->depth_stencil;
 
-        TRACE("Releasing depth/stencil buffer %p.\n", ds);
+        TRACE("Releasing depth/stencil buffer %p.\n", surface);
 
         This->depth_stencil = NULL;
-        if (IWineD3DSurface_Release((IWineD3DSurface *)ds)
-                && ds != This->auto_depth_stencil)
+        if (IWineD3DSurface_Release((IWineD3DSurface *)surface)
+                && surface != This->auto_depth_stencil)
         {
-            ERR("Something is still holding a reference to depth/stencil buffer %p.\n", ds);
+            ERR("Something is still holding a reference to depth/stencil buffer %p.\n", surface);
         }
     }
 
-    for (i = 1; i < gl_info->limits.buffers; ++i)
-    {
-        IWineD3DDevice_SetRenderTarget(iface, i, NULL, FALSE);
-    }
-
-    TRACE("Releasing the render target at %p\n", This->render_targets[0]);
-    IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[0]);
-
-    TRACE("Setting rendertarget to NULL\n");
-    This->render_targets[0] = NULL;
-
     if (This->auto_depth_stencil)
     {
-        if (IWineD3DSurface_Release((IWineD3DSurface *)This->auto_depth_stencil))
+        surface = This->auto_depth_stencil;
+        This->auto_depth_stencil = NULL;
+        if (IWineD3DSurface_Release((IWineD3DSurface *)surface))
         {
             FIXME("(%p) Something's still holding the auto depth stencil buffer\n", This);
         }
-        This->auto_depth_stencil = NULL;
     }
 
+    for (i = 1; i < gl_info->limits.buffers; ++i)
+    {
+        IWineD3DDevice_SetRenderTarget(iface, i, NULL, FALSE);
+    }
+
+    surface = This->render_targets[0];
+    TRACE("Setting rendertarget 0 to NULL\n");
+    This->render_targets[0] = NULL;
+    TRACE("Releasing the render target at %p\n", surface);
+    IWineD3DSurface_Release((IWineD3DSurface *)surface);
+
     context_release(context);
 
     for (i = 0; i < This->NumberOfSwapChains; ++i)




More information about the wine-cvs mailing list