wined3d: Use surface_modify_location() to manipulate location flags in IWineD3DSurfaceImpl_Unmap().

Directly setting SFLAG_INFRAWABLE breaks for offscreen render targets, where
the drawable and texture are the same thing. Before commit
d3fd7b247b the explicit load of the texture
location with the default RTL_READTEX render target lock mode would have
prevented the flags from becomming inconsistent.
This commit is contained in:
Henri Verbeet 2011-01-04 17:42:00 +01:00 committed by Alexandre Julliard
parent 1898f22ca5
commit e5d1a0c72d
1 changed files with 8 additions and 12 deletions

View File

@ -1884,19 +1884,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Unmap(IWineD3DSurface *iface)
surface_load_location(This, SFLAG_INDRAWABLE, fullsurface ? NULL : &This->dirtyRect); 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) if (!fullsurface)
{ surface_modify_location(This, SFLAG_INDRAWABLE, TRUE);
/* 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;
}
This->dirtyRect.left = This->currentDesc.Width; This->dirtyRect.left = This->currentDesc.Width;
This->dirtyRect.top = This->currentDesc.Height; This->dirtyRect.top = This->currentDesc.Height;