r600g: set endianess of 16/32-bit buffers according to do_endian_swap
authorOded Gabbay <oded.gabbay@gmail.com>
Tue, 19 Apr 2016 13:25:23 +0000 (16:25 +0300)
committerOded Gabbay <oded.gabbay@gmail.com>
Tue, 26 Apr 2016 08:00:16 +0000 (11:00 +0300)
This patch modifies r600_colorformat_endian_swap(), so for 16-bit and for
32-bit buffers, the endianess configuration will be determined not only
by the color/texture format, but also by the do_endian_swap parameter.

The only exception is for array formats, which are always set to not do
swapping, because for them gallium sets an alias based on the machine's
endianess.

v4:
V_0280A0_COLOR_16_16 and V_0280A0_COLOR_16_16_FLOAT should be set to
8IN16 because the bytes inside need to be swapped even for array formats.

Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
Cc: "11.1 11.2" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/r600/r600_state_common.c

index 3e58d21735b36815bb8fe85b5724960f714fa75e..e60a8aa9739d1abf441f1792770b764df27cdbc3 100644 (file)
@@ -2691,17 +2691,24 @@ uint32_t r600_colorformat_endian_swap(uint32_t colorformat, bool do_endian_swap)
                        return ENDIAN_NONE;
 
                /* 16-bit buffers. */
+               case V_0280A0_COLOR_8_8:
+                       /*
+                        * No need to do endian swaps on array formats,
+                        * as mesa<-->pipe formats conversion take into account
+                        * the endianess
+                        */
+                       return ENDIAN_NONE;
+
                case V_0280A0_COLOR_5_6_5:
                case V_0280A0_COLOR_1_5_5_5:
                case V_0280A0_COLOR_4_4_4_4:
                case V_0280A0_COLOR_16:
-               case V_0280A0_COLOR_8_8:
-                       return ENDIAN_8IN16;
+                       return (do_endian_swap ? ENDIAN_8IN16 : ENDIAN_NONE);
 
                /* 32-bit buffers. */
                case V_0280A0_COLOR_8_8_8_8:
                        /*
-                        * No need to do endian swaps on four 8-bits components,
+                        * No need to do endian swaps on array formats,
                         * as mesa<-->pipe formats conversion take into account
                         * the endianess
                         */
@@ -2711,9 +2718,11 @@ uint32_t r600_colorformat_endian_swap(uint32_t colorformat, bool do_endian_swap)
                case V_0280A0_COLOR_8_24:
                case V_0280A0_COLOR_24_8:
                case V_0280A0_COLOR_32_FLOAT:
+                       return (do_endian_swap ? ENDIAN_8IN32 : ENDIAN_NONE);
+
                case V_0280A0_COLOR_16_16_FLOAT:
                case V_0280A0_COLOR_16_16:
-                       return ENDIAN_8IN32;
+                       return ENDIAN_8IN16;
 
                /* 64-bit buffers. */
                case V_0280A0_COLOR_16_16_16_16: