Stefan Dösinger : wined3d: Clean up SetMem.

Alexandre Julliard julliard at winehq.org
Tue Sep 18 05:31:01 CDT 2007


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Mon Sep 17 15:16:37 2007 +0200

wined3d: Clean up SetMem.

---

 dlls/wined3d/surface.c         |    6 -----
 dlls/wined3d/surface_gdi.c     |   49 +++++++++++++++++++++++++++++++++++++++-
 dlls/wined3d/wined3d_private.h |    2 -
 3 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 676aed6..05303d3 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -2540,12 +2540,6 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORM
 HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *Mem) {
     IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
 
-    /* Render targets depend on their hdc, and we can't create an hdc on a user pointer */
-    if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
-        ERR("Not supported on render targets\n");
-        return WINED3DERR_INVALIDCALL;
-    }
-
     if(This->Flags & (SFLAG_LOCKED | SFLAG_DCINUSE)) {
         WARN("Surface is locked or the HDC is in use\n");
         return WINED3DERR_INVALIDCALL;
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c
index 6521477..49f24c9 100644
--- a/dlls/wined3d/surface_gdi.c
+++ b/dlls/wined3d/surface_gdi.c
@@ -1569,6 +1569,53 @@ HRESULT WINAPI IWineGDISurfaceImpl_AddDirtyRect(IWineD3DSurface *iface, CONST RE
     return WINED3D_OK;
 }
 
+HRESULT WINAPI IWineGDISurfaceImpl_SetMem(IWineD3DSurface *iface, void *Mem) {
+    IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
+
+    /* Render targets depend on their hdc, and we can't create an hdc on a user pointer */
+    if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
+        ERR("Not supported on render targets\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+
+    if(This->Flags & (SFLAG_LOCKED | SFLAG_DCINUSE)) {
+        WARN("Surface is locked or the HDC is in use\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+
+    if(Mem && Mem != This->resource.allocatedMemory) {
+        void *release = NULL;
+
+        /* Do I have to copy the old surface content? */
+        if(This->Flags & SFLAG_DIBSECTION) {
+                /* Release the DC. No need to hold the critical section for the update
+            * Thread because this thread runs only on front buffers, but this method
+            * fails for render targets in the check above.
+                */
+            SelectObject(This->hDC, This->dib.holdbitmap);
+            DeleteDC(This->hDC);
+            /* Release the DIB section */
+            DeleteObject(This->dib.DIBsection);
+            This->dib.bitmap_data = NULL;
+            This->resource.allocatedMemory = NULL;
+            This->hDC = NULL;
+            This->Flags &= ~SFLAG_DIBSECTION;
+        } else if(!(This->Flags & SFLAG_USERPTR)) {
+            release = This->resource.allocatedMemory;
+        }
+        This->resource.allocatedMemory = Mem;
+        This->Flags |= SFLAG_USERPTR | SFLAG_INSYSMEM;
+
+        /* Now free the old memory if any */
+        HeapFree(GetProcessHeap(), 0, release);
+    } else if(This->Flags & SFLAG_USERPTR) {
+        /* Lockrect and GetDC will re-create the dib section and allocated memory */
+        This->resource.allocatedMemory = NULL;
+        This->Flags &= ~SFLAG_USERPTR;
+    }
+    return WINED3D_OK;
+}
+
 /* FIXME: This vtable should not use any IWineD3DSurface* implementation functions,
  * only IWineD3DBaseSurface and IWineGDISurface ones.
  */
@@ -1607,7 +1654,7 @@ const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl =
     IWineD3DBaseSurfaceImpl_RealizePalette,
     IWineD3DBaseSurfaceImpl_SetColorKey,
     IWineD3DBaseSurfaceImpl_GetPitch,
-    IWineD3DSurfaceImpl_SetMem,
+    IWineGDISurfaceImpl_SetMem,
     IWineD3DBaseSurfaceImpl_SetOverlayPosition,
     IWineD3DBaseSurfaceImpl_GetOverlayPosition,
     IWineD3DBaseSurfaceImpl_UpdateOverlayZOrder,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 2b1db31..4452274 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1171,12 +1171,10 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetClipper(IWineD3DSurface *iface, IWineD
 HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format);
 
 ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface);
-void    WINAPI IWineD3DSurfaceImpl_PreLoad(IWineD3DSurface *iface);
 HRESULT WINAPI IWineD3DSurfaceImpl_SetPixelFormat(IWineD3DSurface *iface, WINED3DFORMAT Format, BYTE *Surface, DWORD Size);
 const void *WINAPI IWineD3DSurfaceImpl_GetData(IWineD3DSurface *iface);
 HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC);
 HRESULT WINAPI IWineD3DSurfaceImpl_ReleaseDC(IWineD3DSurface *iface, HDC hDC);
-HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *Mem);
 
 HRESULT WINAPI IWineGDISurfaceImpl_Blt(IWineD3DSurface *iface, RECT *DestRect, IWineD3DSurface *SrcSurface, RECT *SrcRect, DWORD Flags, WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter);
 HRESULT WINAPI IWineGDISurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dstx, DWORD dsty, IWineD3DSurface *Source, RECT *rsrc, DWORD trans);




More information about the wine-cvs mailing list