[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