Henri Verbeet : wined3d: Respect SFLAG_PIN_SYSMEM when creating a surface DIB section.

Alexandre Julliard julliard at winehq.org
Thu Jan 19 14:56:52 CST 2012


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Jan 18 21:46:19 2012 +0100

wined3d: Respect SFLAG_PIN_SYSMEM when creating a surface DIB section.

---

 dlls/wined3d/surface.c |   23 ++++++++++++++++-------
 1 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index df5855e..f38c148 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -514,9 +514,6 @@ static HRESULT surface_create_dib_section(struct wined3d_surface *surface)
 
     surface->flags |= SFLAG_DIBSECTION;
 
-    HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory);
-    surface->resource.heapMemory = NULL;
-
     return WINED3D_OK;
 }
 
@@ -1986,9 +1983,17 @@ static void gdi_surface_map(struct wined3d_surface *surface, const RECT *rect, D
 
     if (!(surface->flags & SFLAG_DIBSECTION))
     {
+        HRESULT hr;
+
         /* This happens on gdi surfaces if the application set a user pointer
          * and resets it. Recreate the DIB section. */
-        surface_create_dib_section(surface);
+        if (FAILED(hr = surface_create_dib_section(surface)))
+        {
+            ERR("Failed to create dib section, hr %#x.\n", hr);
+            return;
+        }
+        HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory);
+        surface->resource.heapMemory = NULL;
         surface->resource.allocatedMemory = surface->dib.bitmap_data;
     }
 }
@@ -3843,8 +3848,12 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc)
             return WINED3DERR_INVALIDCALL;
 
         /* Use the DIB section from now on if we are not using a PBO. */
-        if (!(surface->flags & SFLAG_PBO))
+        if (!(surface->flags & (SFLAG_PBO | SFLAG_PIN_SYSMEM)))
+        {
+            HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory);
+            surface->resource.heapMemory = NULL;
             surface->resource.allocatedMemory = surface->dib.bitmap_data;
+        }
     }
 
     /* Map the surface. */
@@ -3857,7 +3866,7 @@ HRESULT CDECL wined3d_surface_getdc(struct wined3d_surface *surface, HDC *dc)
 
     /* Sync the DIB with the PBO. This can't be done earlier because Map()
      * activates the allocatedMemory. */
-    if (surface->flags & SFLAG_PBO)
+    if (surface->flags & (SFLAG_PBO | SFLAG_PIN_SYSMEM))
         memcpy(surface->dib.bitmap_data, surface->resource.allocatedMemory, surface->resource.size);
 
     if (surface->resource.format->id == WINED3DFMT_P8_UINT
@@ -3920,7 +3929,7 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc)
     }
 
     /* Copy the contents of the DIB over to the PBO. */
-    if ((surface->flags & SFLAG_PBO) && surface->resource.allocatedMemory)
+    if ((surface->flags & (SFLAG_PBO | SFLAG_PIN_SYSMEM)) && surface->resource.allocatedMemory)
         memcpy(surface->resource.allocatedMemory, surface->dib.bitmap_data, surface->resource.size);
 
     /* We locked first, so unlock now. */




More information about the wine-cvs mailing list