wined3d: Use surface_modify_location() to manipulate location flags in IWineD3DSurfac...
authorHenri Verbeet <hverbeet@codeweavers.com>
Tue, 4 Jan 2011 16:42:00 +0000 (17:42 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 5 Jan 2011 16:21:28 +0000 (17:21 +0100)
Directly setting SFLAG_INFRAWABLE breaks for offscreen render targets, where
the drawable and texture are the same thing. Before commit
d3fd7b247b35d7c8c453afa2fc07e121ea75214b the explicit load of the texture
location with the default RTL_READTEX render target lock mode would have
prevented the flags from becomming inconsistent.

dlls/wined3d/surface.c

index 278eb5ef514c1ca679075b7c642a79df6182d303..96b897a802c83f9c440b9bcd26756a7b257c4bb6 100644 (file)
@@ -1884,19 +1884,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Unmap(IWineD3DSurface *iface)
 
         surface_load_location(This, SFLAG_INDRAWABLE, fullsurface ? NULL : &This->dirtyRect);
 
+        /* Partial rectangle tracking is not commonly implemented, it is only
+         * done for render targets. INSYSMEM was set before to tell
+         * surface_load_location() where to read the rectangle from.
+         * Indrawable is set because all modifications from the partial
+         * sysmem copy are written back to the drawable, thus the surface is
+         * merged again in the drawable. The sysmem copy is not fully up to
+         * date because only a subrectangle was read in Map(). */
         if (!fullsurface)
-        {
-            /* Partial rectangle tracking is not commonly implemented, it is
-             * only done for render targets. Overwrite the flags to bring
-             * them back into a sane state. INSYSMEM was set before to tell
-             * surface_load_location() where to read the rectangle from.
-             * Indrawable is set because all modifications from the partial
-             * sysmem copy are written back to the drawable, thus the surface
-             * is merged again in the drawable. The sysmem copy is not fully
-             * up to date because only a subrectangle was read in Map(). */
-            This->flags &= ~SFLAG_INSYSMEM;
-            This->flags |= SFLAG_INDRAWABLE;
-        }
+            surface_modify_location(This, SFLAG_INDRAWABLE, TRUE);
 
         This->dirtyRect.left   = This->currentDesc.Width;
         This->dirtyRect.top    = This->currentDesc.Height;