st/mesa: simplify the update_single_texture() function
authorBrian Paul <brianp@vmware.com>
Sat, 2 Feb 2013 01:00:45 +0000 (18:00 -0700)
committerBrian Paul <brianp@vmware.com>
Mon, 4 Feb 2013 15:28:17 +0000 (08:28 -0700)
In particular, rework the sRGB/linear format selection code.
There's no reason to mess with the Mesa format.
Just do everything in terms of the gallium pipe_format.

Reviewed-by: Marek Olšák <maraeo@gmail.com>
src/mesa/state_tracker/st_atom_texture.c

index 4b43b2a..28327bc 100644 (file)
@@ -214,7 +214,7 @@ update_single_texture(struct st_context *st,
    const struct gl_sampler_object *samp;
    struct gl_texture_object *texObj;
    struct st_texture_object *stObj;
-   enum pipe_format st_view_format;
+   enum pipe_format view_format;
    GLboolean retval;
 
    samp = _mesa_get_samplerobj(ctx, texUnit);
@@ -234,32 +234,11 @@ update_single_texture(struct st_context *st,
    }
 
    /* Determine the format of the texture sampler view */
-   st_view_format = stObj->pt->format;
-
-   {
-      gl_format texFormat;
-      enum pipe_format firstImageFormat;
-
-      if (texObj->Target == GL_TEXTURE_BUFFER) {
-         texFormat = stObj->base._BufferObjectFormat;
-      } else {
-         const struct st_texture_image *firstImage =
-            st_texture_image(stObj->base.Image[0][stObj->base.BaseLevel]);
-         texFormat = firstImage->base.TexFormat;
-      }
-      firstImageFormat = st_mesa_format_to_pipe_format(texFormat);
-      if ((samp->sRGBDecode == GL_SKIP_DECODE_EXT) &&
-         (_mesa_get_format_color_encoding(texFormat) == GL_SRGB)) {
-         /* Don't do sRGB->RGB conversion.  Interpret the texture data as
-          * linear values.
-          */
-        const gl_format linearFormat =
-           _mesa_get_srgb_format_linear(texFormat);
-        firstImageFormat = st_mesa_format_to_pipe_format(linearFormat);
-      }
+   view_format = stObj->pt->format;
 
-      if (firstImageFormat != stObj->pt->format)
-        st_view_format = firstImageFormat;
+   /* If sRGB decoding is off, use the linear format */
+   if (samp->sRGBDecode == GL_SKIP_DECODE_EXT) {
+      view_format = util_format_linear(view_format);
    }
 
    /* if sampler view has changed dereference it */
@@ -267,7 +246,7 @@ update_single_texture(struct st_context *st,
       if (check_sampler_swizzle(stObj->sampler_view,
                                stObj->base._Swizzle,
                                stObj->base.DepthMode) ||
-         (st_view_format != stObj->sampler_view->format) ||
+         (view_format != stObj->sampler_view->format) ||
          stObj->base.BaseLevel != stObj->sampler_view->u.tex.first_level) {
         pipe_sampler_view_reference(&stObj->sampler_view, NULL);
       }
@@ -275,7 +254,7 @@ update_single_texture(struct st_context *st,
 
    *sampler_view = st_get_texture_sampler_view_from_stobj(stObj, pipe,
                                                          samp,
-                                                         st_view_format);
+                                                         view_format);
    return GL_TRUE;
 }