Henri Verbeet : ddraw: The texture interface shares its refcount with the surface interface version used to create the surface .

Alexandre Julliard julliard at winehq.org
Mon Apr 2 13:14:49 CDT 2012


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Sun Apr  1 13:12:03 2012 +0200

ddraw: The texture interface shares its refcount with the surface interface version used to create the surface.

This probably implies that on native the texture interface is part of a
separate object that's aggregated by the surface.

---

 dlls/ddraw/ddraw_private.h |    1 +
 dlls/ddraw/surface.c       |   17 +++++++++++------
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 700a781..fa0f144 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -151,6 +151,7 @@ struct ddraw_surface
 
     LONG                     ref7, ref4, ref3, ref2, ref1, iface_count, gamma_count;
     IUnknown                *ifaceToRelease;
+    IUnknown *texture_outer;
 
     int                     version;
 
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index d8c43a1..860a80d 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -429,7 +429,7 @@ static ULONG WINAPI d3d_texture2_AddRef(IDirect3DTexture2 *iface)
 
     TRACE("iface %p.\n", iface);
 
-    return ddraw_surface1_AddRef(&surface->IDirectDrawSurface_iface);
+    return IUnknown_AddRef(surface->texture_outer);
 }
 
 static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface)
@@ -438,7 +438,7 @@ static ULONG WINAPI d3d_texture1_AddRef(IDirect3DTexture *iface)
 
     TRACE("iface %p.\n", iface);
 
-    return ddraw_surface1_AddRef(&surface->IDirectDrawSurface_iface);
+    return IUnknown_AddRef(surface->texture_outer);
 }
 
 /*****************************************************************************
@@ -659,18 +659,20 @@ static ULONG WINAPI ddraw_gamma_control_Release(IDirectDrawGammaControl *iface)
 
 static ULONG WINAPI d3d_texture2_Release(IDirect3DTexture2 *iface)
 {
-    struct ddraw_surface *This = impl_from_IDirect3DTexture2(iface);
+    struct ddraw_surface *surface = impl_from_IDirect3DTexture2(iface);
+
     TRACE("iface %p.\n", iface);
 
-    return ddraw_surface1_Release(&This->IDirectDrawSurface_iface);
+    return IUnknown_Release(surface->texture_outer);
 }
 
 static ULONG WINAPI d3d_texture1_Release(IDirect3DTexture *iface)
 {
-    struct ddraw_surface *This = impl_from_IDirect3DTexture(iface);
+    struct ddraw_surface *surface = impl_from_IDirect3DTexture(iface);
+
     TRACE("iface %p.\n", iface);
 
-    return ddraw_surface1_Release(&This->IDirectDrawSurface_iface);
+    return IUnknown_Release(surface->texture_outer);
 }
 
 /*****************************************************************************
@@ -5733,14 +5735,17 @@ HRESULT ddraw_surface_init(struct ddraw_surface *surface, struct ddraw *ddraw,
     if (version == 7)
     {
         surface->ref7 = 1;
+        surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface7_iface;
     }
     else if (version == 4)
     {
         surface->ref4 = 1;
+        surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface4_iface;
     }
     else
     {
         surface->ref1 = 1;
+        surface->texture_outer = (IUnknown *)&surface->IDirectDrawSurface_iface;
     }
 
     copy_to_surfacedesc2(&surface->surface_desc, desc);




More information about the wine-cvs mailing list