From 6e7d782da506da233b2ac695b022ac393e1c719e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 16 Feb 2011 04:18:42 +0100 Subject: [PATCH] util: fix DXT1 RGBA texture compression if the source color is (0, 0, 0, 0) This is a workaround for a bug in libtxc_dxtn. Fixes: - piglit/GL_EXT_texture_compression_s3tc/fbo-generatemipmap-formats Signed-off-by: Dave Airlie --- src/gallium/auxiliary/util/u_format_s3tc.c | 16 ++++++++++++++-- 1 file 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 bb989c29d81..31288e3f0ce 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]; + } } } } -- 2.30.2