[PATCH 1/5] wined3d: Copy the DIB to sysmem when PIN_SYSMEM is set.
stefan at codeweavers.com
Wed May 7 08:16:34 CDT 2014
This is for bug 36227.
dlls/wined3d/surface.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index cd3b5a2..dc8c595 100644
@@ -3234,8 +3234,19 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc)
surface->flags &= ~SFLAG_DCINUSE;
- if (surface->map_binding == WINED3D_LOCATION_USER_MEMORY)
- surface_load_location(surface, WINED3D_LOCATION_USER_MEMORY);
+ if (surface->map_binding == WINED3D_LOCATION_USER_MEMORY || (surface->flags & SFLAG_PIN_SYSMEM
+ && surface->map_binding != WINED3D_LOCATION_DIB))
+ /* The game Salammbo modifies the surface contents without mapping the surface between
+ * a GetDC/ReleaseDC operation and flipping the surface. If the DIB remains the active
+ * copy and is copied to the screen, this update, which draws the mouse pointer, is lost.
+ * Do not only copy the DIB to the map location, but also make sure the map location is
+ * copied back to the DIB in the next getdc call.
+ * The same consideration applies to user memory surfaces. */
+ surface_load_location(surface, surface->map_binding);
+ surface_invalidate_location(surface, WINED3D_LOCATION_DIB);
More information about the wine-patches