Henri Verbeet : wined3d: Replace "is_srgb" in wined3d_texture with a flag.
Alexandre Julliard
julliard at winehq.org
Tue Mar 29 11:43:03 CDT 2011
Module: wine
Branch: master
Commit: 19e66a0dc964b839eaef4699e80208096de05c18
URL: http://source.winehq.org/git/wine.git/?a=commit;h=19e66a0dc964b839eaef4699e80208096de05c18
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Mon Mar 28 21:58:45 2011 +0200
wined3d: Replace "is_srgb" in wined3d_texture with a flag.
---
dlls/wined3d/texture.c | 36 +++++++++++++++++++++++++-----------
dlls/wined3d/wined3d_private.h | 2 +-
2 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 10edf4a..1d42c34 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -57,7 +57,6 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
texture->lod = 0;
texture->texture_rgb.dirty = TRUE;
texture->texture_srgb.dirty = TRUE;
- texture->is_srgb = FALSE;
texture->flags = WINED3D_TEXTURE_POW2_MAT_IDENT;
if (texture->resource.format->flags & WINED3DFMT_FLAG_FILTERING)
@@ -143,7 +142,12 @@ static HRESULT wined3d_texture_bind(struct wined3d_texture *texture,
TRACE("texture %p, srgb %#x, set_surface_desc %p.\n", texture, srgb, set_surface_desc);
- texture->is_srgb = srgb; /* sRGB mode cache for preload() calls outside drawprim. */
+ /* sRGB mode cache for preload() calls outside drawprim. */
+ if (srgb)
+ texture->flags |= WINED3D_TEXTURE_IS_SRGB;
+ else
+ texture->flags &= ~WINED3D_TEXTURE_IS_SRGB;
+
gl_tex = wined3d_texture_get_gl_texture(texture, gl_info, srgb);
target = texture->target;
@@ -270,7 +274,8 @@ void wined3d_texture_apply_state_changes(struct wined3d_texture *texture,
TRACE("texture %p, sampler_states %p.\n", texture, sampler_states);
- gl_tex = wined3d_texture_get_gl_texture(texture, gl_info, texture->is_srgb);
+ gl_tex = wined3d_texture_get_gl_texture(texture, gl_info,
+ texture->flags & WINED3D_TEXTURE_IS_SRGB);
/* This function relies on the correct texture being bound and loaded. */
@@ -646,7 +651,8 @@ static HRESULT texture2d_bind(struct wined3d_texture *texture,
if (set_gl_texture_desc && SUCCEEDED(hr))
{
UINT sub_count = texture->level_count * texture->layer_count;
- BOOL srgb_tex = !gl_info->supported[EXT_TEXTURE_SRGB_DECODE] && texture->is_srgb;
+ BOOL srgb_tex = !gl_info->supported[EXT_TEXTURE_SRGB_DECODE]
+ && (texture->flags & WINED3D_TEXTURE_IS_SRGB);
struct gl_texture *gl_tex;
UINT i;
@@ -718,7 +724,7 @@ static void texture2d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
break;
default:
- srgb_mode = texture->is_srgb;
+ srgb_mode = texture->flags & WINED3D_TEXTURE_IS_SRGB;
break;
}
@@ -1115,7 +1121,6 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
{
IWineD3DDeviceImpl *device = texture->resource.device;
struct wined3d_context *context = NULL;
- BOOL srgb_mode = texture->is_srgb;
BOOL srgb_was_toggled = FALSE;
unsigned int i;
@@ -1125,9 +1130,17 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
context = context_acquire(device, NULL);
else if (texture->bind_count > 0)
{
- srgb_mode = device->stateBlock->state.sampler_states[texture->sampler][WINED3DSAMP_SRGBTEXTURE];
- srgb_was_toggled = texture->is_srgb != srgb_mode;
- texture->is_srgb = srgb_mode;
+ BOOL texture_srgb = texture->flags & WINED3D_TEXTURE_IS_SRGB;
+ BOOL sampler_srgb = device->stateBlock->state.sampler_states[texture->sampler][WINED3DSAMP_SRGBTEXTURE];
+ srgb_was_toggled = !texture_srgb != !sampler_srgb;
+
+ if (srgb_was_toggled)
+ {
+ if (sampler_srgb)
+ texture->flags |= WINED3D_TEXTURE_IS_SRGB;
+ else
+ texture->flags &= ~WINED3D_TEXTURE_IS_SRGB;
+ }
}
/* If the texture is marked dirty or the sRGB sampler setting has changed
@@ -1136,7 +1149,8 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
{
for (i = 0; i < texture->level_count; ++i)
{
- volume_load(volume_from_resource(texture->sub_resources[i]), i, srgb_mode);
+ volume_load(volume_from_resource(texture->sub_resources[i]), i,
+ texture->flags & WINED3D_TEXTURE_IS_SRGB);
}
}
else if (srgb_was_toggled)
@@ -1145,7 +1159,7 @@ static void texture3d_preload(struct wined3d_texture *texture, enum WINED3DSRGB
{
IWineD3DVolumeImpl *volume = volume_from_resource(texture->sub_resources[i]);
volume_add_dirty_box(volume, NULL);
- volume_load(volume, i, srgb_mode);
+ volume_load(volume, i, texture->flags & WINED3D_TEXTURE_IS_SRGB);
}
}
else
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 4ec25e6..1fe633f 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1890,6 +1890,7 @@ struct wined3d_texture_ops
#define WINED3D_TEXTURE_COND_NP2 0x1
#define WINED3D_TEXTURE_POW2_MAT_IDENT 0x2
+#define WINED3D_TEXTURE_IS_SRGB 0x4
struct wined3d_texture
{
@@ -1904,7 +1905,6 @@ struct wined3d_texture
WINED3DTEXTUREFILTERTYPE filter_type;
LONG bind_count;
DWORD sampler;
- BOOL is_srgb;
DWORD flags;
const struct min_lookup *min_mip_lookup;
const GLenum *mag_lookup;
More information about the wine-cvs
mailing list