Nick Burns : ddraw: Fix surface version setting.

Alexandre Julliard julliard at winehq.org
Fri Dec 26 12:35:22 CST 2008


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

Author: Nick Burns <adger44 at hotmail.com>
Date:   Wed Dec 24 17:01:02 2008 -0800

ddraw: Fix surface version setting.

---

 dlls/ddraw/ddraw.c        |    1 +
 dlls/ddraw/ddraw_thunks.c |   25 +++++++++++++++++++++----
 dlls/ddraw/surface.c      |    7 +++++--
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 919d995..8033b15 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -2084,6 +2084,7 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This,
     ICOM_INIT_INTERFACE(*ppSurf, IDirect3DTexture, IDirect3DTexture1_Vtbl);
     (*ppSurf)->ref = 1;
     (*ppSurf)->version = 7;
+    TRACE("%p->version = %d\n", (*ppSurf), (*ppSurf)->version);
     (*ppSurf)->ddraw = This;
     (*ppSurf)->surface_desc.dwSize = sizeof(DDSURFACEDESC2);
     (*ppSurf)->surface_desc.u4.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
diff --git a/dlls/ddraw/ddraw_thunks.c b/dlls/ddraw/ddraw_thunks.c
index b748ad4..da61e1f 100644
--- a/dlls/ddraw/ddraw_thunks.c
+++ b/dlls/ddraw/ddraw_thunks.c
@@ -377,6 +377,23 @@ IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags,
     return hr;
 }
 
+/* Must set all attached surfaces (e.g. mipmaps) versions as well */
+static void set_surf_version(IDirectDrawSurfaceImpl *surf, int version)
+{
+    int i;
+    TRACE("%p->version(%d) = %d\n", surf, surf->version, version);
+    surf->version = version;
+    for(i = 0; i < MAX_COMPLEX_ATTACHED; i++)
+    {
+        if(!surf->complex_array[i]) break;
+        set_surf_version(surf->complex_array[i], version);
+    }
+    while( (surf = surf->next_attached) )
+    {
+        set_surf_version(surf, version);
+    }
+}
+
 static HRESULT WINAPI
 IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
 			      LPDIRECTDRAWSURFACE *ppSurface,
@@ -407,7 +424,7 @@ IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, pSurface7);
     if(SUCCEEDED(hr) && impl)
     {
-        impl->version = 1;
+        set_surf_version(impl, 1);
         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
                              IDirectDraw,
                              IDirectDraw7,
@@ -442,7 +459,7 @@ IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, pSurface7);
     if(SUCCEEDED(hr) && impl)
     {
-        impl->version = 2;
+        set_surf_version(impl, 2);
         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
                              IDirectDraw2,
                              IDirectDraw7,
@@ -477,7 +494,7 @@ IDirectDraw3Impl_CreateSurface(LPDIRECTDRAW3 This, LPDDSURFACEDESC pSDesc,
     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, pSurface7);
     if(SUCCEEDED(hr) && impl)
     {
-        impl->version = 3;
+        set_surf_version(impl, 3);
         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
                              IDirectDraw3,
                              IDirectDraw7,
@@ -507,7 +524,7 @@ IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
     impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, *ppSurface);
     if(SUCCEEDED(hr) && impl)
     {
-        impl->version = 4;
+        set_surf_version(impl, 4);
         IDirectDraw7_Release(COM_INTERFACE_CAST(IDirectDrawImpl,
                              IDirectDraw4,
                              IDirectDraw7,
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index d263f67..f184111 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -475,15 +475,18 @@ IDirectDrawSurfaceImpl_GetAttachedSurface(IDirectDrawSurface7 *iface,
     TRACE("(%p)->(%p,%p)\n", This, Caps, Surface);
     EnterCriticalSection(&ddraw_cs);
 
-    our_caps = *Caps;
-
     if(This->version < 7)
     {
         /* Earlier dx apps put garbage into these members, clear them */
+        our_caps.dwCaps = Caps->dwCaps;
         our_caps.dwCaps2 = 0;
         our_caps.dwCaps3 = 0;
         our_caps.dwCaps4 = 0;
     }
+    else
+    {
+        our_caps = *Caps;
+    }
 
     TRACE("(%p): Looking for caps: %x,%x,%x,%x\n", This, our_caps.dwCaps, our_caps.dwCaps2, our_caps.dwCaps3, our_caps.dwCaps4); /* FIXME: Better debugging */
 




More information about the wine-cvs mailing list