[PATCH 2/5] wined3d: Track SFLAG_DYNLOCK per-texture.

Henri Verbeet hverbeet at codeweavers.com
Thu Oct 9 04:50:46 CDT 2014


---
 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
 {
-- 
1.7.10.4




More information about the wine-patches mailing list