From 19f45af19cd0c1162f15d6779506431d1cd99d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Wed, 7 May 2014 15:16:34 +0200 Subject: [PATCH] wined3d: Copy the DIB to sysmem when PIN_SYSMEM is set. --- 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 cd3b5a21d36..dc8c5951fee 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -3234,8 +3234,19 @@ HRESULT CDECL wined3d_surface_releasedc(struct wined3d_surface *surface, HDC dc) surface->resource.map_count--; 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); + } return WINED3D_OK; }