[Mesa-dev] [PATCH] gallium/radeon: Correctly translate colorswaps for big endian

Oded Gabbay oded.gabbay at gmail.com
Tue Feb 23 15:41:00 UTC 2016


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.gabbay at gmail.com>
CC: "11.1" <mesa-stable at 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



More information about the mesa-dev mailing list