The current code in r600_translate_colorswap uses the swizzle information
to determine which colorswap to use.

This works for BE & LE when the nr_channels is <4, but when nr_channels==4
(e.g. PIPE_FORMAT_A8R8G8B8_UNORM), this method can not be used for both BE
and LE, because the swizzle info is the same for both of them.

As a result, r600g doesn't support 24bit color formats, only 16bit, which
forces the user to choose 16bit color in X server.

This patch fixes this bug by separating the checks for LE and BE and
adapting the swizzle conditions in the BE part of the checks.

Signed-off-by: Oded Gabbay <oded.gab...@gmail.com>
CC: "11.1" <mesa-sta...@lists.freedesktop.org>
---
 src/gallium/drivers/radeon/r600_texture.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index af206e4..1df0c30 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -1293,6 +1293,7 @@ unsigned r600_translate_colorswap(enum pipe_format format)
                break;
        case 4:
                /* check the middle channels, the 1st and 4th channel can be 
NONE */
+#ifdef PIPE_ARCH_LITTLE_ENDIAN
                if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,Z))
                        return V_0280A0_SWAP_STD; /* XYZW */
                else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,Y))
@@ -1301,6 +1302,16 @@ unsigned r600_translate_colorswap(enum pipe_format 
format)
                        return V_0280A0_SWAP_ALT; /* ZYXW */
                else if (HAS_SWIZZLE(1,X) && HAS_SWIZZLE(2,Y))
                        return V_0280A0_SWAP_ALT_REV; /* WXYZ */
+#else
+               if (HAS_SWIZZLE(1,W) && HAS_SWIZZLE(2,X))
+                       return V_0280A0_SWAP_STD; /* ZWXY */
+               else if (HAS_SWIZZLE(1,X) && HAS_SWIZZLE(2,W))
+                       return V_0280A0_SWAP_STD_REV; /* YXWZ */
+               else if (HAS_SWIZZLE(1,W) && HAS_SWIZZLE(2,Z))
+                       return V_0280A0_SWAP_ALT; /* XWZY */
+               else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,W))
+                       return V_0280A0_SWAP_ALT_REV; /* YZWX */
+#endif
                break;
        }
        return ~0U;
-- 
2.5.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to