[Mesa-stable] [PATCH v2] r600g: Fix ARB_texture_rgb10_a2ui support in big-endian

Oded Gabbay oded.gabbay at gmail.com
Tue Mar 1 12:11:28 UTC 2016


This patch enables the correct detection of PIPE_FORMAT_R10G10B10A2_UINT
and PIPE_FORMAT_B10G10R10A2_UINT formats in r600g in big-endian mode.

Because the swapping doesn't happen on component boundaries for these
formats, the GPU H/W needs to be configured differently for LE/BE.
Therefore, we need to use a different color format for BE - V_0280A0_COLOR_10_10_10_2

This enables support for ARB_texture_rgb10_a2ui, which otherwise is not
detected as supported.

Tested using piglit texwrap with GL_ARB_texture_rgb10_a2ui.

v2:

- Used the correct color format for R10G10B10A2 on
  BE (V_0280A0_COLOR_10_10_10_2) to configure the GPU

- Added detection of this color format in endian swap function

- removed blank line

Signed-off-by: Oded Gabbay <oded.gabbay at gmail.com>
Cc: "11.1 11.2" <mesa-stable at lists.freedesktop.org>
---
 src/gallium/drivers/r600/r600_state_common.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
index aa3a085..53cf972 100644
--- a/src/gallium/drivers/r600/r600_state_common.c
+++ b/src/gallium/drivers/r600/r600_state_common.c
@@ -2464,6 +2464,14 @@ uint32_t r600_translate_texformat(struct pipe_screen *screen,
 				result = FMT_2_10_10_10;
 				goto out_word4;
 			}
+			if (R600_BIG_ENDIAN &&
+			    desc->channel[0].size == 2 &&
+			    desc->channel[1].size == 10 &&
+			    desc->channel[2].size == 10 &&
+			    desc->channel[3].size == 10) {
+				result = FMT_10_10_10_2;
+				goto out_word4;
+			}
 			goto out_unknown;
 		}
 		goto out_unknown;
@@ -2685,6 +2693,8 @@ uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format forma
 			return V_0280A0_COLOR_1_5_5_5;
 		} else if (HAS_SIZE(10,10,10,2)) {
 			return V_0280A0_COLOR_2_10_10_10;
+		} else if (R600_BIG_ENDIAN && HAS_SIZE(2,10,10,10)) {
+			return V_0280A0_COLOR_10_10_10_2;
 		}
 		break;
 	}
@@ -2717,6 +2727,7 @@ uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
 			 */
 			return ENDIAN_NONE;
 
+		case V_0280A0_COLOR_10_10_10_2:
 		case V_0280A0_COLOR_2_10_10_10:
 		case V_0280A0_COLOR_8_24:
 		case V_0280A0_COLOR_24_8:
-- 
2.5.0



More information about the mesa-stable mailing list