43 lines
1.7 KiB
Diff
43 lines
1.7 KiB
Diff
|
From ab0e1e38ab9e8b23602af21d1b43e98afbf80e45 Mon Sep 17 00:00:00 2001
|
||
|
From: Ray Strode <rstrode@redhat.com>
|
||
|
Date: Fri, 21 Apr 2017 15:22:14 -0400
|
||
|
Subject: [PATCH] gallivm: correct channel shift logic on big endian
|
||
|
|
||
|
lp_build_fetch_rgba_soa fetches a texel from a texture.
|
||
|
Part of that process involves first gathering the element
|
||
|
together from memory into a packed format, and then breaking
|
||
|
out the individual color channels into separate, parallel
|
||
|
arrays.
|
||
|
|
||
|
The code fails to account for endianess when reading the packed
|
||
|
values.
|
||
|
|
||
|
This commit attempts to correct the problem by reversing the order
|
||
|
the packed values are read on big endian systems.
|
||
|
---
|
||
|
src/gallium/auxiliary/gallivm/lp_bld_format_soa.c | 8 +++++++-
|
||
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
|
||
|
index 98eb694..22c19b1 100644
|
||
|
--- a/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
|
||
|
+++ b/src/gallium/auxiliary/gallivm/lp_bld_format_soa.c
|
||
|
@@ -650,7 +650,13 @@ lp_build_fetch_rgba_soa(struct gallivm_state *gallivm,
|
||
|
for (i = 0; i < format_desc->nr_channels; i++) {
|
||
|
struct util_format_channel_description chan_desc = format_desc->channel[i];
|
||
|
unsigned blockbits = type.width;
|
||
|
- unsigned vec_nr = chan_desc.shift / type.width;
|
||
|
+ unsigned vec_nr;
|
||
|
+
|
||
|
+#ifdef PIPE_ARCH_BIG_ENDIAN
|
||
|
+ vec_nr = (format_desc->block.bits - (chan_desc.shift + chan_desc.size)) / type.width;
|
||
|
+#else
|
||
|
+ vec_nr = chan_desc.shift / type.width;
|
||
|
+#endif
|
||
|
chan_desc.shift %= type.width;
|
||
|
|
||
|
output[i] = lp_build_extract_soa_chan(&bld,
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|