Module: wine
Branch: master
Commit: c5459881a30c8e7d4d6c9bb8fd2d73e040c54e19
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c5459881a30c8e7d4d6c9bb8f…
Author: Henri Verbeet <hverbeet(a)codeweavers.com>
Date: Thu Oct 9 11:50:46 2014 +0200
wined3d: Track SFLAG_DYNLOCK per-texture.
---
dlls/wined3d/surface.c | 20 +++++++++++---------
dlls/wined3d/wined3d_private.h | 4 ++--
2 files changed, 13 insertions(+), 11 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 3339c5b..8019a11 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -589,11 +589,11 @@ static void surface_evict_sysmem(struct wined3d_surface *surface)
{
/* In some conditions the surface memory must not be freed:
* WINED3D_TEXTURE_CONVERTED: Converting the data back would take too long
- * SFLAG_DYNLOCK: Avoid freeing the data for performance
+ * WINED3D_TEXTURE_DYNAMIC_MAP: Avoid freeing the data for performance
* SFLAG_CLIENT: OpenGL uses our memory as backup */
- if (surface->resource.map_count
- || surface->flags & (SFLAG_DYNLOCK | SFLAG_CLIENT)
- || surface->container->flags & (WINED3D_TEXTURE_CONVERTED | WINED3D_TEXTURE_PIN_SYSMEM))
+ if (surface->resource.map_count || surface->flags & SFLAG_CLIENT
+ || surface->container->flags & (WINED3D_TEXTURE_CONVERTED | WINED3D_TEXTURE_PIN_SYSMEM
+ | WINED3D_TEXTURE_DYNAMIC_MAP))
return;
wined3d_resource_free_sysmem(&surface->resource);
@@ -1450,8 +1450,8 @@ static void surface_download_data(struct wined3d_surface *surface, const struct
* get a boxed texture with width pow2width and not a texture of width resource.width.
*
* Performance should not be an issue, because applications normally do not lock the surfaces when
- * rendering. If an app does, the SFLAG_DYNLOCK flag will kick in and the memory copy won't be released,
- * and doesn't have to be re-read. */
+ * rendering. If an app does, the WINED3D_TEXTURE_DYNAMIC_MAP flag will kick in and the memory copy
+ * won't be released, and doesn't have to be re-read. */
src_data = mem;
dst_data = data.addr;
TRACE("(%p) : Repacking the surface data from pitch %d to pitch %d\n", surface, src_pitch, dst_pitch);
@@ -2617,13 +2617,15 @@ HRESULT CDECL wined3d_surface_map(struct wined3d_surface *surface,
/* Performance optimization: Count how often a surface is mapped, if it is
* mapped regularly do not throw away the system memory copy. This avoids
* the need to download the surface from OpenGL all the time. The surface
- * is still downloaded if the OpenGL texture is changed. */
- if (!(surface->flags & SFLAG_DYNLOCK) && surface->resource.map_binding == WINED3D_LOCATION_SYSMEM)
+ * is still downloaded if the OpenGL texture is changed. Note that this
+ * only really makes sense for managed textures.*/
+ if (!(surface->container->flags & WINED3D_TEXTURE_DYNAMIC_MAP)
+ && surface->resource.map_binding == WINED3D_LOCATION_SYSMEM)
{
if (++surface->lockCount > MAXLOCKCOUNT)
{
TRACE("Surface is mapped regularly, not freeing the system memory copy any more.\n");
- surface->flags |= SFLAG_DYNLOCK;
+ surface->container->flags |= WINED3D_TEXTURE_DYNAMIC_MAP;
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index dd4668e..d7e8fb4 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2130,6 +2130,7 @@ struct wined3d_texture_ops
#define WINED3D_TEXTURE_SRGB_VALID 0x00000040
#define WINED3D_TEXTURE_CONVERTED 0x00000080
#define WINED3D_TEXTURE_PIN_SYSMEM 0x00000100
+#define WINED3D_TEXTURE_DYNAMIC_MAP 0x00000200
struct wined3d_texture
{
@@ -2351,11 +2352,10 @@ void flip_surface(struct wined3d_surface *front, struct wined3d_surface *back) D
#define SFLAG_DISCARD 0x00000002 /* ??? */
#define SFLAG_NONPOW2 0x00000004 /* Surface sizes are not a power of 2 */
#define SFLAG_NORMCOORD 0x00000008 /* Set if GL texture coordinates are normalized (non-texture rectangle). */
-#define SFLAG_DYNLOCK 0x00000010 /* Surface is often locked by the application. */
+#define SFLAG_GLCKEY 0x00000010 /* The GL texture was created with a color key. */
#define SFLAG_CLIENT 0x00000020 /* GL_APPLE_client_storage is used with this surface. */
#define SFLAG_DCINUSE 0x00000040 /* Set between GetDC and ReleaseDC calls. */
#define SFLAG_LOST 0x00000080 /* Surface lost flag for ddraw. */
-#define SFLAG_GLCKEY 0x00000100 /* The GL texture was created with a color key. */
struct wined3d_sampler
{