[PATCH 2/5] wined3d: Replace the "dirty" field in struct gl_texture with WINED3D_TEXTURE_ flags.

Henri Verbeet hverbeet at codeweavers.com
Mon Sep 9 03:26:18 CDT 2013


---
 dlls/wined3d/texture.c         | 66 ++++++++++++++++++++----------------------
 dlls/wined3d/wined3d_private.h |  9 +++---
 2 files changed, 36 insertions(+), 39 deletions(-)

diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index e9173ce..5d24ada 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -71,8 +71,6 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
     texture->level_count = level_count;
     texture->filter_type = (desc->usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3D_TEXF_LINEAR : WINED3D_TEXF_NONE;
     texture->lod = 0;
-    texture->texture_rgb.dirty = TRUE;
-    texture->texture_srgb.dirty = TRUE;
     texture->flags = WINED3D_TEXTURE_POW2_MAT_IDENT;
 
     if (texture->resource.format->flags & WINED3DFMT_FLAG_FILTERING)
@@ -141,8 +139,7 @@ static void wined3d_texture_cleanup(struct wined3d_texture *texture)
 
 void wined3d_texture_set_dirty(struct wined3d_texture *texture)
 {
-    texture->texture_rgb.dirty = TRUE;
-    texture->texture_srgb.dirty = TRUE;
+    texture->flags &= ~(WINED3D_TEXTURE_RGB_VALID | WINED3D_TEXTURE_SRGB_VALID);
 }
 
 /* Context activation is done by the caller. */
@@ -677,14 +674,23 @@ static void texture2d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
     struct wined3d_device *device = texture->resource.device;
     const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
     struct wined3d_context *context = NULL;
-    struct gl_texture *gl_tex;
     BOOL srgb_mode;
+    DWORD flag;
     UINT i;
 
     TRACE("texture %p, srgb %#x.\n", texture, srgb);
 
     srgb_mode = texture_srgb_mode(texture, srgb);
-    gl_tex = wined3d_texture_get_gl_texture(texture, gl_info, srgb_mode);
+    if (srgb_mode && !gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
+        flag = WINED3D_TEXTURE_SRGB_VALID;
+    else
+        flag = WINED3D_TEXTURE_RGB_VALID;
+
+    if (texture->flags & flag)
+    {
+        TRACE("Texture %p not dirty, nothing to do.\n", texture);
+        return;
+    }
 
     if (!device->isInDraw)
     {
@@ -693,21 +699,12 @@ static void texture2d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
         context = context_acquire(device, NULL);
     }
 
-    if (gl_tex->dirty)
-    {
-        /* Reload the surfaces if the texture is marked dirty. */
-        for (i = 0; i < sub_count; ++i)
-        {
-            surface_load(surface_from_resource(texture->sub_resources[i]), srgb_mode);
-        }
-    }
-    else
+    /* Reload the surfaces if the texture is marked dirty. */
+    for (i = 0; i < sub_count; ++i)
     {
-        TRACE("Texture %p not dirty, nothing to do.\n", texture);
+        surface_load(surface_from_resource(texture->sub_resources[i]), srgb_mode);
     }
-
-    /* No longer dirty. */
-    gl_tex->dirty = FALSE;
+    texture->flags |= flag;
 
     if (context) context_release(context);
 }
@@ -1059,35 +1056,34 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
     struct wined3d_device *device = texture->resource.device;
     const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
     struct wined3d_context *context = NULL;
-    struct gl_texture *gl_tex;
     BOOL srgb_mode;
+    DWORD flag;
     UINT i;
 
     TRACE("texture %p, srgb %#x.\n", texture, srgb);
 
     srgb_mode = texture_srgb_mode(texture, srgb);
-    gl_tex = wined3d_texture_get_gl_texture(texture, gl_info, srgb_mode);
+    if (srgb_mode && !gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
+        flag = WINED3D_TEXTURE_SRGB_VALID;
+    else
+        flag = WINED3D_TEXTURE_RGB_VALID;
 
-    if (gl_tex->dirty)
+    if (texture->flags & flag)
     {
-        context = context_acquire(device, NULL);
+        TRACE("Texture %p not dirty, nothing to do.\n", texture);
+        return;
+    }
 
-        /* Reload the surfaces if the texture is marked dirty. */
-        for (i = 0; i < sub_count; ++i)
-        {
-            wined3d_volume_load(volume_from_resource(texture->sub_resources[i]), context,
-                    srgb_mode);
-        }
+    context = context_acquire(device, NULL);
 
-        context_release(context);
-    }
-    else
+    /* Reload the surfaces if the texture is marked dirty. */
+    for (i = 0; i < sub_count; ++i)
     {
-        TRACE("Texture %p not dirty, nothing to do.\n", texture);
+        wined3d_volume_load(volume_from_resource(texture->sub_resources[i]), context, srgb_mode);
     }
+    texture->flags |= flag;
 
-    /* No longer dirty. */
-    gl_tex->dirty = FALSE;
+    context_release(context);
 }
 
 static void texture3d_sub_resource_add_dirty_region(struct wined3d_resource *sub_resource,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index b771869..925b9ca 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2057,7 +2057,6 @@ enum WINED3DSRGB
 struct gl_texture
 {
     DWORD                   states[MAX_WINETEXTURESTATES];
-    BOOL                    dirty;
     GLuint                  name;
 };
 
@@ -2071,9 +2070,11 @@ struct wined3d_texture_ops
     void (*texture_sub_resource_cleanup)(struct wined3d_resource *sub_resource);
 };
 
-#define WINED3D_TEXTURE_COND_NP2            0x1
-#define WINED3D_TEXTURE_POW2_MAT_IDENT      0x2
-#define WINED3D_TEXTURE_IS_SRGB             0x4
+#define WINED3D_TEXTURE_COND_NP2            0x00000001
+#define WINED3D_TEXTURE_POW2_MAT_IDENT      0x00000002
+#define WINED3D_TEXTURE_IS_SRGB             0x00000004
+#define WINED3D_TEXTURE_RGB_VALID           0x00000008
+#define WINED3D_TEXTURE_SRGB_VALID          0x00000010
 
 struct wined3d_texture
 {
-- 
1.8.1.5




More information about the wine-patches mailing list