[Mesa-dev] [PATCH] util/u_format_s3tc: handle srgb formats correctly.

Jose Fonseca jfonseca at vmware.com
Wed Jul 17 04:04:15 PDT 2013


Looks good AFAICT.

Just one detail:

  s/false/FALSE/
  s/true/TRUE/

Jose

----- Original Message -----
> From: Roland Scheidegger <sroland at vmware.com>
> 
> Instead of just ignoring the srgb/linear conversions, simply call the
> corresponding conversion functions, for all of pack/unpack/fetch,
> both for float and unorm8 versions (though some don't make a whole
> lot of sense, i.e. unorm8/unorm8 srgb/linear combinations).
> Refactored some functions a bit so don't have to duplicate all the code
> (there's a slight change for packing dxt1_rgb, as there will now be
> always 4 components initialized and sent to the external compression
> function so the same code can be used for all, the quite horrid and
> ad-hoc interface (by now) should always have worked with that).
> 
> Fixes llvmpipe/softpipe piglit texwrap GL_EXT_texture_sRGB-s3tc.
> ---
>  src/gallium/auxiliary/util/u_format_s3tc.c |  434
>  ++++++++++++++++------------
>  src/gallium/auxiliary/util/u_format_srgb.h |    5 +
>  2 files changed, 254 insertions(+), 185 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/util/u_format_s3tc.c
> b/src/gallium/auxiliary/util/u_format_s3tc.c
> index 35e3d34..788017d 100644
> --- a/src/gallium/auxiliary/util/u_format_s3tc.c
> +++ b/src/gallium/auxiliary/util/u_format_s3tc.c
> @@ -27,6 +27,7 @@
>  #include "u_math.h"
>  #include "u_format.h"
>  #include "u_format_s3tc.h"
> +#include "u_format_srgb.h"
>  
>  
>  #if defined(_WIN32) || defined(WIN32)
> @@ -247,7 +248,7 @@ util_format_dxtn_rgb_unpack_rgba_8unorm(uint8_t *dst_row,
> unsigned dst_stride,
>                                          const uint8_t *src_row, unsigned
>                                          src_stride,
>                                          unsigned width, unsigned height,
>                                          util_format_dxtn_fetch_t fetch,
> -                                        unsigned block_size)
> +                                        unsigned block_size, boolean srgb)
>  {
>     const unsigned bw = 4, bh = 4, comps = 4;
>     unsigned x, y, i, j;
> @@ -258,6 +259,11 @@ util_format_dxtn_rgb_unpack_rgba_8unorm(uint8_t
> *dst_row, unsigned dst_stride,
>              for(i = 0; i < bw; ++i) {
>                 uint8_t *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row)
>                 + (x + i)*comps;
>                 fetch(0, src, i, j, dst);
> +               if (srgb) {
> +                  dst[0] = util_format_srgb_to_linear_8unorm(dst[0]);
> +                  dst[1] = util_format_srgb_to_linear_8unorm(dst[1]);
> +                  dst[2] = util_format_srgb_to_linear_8unorm(dst[2]);
> +               }
>              }
>           }
>           src += block_size;
> @@ -274,7 +280,8 @@ util_format_dxt1_rgb_unpack_rgba_8unorm(uint8_t *dst_row,
> unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
>                                             src_row, src_stride,
>                                             width, height,
> -                                           util_format_dxt1_rgb_fetch, 8);
> +                                           util_format_dxt1_rgb_fetch,
> +                                           8, false);
>  }
>  
>  void
> @@ -285,7 +292,8 @@ util_format_dxt1_rgba_unpack_rgba_8unorm(uint8_t
> *dst_row, unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
>                                             src_row, src_stride,
>                                             width, height,
> -                                           util_format_dxt1_rgba_fetch, 8);
> +                                           util_format_dxt1_rgba_fetch,
> +                                           8, false);
>  }
>  
>  void
> @@ -296,7 +304,8 @@ util_format_dxt3_rgba_unpack_rgba_8unorm(uint8_t
> *dst_row, unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
>                                             src_row, src_stride,
>                                             width, height,
> -                                           util_format_dxt3_rgba_fetch, 16);
> +                                           util_format_dxt3_rgba_fetch,
> +                                           16, false);
>  }
>  
>  void
> @@ -307,7 +316,8 @@ util_format_dxt5_rgba_unpack_rgba_8unorm(uint8_t
> *dst_row, unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
>                                             src_row, src_stride,
>                                             width, height,
> -                                           util_format_dxt5_rgba_fetch, 16);
> +                                           util_format_dxt5_rgba_fetch,
> +                                           16, false);
>  }
>  
>  static INLINE void
> @@ -315,7 +325,7 @@ util_format_dxtn_rgb_unpack_rgba_float(float *dst_row,
> unsigned dst_stride,
>                                         const uint8_t *src_row, unsigned
>                                         src_stride,
>                                         unsigned width, unsigned height,
>                                         util_format_dxtn_fetch_t fetch,
> -                                       unsigned block_size)
> +                                       unsigned block_size, boolean srgb)
>  {
>     unsigned x, y, i, j;
>     for(y = 0; y < height; y += 4) {
> @@ -326,9 +336,16 @@ util_format_dxtn_rgb_unpack_rgba_float(float *dst_row,
> unsigned dst_stride,
>                 float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) +
>                 (x + i)*4;
>                 uint8_t tmp[4];
>                 fetch(0, src, i, j, tmp);
> -               dst[0] = ubyte_to_float(tmp[0]);
> -               dst[1] = ubyte_to_float(tmp[1]);
> -               dst[2] = ubyte_to_float(tmp[2]);
> +               if (srgb) {
> +                  dst[0] = util_format_srgb_8unorm_to_linear_float(tmp[0]);
> +                  dst[1] = util_format_srgb_8unorm_to_linear_float(tmp[1]);
> +                  dst[2] = util_format_srgb_8unorm_to_linear_float(tmp[2]);
> +               }
> +               else {
> +                  dst[0] = ubyte_to_float(tmp[0]);
> +                  dst[1] = ubyte_to_float(tmp[1]);
> +                  dst[2] = ubyte_to_float(tmp[2]);
> +               }
>                 dst[3] = ubyte_to_float(tmp[3]);
>              }
>           }
> @@ -346,7 +363,8 @@ util_format_dxt1_rgb_unpack_rgba_float(float *dst_row,
> unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
>                                            src_row, src_stride,
>                                            width, height,
> -                                          util_format_dxt1_rgb_fetch, 8);
> +                                          util_format_dxt1_rgb_fetch,
> +                                          8, false);
>  }
>  
>  void
> @@ -357,7 +375,8 @@ util_format_dxt1_rgba_unpack_rgba_float(float *dst_row,
> unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
>                                            src_row, src_stride,
>                                            width, height,
> -                                          util_format_dxt1_rgba_fetch, 8);
> +                                          util_format_dxt1_rgba_fetch,
> +                                          8, false);
>  }
>  
>  void
> @@ -368,7 +387,8 @@ util_format_dxt3_rgba_unpack_rgba_float(float *dst_row,
> unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
>                                            src_row, src_stride,
>                                            width, height,
> -                                          util_format_dxt3_rgba_fetch, 16);
> +                                          util_format_dxt3_rgba_fetch,
> +                                          16, false);
>  }
>  
>  void
> @@ -379,7 +399,8 @@ util_format_dxt5_rgba_unpack_rgba_float(float *dst_row,
> unsigned dst_stride,
>     util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
>                                            src_row, src_stride,
>                                            width, height,
> -                                          util_format_dxt5_rgba_fetch, 16);
> +                                          util_format_dxt5_rgba_fetch,
> +                                          16, false);
>  }
>  
>  
> @@ -387,29 +408,52 @@ util_format_dxt5_rgba_unpack_rgba_float(float *dst_row,
> unsigned dst_stride,
>   * Block compression.
>   */
>  
> -void
> -util_format_dxt1_rgb_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
> -                                      const uint8_t *src, unsigned
> src_stride,
> -                                      unsigned width, unsigned height)
> +static INLINE void
> +util_format_dxtn_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
> +                                  const uint8_t *src, unsigned src_stride,
> +                                  unsigned width, unsigned height,
> +                                  enum util_format_dxtn format,
> +                                  unsigned block_size, boolean srgb)
>  {
> -   const unsigned bw = 4, bh = 4, bytes_per_block = 8;
> +   const unsigned bw = 4, bh = 4, comps = 4;
>     unsigned x, y, i, j, k;
>     for(y = 0; y < height; y += bh) {
>        uint8_t *dst = dst_row;
>        for(x = 0; x < width; x += bw) {
> -         uint8_t tmp[4][4][3];  /* [bh][bw][comps] */
> +         uint8_t tmp[4][4][4];  /* [bh][bw][comps] */
>           for(j = 0; j < bh; ++j) {
>              for(i = 0; i < bw; ++i) {
> +               uint8_t src_tmp;
>                 for(k = 0; k < 3; ++k) {
> -                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x +
> i)*4 + k];
> +                  src_tmp = src[(y + j)*src_stride/sizeof(*src) +
> (x+i)*comps + k];
> +                  if (srgb) {
> +                     tmp[j][i][k] =
> util_format_linear_to_srgb_8unorm(src_tmp);
> +                  }
> +                  else {
> +                     tmp[j][i][k] = src_tmp;
> +                  }
>                 }
> +               /* for sake of simplicity there's an unneeded 4th component
> for dxt1_rgb */
> +               tmp[j][i][3] = src[(y + j)*src_stride/sizeof(*src) +
> (x+i)*comps + 3];
>              }
>           }
> -         util_format_dxtn_pack(3, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT1_RGB,
> dst, 0);
> -         dst += bytes_per_block;
> +         /* even for dxt1_rgb have 4 src comps */
> +         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], format, dst, 0);
> +         dst += block_size;
>        }
>        dst_row += dst_stride / sizeof(*dst_row);
>     }
> +
> +}
> +
> +void
> +util_format_dxt1_rgb_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
> +                                      const uint8_t *src, unsigned
> src_stride,
> +                                      unsigned width, unsigned height)
> +{
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src, src_stride,
> +                                     width, height, UTIL_FORMAT_DXT1_RGB,
> +                                     8, false);
>  }
>  
>  void
> @@ -417,24 +461,9 @@ util_format_dxt1_rgba_pack_rgba_8unorm(uint8_t *dst_row,
> unsigned dst_stride,
>                                         const uint8_t *src, unsigned
>                                         src_stride,
>                                         unsigned width, unsigned height)
>  {
> -   const unsigned bw = 4, bh = 4, comps = 4, bytes_per_block = 8;
> -   unsigned x, y, i, j, k;
> -   for(y = 0; y < height; y += bh) {
> -      uint8_t *dst = dst_row;
> -      for(x = 0; x < width; x += bw) {
> -         uint8_t tmp[4][4][4];  /* [bh][bw][comps] */
> -         for(j = 0; j < bh; ++j) {
> -            for(i = 0; i < bw; ++i) {
> -               for(k = 0; k < comps; ++k) {
> -                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x +
> i)*comps + k];
> -               }
> -            }
> -         }
> -         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0],
> UTIL_FORMAT_DXT1_RGBA, dst, 0);
> -         dst += bytes_per_block;
> -      }
> -      dst_row += dst_stride / sizeof(*dst_row);
> -   }
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src, src_stride,
> +                                     width, height, UTIL_FORMAT_DXT1_RGBA,
> +                                     8, false);
>  }
>  
>  void
> @@ -442,24 +471,9 @@ util_format_dxt3_rgba_pack_rgba_8unorm(uint8_t *dst_row,
> unsigned dst_stride,
>                                         const uint8_t *src, unsigned
>                                         src_stride,
>                                         unsigned width, unsigned height)
>  {
> -   const unsigned bw = 4, bh = 4, comps = 4, bytes_per_block = 16;
> -   unsigned x, y, i, j, k;
> -   for(y = 0; y < height; y += bh) {
> -      uint8_t *dst = dst_row;
> -      for(x = 0; x < width; x += bw) {
> -         uint8_t tmp[4][4][4];  /* [bh][bw][comps] */
> -         for(j = 0; j < bh; ++j) {
> -            for(i = 0; i < bw; ++i) {
> -               for(k = 0; k < comps; ++k) {
> -                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x +
> i)*comps + k];
> -               }
> -            }
> -         }
> -         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0],
> UTIL_FORMAT_DXT3_RGBA, dst, 0);
> -         dst += bytes_per_block;
> -      }
> -      dst_row += dst_stride / sizeof(*dst_row);
> -   }
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src, src_stride,
> +                                     width, height, UTIL_FORMAT_DXT3_RGBA,
> +                                     16, false);
>  }
>  
>  void
> @@ -467,73 +481,65 @@ util_format_dxt5_rgba_pack_rgba_8unorm(uint8_t
> *dst_row, unsigned dst_stride,
>                                         const uint8_t *src, unsigned
>                                         src_stride,
>                                         unsigned width, unsigned height)
>  {
> -   const unsigned bw = 4, bh = 4, comps = 4, bytes_per_block = 16;
> -   unsigned x, y, i, j, k;
> -
> -   for(y = 0; y < height; y += bh) {
> -      uint8_t *dst = dst_row;
> -      for(x = 0; x < width; x += bw) {
> -         uint8_t tmp[4][4][4];  /* [bh][bw][comps] */
> -         for(j = 0; j < bh; ++j) {
> -            for(i = 0; i < bw; ++i) {
> -               for(k = 0; k < comps; ++k) {
> -                  tmp[j][i][k] = src[(y + j)*src_stride/sizeof(*src) + (x +
> i)*comps + k];
> -               }
> -            }
> -         }
> -         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0],
> UTIL_FORMAT_DXT5_RGBA, dst, 0);
> -         dst += bytes_per_block;
> -      }
> -      dst_row += dst_stride / sizeof(*dst_row);
> -   }
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src, src_stride,
> +                                     width, height, UTIL_FORMAT_DXT5_RGBA,
> +                                     16, false);
>  }
>  
> -void
> -util_format_dxt1_rgb_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
> -                                     const float *src, unsigned src_stride,
> -                                     unsigned width, unsigned height)
> +static INLINE void
> +util_format_dxtn_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
> +                                 const float *src, unsigned src_stride,
> +                                 unsigned width, unsigned height,
> +                                 enum util_format_dxtn format,
> +                                 unsigned block_size, boolean srgb)
>  {
>     unsigned x, y, i, j, k;
>     for(y = 0; y < height; y += 4) {
>        uint8_t *dst = dst_row;
>        for(x = 0; x < width; x += 4) {
> -         uint8_t tmp[4][4][3];
> +         uint8_t tmp[4][4][4];
>           for(j = 0; j < 4; ++j) {
>              for(i = 0; i < 4; ++i) {
> +               float src_tmp;
>                 for(k = 0; k < 3; ++k) {
> -                  tmp[j][i][k] = float_to_ubyte(src[(y +
> j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
> +                  src_tmp = src[(y + j)*src_stride/sizeof(*src) + (x+i)*4 +
> k];
> +                  if (srgb) {
> +                     tmp[j][i][k] =
> util_format_linear_float_to_srgb_8unorm(src_tmp);
> +                  }
> +                  else {
> +                     tmp[j][i][k] = float_to_ubyte(src_tmp);
> +                  }
>                 }
> +               /* for sake of simplicity there's an unneeded 4th component
> for dxt1_rgb */
> +               src_tmp = src[(y + j)*src_stride/sizeof(*src) + (x+i)*4 + 3];
> +               tmp[j][i][3] = float_to_ubyte(src_tmp);
>              }
>           }
> -         util_format_dxtn_pack(3, 4, 4, &tmp[0][0][0], UTIL_FORMAT_DXT1_RGB,
> dst, 0);
> -         dst += 8;
> +         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0], format, dst, 0);
> +         dst += block_size;
>        }
>        dst_row += 4*dst_stride/sizeof(*dst_row);
>     }
>  }
>  
>  void
> +util_format_dxt1_rgb_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
> +                                     const float *src, unsigned src_stride,
> +                                     unsigned width, unsigned height)
> +{
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src, src_stride,
> +                                    width, height, UTIL_FORMAT_DXT1_RGB,
> +                                    8, false);
> +}
> +
> +void
>  util_format_dxt1_rgba_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
>                                        const float *src, unsigned src_stride,
>                                        unsigned width, unsigned height)
>  {
> -   unsigned x, y, i, j, k;
> -   for(y = 0; y < height; y += 4) {
> -      uint8_t *dst = dst_row;
> -      for(x = 0; x < width; x += 4) {
> -         uint8_t tmp[4][4][4];
> -         for(j = 0; j < 4; ++j) {
> -            for(i = 0; i < 4; ++i) {
> -               for(k = 0; k < 4; ++k) {
> -                  tmp[j][i][k] = float_to_ubyte(src[(y +
> j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
> -               }
> -            }
> -         }
> -         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0],
> UTIL_FORMAT_DXT1_RGBA, dst, 0);
> -         dst += 8;
> -      }
> -      dst_row += 4*dst_stride/sizeof(*dst_row);
> -   }
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src, src_stride,
> +                                    width, height, UTIL_FORMAT_DXT1_RGBA,
> +                                    8, false);
>  }
>  
>  void
> @@ -541,23 +547,9 @@ util_format_dxt3_rgba_pack_rgba_float(uint8_t *dst_row,
> unsigned dst_stride,
>                                        const float *src, unsigned src_stride,
>                                        unsigned width, unsigned height)
>  {
> -   unsigned x, y, i, j, k;
> -   for(y = 0; y < height; y += 4) {
> -      uint8_t *dst = dst_row;
> -      for(x = 0; x < width; x += 4) {
> -         uint8_t tmp[4][4][4];
> -         for(j = 0; j < 4; ++j) {
> -            for(i = 0; i < 4; ++i) {
> -               for(k = 0; k < 4; ++k) {
> -                  tmp[j][i][k] = float_to_ubyte(src[(y +
> j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
> -               }
> -            }
> -         }
> -         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0],
> UTIL_FORMAT_DXT3_RGBA, dst, 0);
> -         dst += 16;
> -      }
> -      dst_row += 4*dst_stride/sizeof(*dst_row);
> -   }
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src, src_stride,
> +                                    width, height, UTIL_FORMAT_DXT3_RGBA,
> +                                    16, false);
>  }
>  
>  void
> @@ -565,173 +557,245 @@ util_format_dxt5_rgba_pack_rgba_float(uint8_t
> *dst_row, unsigned dst_stride,
>                                        const float *src, unsigned src_stride,
>                                        unsigned width, unsigned height)
>  {
> -   unsigned x, y, i, j, k;
> -   for(y = 0; y < height; y += 4) {
> -      uint8_t *dst = dst_row;
> -      for(x = 0; x < width; x += 4) {
> -         uint8_t tmp[4][4][4];
> -         for(j = 0; j < 4; ++j) {
> -            for(i = 0; i < 4; ++i) {
> -               for(k = 0; k < 4; ++k) {
> -                  tmp[j][i][k] = float_to_ubyte(src[(y +
> j)*src_stride/sizeof(*src) + (x+i)*4 + k]);
> -               }
> -            }
> -         }
> -         util_format_dxtn_pack(4, 4, 4, &tmp[0][0][0],
> UTIL_FORMAT_DXT5_RGBA, dst, 0);
> -         dst += 16;
> -      }
> -      dst_row += 4*dst_stride/sizeof(*dst_row);
> -   }
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src, src_stride,
> +                                    width, height, UTIL_FORMAT_DXT5_RGBA,
> +                                    16, false);
>  }
>  
>  
>  /*
>   * SRGB variants.
> - *
> - * FIXME: shunts to RGB for now
>   */
>  
>  void
> -util_format_dxt1_srgb_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt1_srgb_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt1_rgb_unpack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   uint8_t tmp[4];
> +   util_format_dxt1_rgb_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_to_linear_8unorm(tmp[0]);
> +   dst[1] = util_format_srgb_to_linear_8unorm(tmp[1]);
> +   dst[2] = util_format_srgb_to_linear_8unorm(tmp[2]);
> +   dst[3] = 255;
>  }
>  
>  void
> -util_format_dxt1_srgb_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt1_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt1_rgb_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   uint8_t tmp[4];
> +   util_format_dxt1_rgba_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_to_linear_8unorm(tmp[0]);
> +   dst[1] = util_format_srgb_to_linear_8unorm(tmp[1]);
> +   dst[2] = util_format_srgb_to_linear_8unorm(tmp[2]);
> +   dst[3] = tmp[3];
>  }
>  
>  void
> -util_format_dxt1_srgb_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt3_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt1_rgb_fetch_rgba_8unorm(dst, src, i, j);
> +   uint8_t tmp[4];
> +   util_format_dxt3_rgba_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_to_linear_8unorm(tmp[0]);
> +   dst[1] = util_format_srgb_to_linear_8unorm(tmp[1]);
> +   dst[2] = util_format_srgb_to_linear_8unorm(tmp[2]);
> +   dst[3] = tmp[3];
>  }
>  
>  void
> -util_format_dxt1_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt5_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt1_rgba_unpack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   uint8_t tmp[4];
> +   util_format_dxt5_rgba_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_to_linear_8unorm(tmp[0]);
> +   dst[1] = util_format_srgb_to_linear_8unorm(tmp[1]);
> +   dst[2] = util_format_srgb_to_linear_8unorm(tmp[2]);
> +   dst[3] = tmp[3];
>  }
>  
>  void
> -util_format_dxt1_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt1_srgb_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt1_rgba_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   uint8_t tmp[4];
> +   util_format_dxt1_rgb_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_8unorm_to_linear_float(tmp[0]);
> +   dst[1] = util_format_srgb_8unorm_to_linear_float(tmp[1]);
> +   dst[2] = util_format_srgb_8unorm_to_linear_float(tmp[2]);
> +   dst[3] = 1.0f;
>  }
>  
>  void
> -util_format_dxt1_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt1_srgba_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt1_rgba_fetch_rgba_8unorm(dst, src, i, j);
> +   uint8_t tmp[4];
> +   util_format_dxt1_rgba_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_8unorm_to_linear_float(tmp[0]);
> +   dst[1] = util_format_srgb_8unorm_to_linear_float(tmp[1]);
> +   dst[2] = util_format_srgb_8unorm_to_linear_float(tmp[2]);
> +   dst[3] = ubyte_to_float(tmp[3]);
>  }
>  
>  void
> -util_format_dxt3_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt3_srgba_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt3_rgba_unpack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   uint8_t tmp[4];
> +   util_format_dxt3_rgba_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_8unorm_to_linear_float(tmp[0]);
> +   dst[1] = util_format_srgb_8unorm_to_linear_float(tmp[1]);
> +   dst[2] = util_format_srgb_8unorm_to_linear_float(tmp[2]);
> +   dst[3] = ubyte_to_float(tmp[3]);
>  }
>  
>  void
> -util_format_dxt3_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt5_srgba_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
>  {
> -   util_format_dxt3_rgba_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   uint8_t tmp[4];
> +   util_format_dxt5_rgba_fetch(0, src, i, j, tmp);
> +   dst[0] = util_format_srgb_8unorm_to_linear_float(tmp[0]);
> +   dst[1] = util_format_srgb_8unorm_to_linear_float(tmp[1]);
> +   dst[2] = util_format_srgb_8unorm_to_linear_float(tmp[2]);
> +   dst[3] = ubyte_to_float(tmp[3]);
>  }
>  
>  void
> -util_format_dxt3_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt1_srgb_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt3_rgba_fetch_rgba_8unorm(dst, src, i, j);
> +   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
> +                                           src_row, src_stride,
> +                                           width, height,
> +                                           util_format_dxt1_rgb_fetch,
> +                                           8, true);
>  }
>  
>  void
> -util_format_dxt5_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt1_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt5_rgba_unpack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
> +                                           src_row, src_stride,
> +                                           width, height,
> +                                           util_format_dxt1_rgba_fetch,
> +                                           8, true);
>  }
>  
>  void
> -util_format_dxt5_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt3_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt5_rgba_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
> +                                           src_row, src_stride,
> +                                           width, height,
> +                                           util_format_dxt3_rgba_fetch,
> +                                           16, true);
>  }
>  
>  void
> -util_format_dxt5_srgba_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt5_srgba_unpack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt5_rgba_fetch_rgba_8unorm(dst, src, i, j);
> +   util_format_dxtn_rgb_unpack_rgba_8unorm(dst_row, dst_stride,
> +                                           src_row, src_stride,
> +                                           width, height,
> +                                           util_format_dxt5_rgba_fetch,
> +                                           16, true);
>  }
>  
>  void
>  util_format_dxt1_srgb_unpack_rgba_float(float *dst_row, unsigned dst_stride,
>  const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned
>  height)
>  {
> -   util_format_dxt1_rgb_unpack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
> +                                          src_row, src_stride,
> +                                          width, height,
> +                                          util_format_dxt1_rgb_fetch,
> +                                          8, true);
>  }
>  
>  void
> -util_format_dxt1_srgb_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
> const float *src_row, unsigned src_stride, unsigned width, unsigned height)
> +util_format_dxt1_srgba_unpack_rgba_float(float *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt1_rgb_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
> +                                          src_row, src_stride,
> +                                          width, height,
> +                                          util_format_dxt1_rgba_fetch,
> +                                          8, true);
>  }
>  
>  void
> -util_format_dxt1_srgb_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt3_srgba_unpack_rgba_float(float *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt1_rgb_fetch_rgba_float(dst, src, i, j);
> +   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
> +                                          src_row, src_stride,
> +                                          width, height,
> +                                          util_format_dxt3_rgba_fetch,
> +                                          16, true);
>  }
>  
>  void
> -util_format_dxt1_srgba_unpack_rgba_float(float *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt5_srgba_unpack_rgba_float(float *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt1_rgba_unpack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_rgb_unpack_rgba_float(dst_row, dst_stride,
> +                                          src_row, src_stride,
> +                                          width, height,
> +                                          util_format_dxt5_rgba_fetch,
> +                                          16, true);
>  }
>  
>  void
> -util_format_dxt1_srgba_pack_rgba_float(uint8_t *dst_row, unsigned
> dst_stride, const float *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt1_srgb_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt1_rgba_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride,
> +                                     width, height, UTIL_FORMAT_DXT1_RGB,
> +                                     8, true);
>  }
>  
>  void
> -util_format_dxt1_srgba_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt1_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt1_rgba_fetch_rgba_float(dst, src, i, j);
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride,
> +                                     width, height, UTIL_FORMAT_DXT1_RGBA,
> +                                     8, true);
>  }
>  
>  void
> -util_format_dxt3_srgba_unpack_rgba_float(float *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt3_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt3_rgba_unpack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride,
> +                                     width, height, UTIL_FORMAT_DXT3_RGBA,
> +                                     16, true);
>  }
>  
>  void
> -util_format_dxt3_srgba_pack_rgba_float(uint8_t *dst_row, unsigned
> dst_stride, const float *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt5_srgba_pack_rgba_8unorm(uint8_t *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt3_rgba_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_pack_rgba_8unorm(dst_row, dst_stride, src_row,
> src_stride,
> +                                     width, height, UTIL_FORMAT_DXT5_RGBA,
> +                                     16, true);
>  }
>  
>  void
> -util_format_dxt3_srgba_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt1_srgb_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride,
> const float *src_row, unsigned src_stride, unsigned width, unsigned height)
>  {
> -   util_format_dxt3_rgba_fetch_rgba_float(dst, src, i, j);
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride,
> +                                    width, height, UTIL_FORMAT_DXT1_RGB,
> +                                    8, true);
>  }
>  
>  void
> -util_format_dxt5_srgba_unpack_rgba_float(float *dst_row, unsigned
> dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt1_srgba_pack_rgba_float(uint8_t *dst_row, unsigned
> dst_stride, const float *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt5_rgba_unpack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride,
> +                                    width, height, UTIL_FORMAT_DXT1_RGBA,
> +                                    8, true);
>  }
>  
>  void
> -util_format_dxt5_srgba_pack_rgba_float(uint8_t *dst_row, unsigned
> dst_stride, const float *src_row, unsigned src_stride, unsigned width,
> unsigned height)
> +util_format_dxt3_srgba_pack_rgba_float(uint8_t *dst_row, unsigned
> dst_stride, const float *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt5_rgba_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride, width, height);
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride,
> +                                    width, height, UTIL_FORMAT_DXT3_RGBA,
> +                                    16, true);
>  }
>  
>  void
> -util_format_dxt5_srgba_fetch_rgba_float(float *dst, const uint8_t *src,
> unsigned i, unsigned j)
> +util_format_dxt5_srgba_pack_rgba_float(uint8_t *dst_row, unsigned
> dst_stride, const float *src_row, unsigned src_stride, unsigned width,
> unsigned height)
>  {
> -   util_format_dxt5_rgba_fetch_rgba_float(dst, src, i, j);
> +   util_format_dxtn_pack_rgba_float(dst_row, dst_stride, src_row,
> src_stride,
> +                                    width, height, UTIL_FORMAT_DXT5_RGBA,
> +                                    16, true);
>  }
>  
> diff --git a/src/gallium/auxiliary/util/u_format_srgb.h
> b/src/gallium/auxiliary/util/u_format_srgb.h
> index 43213fb..82ed957 100644
> --- a/src/gallium/auxiliary/util/u_format_srgb.h
> +++ b/src/gallium/auxiliary/util/u_format_srgb.h
> @@ -83,6 +83,11 @@ util_format_srgb_8unorm_to_linear_float(uint8_t x)
>  }
>  
>  
> +/*
> + * XXX These 2 functions probably don't make a lot of sense (but lots
> + * of potential callers which most likely all don't make sense neither)
> + */
> +
>  /**
>   * Convert a 8bit normalized value from linear to srgb.
>   */
> --
> 1.7.9.5
> 


More information about the mesa-dev mailing list