Henri Verbeet : wined3d: Replace the "dirty" field in struct gl_texture with WINED3D_TEXTURE_ flags.
Module: wine Branch: master Commit: 59e2f52ff8743825e81c0f2ef6afaa9892503098 URL: http://source.winehq.org/git/wine.git/?a=commit;h=59e2f52ff8743825e81c0f2ef6... Author: Henri Verbeet <hverbeet(a)codeweavers.com> Date: Mon Sep 9 10:26:18 2013 +0200 wined3d: Replace the "dirty" field in struct gl_texture with WINED3D_TEXTURE_ flags. --- 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 {
participants (1)
-
Alexandre Julliard