summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2015-08-09 23:45:44 -0700
committerEmil Velikov <emil.l.velikov@gmail.com>2015-08-19 18:06:57 +0100
commit096282a662a303c24f5de5d8a0eeb16239f0c537 (patch)
tree4ce6df397c7351eb24c2f39baee8ea516ee206dc
parentc364a00cf957f4e0b5e4d039f1736f54c57e7fde (diff)
mesa/formats: Fix swizzle flipping for big-endian targets
The swizzle defines where in the format you should look for any given channel. When we flip the format around for BE targets, we need to change the destinations of the swizzles, not the sources. For example, say the format is an RGBX format with a swizzle of xyz1 on LE. Then it should be wzy1 on BE; however, the code as it was before, would have made it 1zyx on BE which is clearly wrong. Reviewed-by: Iago Toral <itoral@igalia.com> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com> Cc: "10.6 10.5" <mesa-stable@lists.freedesktop.org> (cherry picked from commit 28d1a506c8d09fa66170978c85566c34cbf1cc0a)
-rw-r--r--src/mesa/main/formats.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index 99a5ad34ce4..a20a41db3b0 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -354,14 +354,22 @@ _mesa_array_format_flip_channels(mesa_array_format format)
return format;
if (num_channels == 2) {
- _mesa_array_format_set_swizzle(&format, swizzle[1], swizzle[0],
- swizzle[2], swizzle[3]);
+ /* Assert that the swizzle makes sense for 2 channels */
+ for (unsigned i = 0; i < 4; i++)
+ assert(swizzle[i] != 2 && swizzle[i] != 3);
+
+ static const uint8_t flip_xy[6] = { 1, 0, 2, 3, 4, 5 };
+ _mesa_array_format_set_swizzle(&format,
+ flip_xy[swizzle[0]], flip_xy[swizzle[1]],
+ flip_xy[swizzle[2]], flip_xy[swizzle[3]]);
return format;
}
if (num_channels == 4) {
- _mesa_array_format_set_swizzle(&format, swizzle[3], swizzle[2],
- swizzle[1], swizzle[0]);
+ static const uint8_t flip[6] = { 3, 2, 1, 0, 4, 5 };
+ _mesa_array_format_set_swizzle(&format,
+ flip[swizzle[0]], flip[swizzle[1]],
+ flip[swizzle[2]], flip[swizzle[3]]);
return format;
}