[Mesa-dev] [PATCH] util: fix DXT1 RGBA texture compression if the source color is (0, 0, 0, 0)

Marek Olšák maraeo at gmail.com
Tue Feb 15 19:43:57 PST 2011


Ideally we should fix this in libtxc_dxtn, but there is no central
repository for that library, no versioning, and no official releases, and I
am pretty sure that nobody would update that lib just to get this fix.
Putting this fix in Mesa ensures that it will find its way to users, which
is important.

Marek

On Wed, Feb 16, 2011 at 4:18 AM, Marek Olšák <maraeo at gmail.com> wrote:

> This is a workaround for a bug in libtxc_dxtn.
>
> Fixes:
> - piglit/GL_EXT_texture_compression_s3tc/fbo-generatemipmap-formats
> ---
>  src/gallium/auxiliary/util/u_format_s3tc.c |   16 ++++++++++++++--
>  1 files changed, 14 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/util/u_format_s3tc.c
> b/src/gallium/auxiliary/util/u_format_s3tc.c
> index bb989c2..31288e3 100644
> --- a/src/gallium/auxiliary/util/u_format_s3tc.c
> +++ b/src/gallium/auxiliary/util/u_format_s3tc.c
> @@ -416,8 +416,20 @@ util_format_dxt1_rgba_pack_rgba_8unorm(uint8_t
> *dst_row, unsigned dst_stride,
>          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];
> +               const uint8_t *srcp = &src[(y + j)*src_stride/sizeof(*src)
> + (x + i)*comps];
> +               /* Workaround for a bug in libtxc_dxtn.
> +                * If the color is (0,0,0,0), it is compressed as
> (0,0,0,1),
> +                * which is incorrect. Any other (x,y,z,0) color is
> compressed
> +                * correctly as (0,0,0,0), so let's use (1,0,0,0). */
> +               if (srcp[0] == 0 && srcp[1] == 0 && srcp[2] == 0 && srcp[3]
> == 0) {
> +                  tmp[j][i][0] = 255;
> +                  tmp[j][i][1] = 0;
> +                  tmp[j][i][2] = 0;
> +                  tmp[j][i][3] = 0;
> +               } else {
> +                  for(k = 0; k < comps; ++k) {
> +                     tmp[j][i][k] = srcp[k];
> +                  }
>                }
>             }
>          }
> --
> 1.7.1
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20110216/776859bb/attachment.html>


More information about the mesa-dev mailing list