From fbe392d16b2563611bab227c972c34e8945a84d2 Mon Sep 17 00:00:00 2001 From: Jocelyn Falempe Date: Thu, 24 Mar 2022 22:55:05 +0100 Subject: [PATCH] llvmpipe: fix color rendering on big endian. Some colors were missing/inverted on big endian machine(s390x). because blend_type.length > src_fmt->nr_channels. In my case, blend_type has 4 channels (rgba) but src_fmt has only 3. So the from_lsb was wrong by 1, and channels got messed up. (blue was always 255, green -> red, and blue -> green). Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6204 Reviewed-by: Dave Airlie Signed-off-by: Jocelyn Falempe Part-of: --- src/gallium/drivers/llvmpipe/lp_state_fs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index d45d8e1aa45..87a41e9c16f 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -1961,7 +1961,7 @@ convert_to_blend_type(struct gallivm_state *gallivm, #if UTIL_ARCH_LITTLE_ENDIAN unsigned from_lsb = j; #else - unsigned from_lsb = src_fmt->nr_channels - j - 1; + unsigned from_lsb = (blend_type.length / pixels) - j - 1; #endif mask = (1 << src_fmt->channel[j].size) - 1; @@ -2144,7 +2144,7 @@ convert_from_blend_type(struct gallivm_state *gallivm, #if UTIL_ARCH_LITTLE_ENDIAN unsigned from_lsb = j; #else - unsigned from_lsb = src_fmt->nr_channels - j - 1; + unsigned from_lsb = blend_type.length - j - 1; #endif assert(blend_type.width > src_fmt->channel[j].size);