Stefan Dösinger : ddraw: GetSurfaceDesc returns the surface memory while the surface is locked.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 11 07:27:59 CDT 2007


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu May 10 21:55:14 2007 +0200

ddraw: GetSurfaceDesc returns the surface memory while the surface is locked.

---

 dlls/ddraw/surface.c        |   12 +++++++++---
 dlls/ddraw/tests/dsurface.c |   18 ++++++++++++++++--
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index a19b8dd..98c425d 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -585,7 +585,6 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface,
         DDSD->dwSize = sizeof(DDSURFACEDESC2);
     }
 
-    DD_STRUCT_COPY_BYSIZE(DDSD,&(This->surface_desc));
     hr = IWineD3DSurface_LockRect(This->WineD3DSurface,
                                   &LockedRect,
                                   Rect,
@@ -596,7 +595,8 @@ IDirectDrawSurfaceImpl_Lock(IDirectDrawSurface7 *iface,
      * does not set the LPSURFACE flag on locked surfaces !?!.
      * DDSD->dwFlags |= DDSD_LPSURFACE;
      */
-    DDSD->lpSurface = LockedRect.pBits;
+    This->surface_desc.lpSurface = LockedRect.pBits;
+    DD_STRUCT_COPY_BYSIZE(DDSD,&(This->surface_desc));
 
     TRACE("locked surface returning description :\n");
     if (TRACE_ON(ddraw)) DDRAW_dump_surface_desc(DDSD);
@@ -622,9 +622,15 @@ IDirectDrawSurfaceImpl_Unlock(IDirectDrawSurface7 *iface,
                               RECT *pRect)
 {
     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface7, iface);
+    HRESULT hr;
     TRACE("(%p)->(%p)\n", This, pRect);
 
-    return IWineD3DSurface_UnlockRect(This->WineD3DSurface);
+    hr = IWineD3DSurface_UnlockRect(This->WineD3DSurface);
+    if(SUCCEEDED(hr))
+    {
+        This->surface_desc.lpSurface = NULL;
+    }
+    return hr;
 }
 
 /*****************************************************************************
diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
index a2d7e7a..067306e 100644
--- a/dlls/ddraw/tests/dsurface.c
+++ b/dlls/ddraw/tests/dsurface.c
@@ -174,8 +174,7 @@ static void SrcColorKey32BlitTest(void)
 {
     LPDIRECTDRAWSURFACE lpSrc;
     LPDIRECTDRAWSURFACE lpDst;
-    DDSURFACEDESC ddsd;
-    DDSURFACEDESC ddsd2;
+    DDSURFACEDESC ddsd, ddsd2, ddsd3;
     DDCOLORKEY DDColorKey;
     LPDWORD lpData;
     HRESULT rc;
@@ -211,9 +210,24 @@ static void SrcColorKey32BlitTest(void)
     lpData[1] = 0xCCCCCCCC;
     lpData[2] = 0xCCCCCCCC;
     lpData[3] = 0xCCCCCCCC;
+
+    memset(&ddsd3, 0, sizeof(ddsd3));
+    ddsd3.dwSize = sizeof(ddsd3);
+    U4(ddsd3).ddpfPixelFormat.dwSize = sizeof(U4(ddsd3).ddpfPixelFormat);
+    rc = IDirectDrawSurface_GetSurfaceDesc(lpDst, &ddsd3);
+    ok(rc == DD_OK, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc);
+    ok(ddsd3.lpSurface == ddsd3.lpSurface, "lpSurface from GetSurfaceDesc(%p) differs from the one returned by Lock(%p)\n", ddsd3.lpSurface, ddsd2.lpSurface);
+
     rc = IDirectDrawSurface_Unlock(lpDst, NULL);
     ok(rc==DD_OK,"Unlock returned: %x\n",rc);
 
+    memset(&ddsd3, 0, sizeof(ddsd3));
+    ddsd3.dwSize = sizeof(ddsd3);
+    U4(ddsd3).ddpfPixelFormat.dwSize = sizeof(U4(ddsd3).ddpfPixelFormat);
+    rc = IDirectDrawSurface_GetSurfaceDesc(lpDst, &ddsd3);
+    ok(rc == DD_OK, "IDirectDrawSurface_GetSurfaceDesc between a lock/unlock pair returned %08x\n", rc);
+    ok(ddsd3.lpSurface == NULL, "lpSurface from GetSurfaceDesc(%p) is not NULL after unlock\n", ddsd3.lpSurface);
+
     rc = IDirectDrawSurface_Lock(lpSrc, NULL, &ddsd2, DDLOCK_WAIT, NULL);
     ok(rc==DD_OK,"Lock returned: %x\n",rc);
     ok((ddsd2.dwFlags & DDSD_LPSURFACE) == 0, "Surface desc has LPSURFACE Flags set\n");




More information about the wine-cvs mailing list