Henri Verbeet : wined3d: Merge the IWineD3DSurface::Release() implementations.

Alexandre Julliard julliard at winehq.org
Wed Apr 27 12:47:25 CDT 2011


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Tue Apr 26 19:24:17 2011 +0200

wined3d: Merge the IWineD3DSurface::Release() implementations.

---

 dlls/wined3d/surface.c         |  124 ++++++++++++++--------------------------
 dlls/wined3d/wined3d_private.h |    1 +
 2 files changed, 45 insertions(+), 80 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 143333d..6942fc4 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -775,6 +775,7 @@ static const struct wined3d_resource_ops surface_resource_ops =
 static const struct wined3d_surface_ops surface_ops =
 {
     surface_private_setup,
+    surface_cleanup,
     surface_realize_palette,
     surface_draw_overlay,
 };
@@ -895,6 +896,7 @@ static HRESULT gdi_surface_draw_overlay(IWineD3DSurfaceImpl *surface)
 static const struct wined3d_surface_ops gdi_surface_ops =
 {
     gdi_surface_private_setup,
+    surface_gdi_cleanup,
     gdi_surface_realize_palette,
     gdi_surface_draw_overlay,
 };
@@ -1747,6 +1749,45 @@ static ULONG WINAPI IWineD3DBaseSurfaceImpl_AddRef(IWineD3DSurface *iface)
     return refcount;
 }
 
+/* Do not call while under the GL lock. */
+static ULONG WINAPI IWineD3DBaseSurfaceImpl_Release(IWineD3DSurface *iface)
+{
+    IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface;
+    ULONG refcount;
+
+    TRACE("Surface %p, container %p of type %#x.\n",
+            surface, surface->container.u.base, surface->container.type);
+
+    switch (surface->container.type)
+    {
+        case WINED3D_CONTAINER_TEXTURE:
+            return wined3d_texture_decref(surface->container.u.texture);
+
+        case WINED3D_CONTAINER_SWAPCHAIN:
+            return wined3d_swapchain_decref(surface->container.u.swapchain);
+
+        default:
+            ERR("Unhandled container type %#x.\n", surface->container.type);
+        case WINED3D_CONTAINER_NONE:
+            break;
+    }
+
+    refcount = InterlockedDecrement(&surface->resource.ref);
+    TRACE("%p decreasing refcount to %u.\n", surface, refcount);
+
+    if (!refcount)
+    {
+        surface_cleanup(surface);
+        surface->surface_ops->surface_cleanup(surface);
+        surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent);
+
+        TRACE("Destroyed surface %p.\n", surface);
+        HeapFree(GetProcessHeap(), 0, surface);
+    }
+
+    return refcount;
+}
+
 static HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPrivateData(IWineD3DSurface *iface,
         REFGUID riid, const void *data, DWORD data_size, DWORD flags)
 {
@@ -3439,43 +3480,6 @@ static HRESULT WINAPI IWineD3DBaseSurfaceImpl_Map(IWineD3DSurface *iface,
 
     return WINED3D_OK;
 }
-/* Do not call while under the GL lock. */
-static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface)
-{
-    IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface;
-    ULONG refcount;
-
-    TRACE("Surface %p, container %p of type %#x.\n",
-            surface, surface->container.u.base, surface->container.type);
-
-    switch (surface->container.type)
-    {
-        case WINED3D_CONTAINER_TEXTURE:
-            return wined3d_texture_decref(surface->container.u.texture);
-
-        case WINED3D_CONTAINER_SWAPCHAIN:
-            return wined3d_swapchain_decref(surface->container.u.swapchain);
-
-        default:
-            ERR("Unhandled container type %#x.\n", surface->container.type);
-        case WINED3D_CONTAINER_NONE:
-            break;
-    }
-
-    refcount = InterlockedDecrement(&surface->resource.ref);
-    TRACE("%p decreasing refcount to %u.\n", surface, refcount);
-
-    if (!refcount)
-    {
-        surface_cleanup(surface);
-        surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent);
-
-        TRACE("Destroyed surface %p.\n", surface);
-        HeapFree(GetProcessHeap(), 0, surface);
-    }
-
-    return refcount;
-}
 
 /* ****************************************************
    IWineD3DSurface IWineD3DResource parts follow
@@ -6920,7 +6924,7 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
     /* IUnknown */
     IWineD3DBaseSurfaceImpl_QueryInterface,
     IWineD3DBaseSurfaceImpl_AddRef,
-    IWineD3DSurfaceImpl_Release,
+    IWineD3DBaseSurfaceImpl_Release,
     /* IWineD3DResource */
     IWineD3DBaseSurfaceImpl_GetParent,
     IWineD3DBaseSurfaceImpl_SetPrivateData,
@@ -7202,43 +7206,6 @@ static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum wined
     return TRUE;
 }
 
-static ULONG WINAPI IWineGDISurfaceImpl_Release(IWineD3DSurface *iface)
-{
-    IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)iface;
-    ULONG refcount;
-
-    TRACE("Surface %p, container %p of type %#x.\n",
-            surface, surface->container.u.base, surface->container.type);
-
-    switch (surface->container.type)
-    {
-        case WINED3D_CONTAINER_TEXTURE:
-            return wined3d_texture_decref(surface->container.u.texture);
-
-        case WINED3D_CONTAINER_SWAPCHAIN:
-            return wined3d_swapchain_decref(surface->container.u.swapchain);
-
-        default:
-            ERR("Unhandled container type %#x.\n", surface->container.type);
-        case WINED3D_CONTAINER_NONE:
-            break;
-    }
-
-    refcount = InterlockedDecrement(&surface->resource.ref);
-    TRACE("%p decreasing refcount to %u.\n", surface, refcount);
-
-    if (!refcount)
-    {
-        surface_gdi_cleanup(surface);
-        surface->resource.parent_ops->wined3d_object_destroyed(surface->resource.parent);
-
-        TRACE("Destroyed surface %p.\n", surface);
-        HeapFree(GetProcessHeap(), 0, surface);
-    }
-
-    return refcount;
-}
-
 static void WINAPI IWineGDISurfaceImpl_PreLoad(IWineD3DSurface *iface)
 {
     ERR("(%p): PreLoad is not supported on X11 surfaces!\n", iface);
@@ -7499,7 +7466,7 @@ static const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl =
     /* IUnknown */
     IWineD3DBaseSurfaceImpl_QueryInterface,
     IWineD3DBaseSurfaceImpl_AddRef,
-    IWineGDISurfaceImpl_Release,
+    IWineD3DBaseSurfaceImpl_Release,
     /* IWineD3DResource */
     IWineD3DBaseSurfaceImpl_GetParent,
     IWineD3DBaseSurfaceImpl_SetPrivateData,
@@ -7543,7 +7510,6 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type,
 {
     const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
     const struct wined3d_format *format = wined3d_get_format(gl_info, format_id);
-    void (*cleanup)(IWineD3DSurfaceImpl *This);
     unsigned int resource_size;
     HRESULT hr;
 
@@ -7605,13 +7571,11 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type,
         case SURFACE_OPENGL:
             surface->lpVtbl = &IWineD3DSurface_Vtbl;
             surface->surface_ops = &surface_ops;
-            cleanup = surface_cleanup;
             break;
 
         case SURFACE_GDI:
             surface->lpVtbl = &IWineGDISurface_Vtbl;
             surface->surface_ops = &gdi_surface_ops;
-            cleanup = surface_gdi_cleanup;
             break;
 
         default:
@@ -7653,7 +7617,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type,
     if (FAILED(hr))
     {
         ERR("Private setup failed, returning %#x\n", hr);
-        cleanup(surface);
+        surface->surface_ops->surface_cleanup(surface);
         return hr;
     }
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 0a9b36a..676f367 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2021,6 +2021,7 @@ struct wined3d_subresource_container
 struct wined3d_surface_ops
 {
     HRESULT (*surface_private_setup)(struct IWineD3DSurfaceImpl *surface);
+    void (*surface_cleanup)(struct IWineD3DSurfaceImpl *surface);
     void (*surface_realize_palette)(struct IWineD3DSurfaceImpl *surface);
     HRESULT (*surface_draw_overlay)(struct IWineD3DSurfaceImpl *surface);
 };




More information about the wine-cvs mailing list