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