fa677b
diff -up mesa-20160225/src/gallium/drivers/r600/evergreen_state.c.egbe mesa-20160225/src/gallium/drivers/r600/evergreen_state.c
fa677b
--- mesa-20160225/src/gallium/drivers/r600/evergreen_state.c.egbe	2016-02-22 21:42:41.000000000 +1000
fa677b
+++ mesa-20160225/src/gallium/drivers/r600/evergreen_state.c	2016-02-25 13:06:47.351154059 +1000
fa677b
@@ -219,7 +219,7 @@ static bool r600_is_sampler_format_suppo
ede8cb
 static bool r600_is_colorbuffer_format_supported(enum chip_class chip, enum pipe_format format)
ede8cb
 {
ede8cb
 	return r600_translate_colorformat(chip, format) != ~0U &&
ede8cb
-		r600_translate_colorswap(format) != ~0U;
ede8cb
+		r600_translate_colorswap(chip, format) != ~0U;
ede8cb
 }
ede8cb
 
ede8cb
 static bool r600_is_zs_format_supported(enum pipe_format format)
fa677b
@@ -982,7 +982,8 @@ void evergreen_init_color_surface_rat(st
ede8cb
 	unsigned format = r600_translate_colorformat(rctx->b.chip_class,
ede8cb
 						     surf->base.format);
ede8cb
 	unsigned endian = r600_colorformat_endian_swap(format);
ede8cb
-	unsigned swap = r600_translate_colorswap(surf->base.format);
ede8cb
+	unsigned swap = r600_translate_colorswap(rctx->b.chip_class,
ede8cb
+						 surf->base.format);
ede8cb
 	unsigned block_size =
ede8cb
 		align(util_format_get_blocksize(pipe_buffer->format), 4);
ede8cb
 	unsigned pitch_alignment =
fa677b
@@ -1143,7 +1144,7 @@ void evergreen_init_color_surface(struct
ede8cb
 	format = r600_translate_colorformat(rctx->b.chip_class, surf->base.format);
ede8cb
 	assert(format != ~0);
ede8cb
 
ede8cb
-	swap = r600_translate_colorswap(surf->base.format);
ede8cb
+	swap = r600_translate_colorswap(rctx->b.chip_class, surf->base.format);
ede8cb
 	assert(swap != ~0);
ede8cb
 
ede8cb
 	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
fa677b
diff -up mesa-20160225/src/gallium/drivers/r600/r600_state.c.egbe mesa-20160225/src/gallium/drivers/r600/r600_state.c
fa677b
--- mesa-20160225/src/gallium/drivers/r600/r600_state.c.egbe	2016-02-22 21:42:41.000000000 +1000
fa677b
+++ mesa-20160225/src/gallium/drivers/r600/r600_state.c	2016-02-25 13:06:47.351154059 +1000
fa677b
@@ -149,7 +149,7 @@ static bool r600_is_sampler_format_suppo
ede8cb
 static bool r600_is_colorbuffer_format_supported(enum chip_class chip, enum pipe_format format)
ede8cb
 {
ede8cb
 	return r600_translate_colorformat(chip, format) != ~0U &&
ede8cb
-	       r600_translate_colorswap(format) != ~0U;
ede8cb
+	       r600_translate_colorswap(chip, format) != ~0U;
ede8cb
 }
ede8cb
 
ede8cb
 static bool r600_is_zs_format_supported(enum pipe_format format)
fa677b
@@ -927,7 +927,7 @@ static void r600_init_color_surface(stru
ede8cb
 	format = r600_translate_colorformat(rctx->b.chip_class, surf->base.format);
ede8cb
 	assert(format != ~0);
ede8cb
 
ede8cb
-	swap = r600_translate_colorswap(surf->base.format);
ede8cb
+	swap = r600_translate_colorswap(rctx->b.chip_class, surf->base.format);
ede8cb
 	assert(swap != ~0);
ede8cb
 
ede8cb
 	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
fa677b
diff -up mesa-20160225/src/gallium/drivers/r600/r600_state_common.c.egbe mesa-20160225/src/gallium/drivers/r600/r600_state_common.c
fa677b
--- mesa-20160225/src/gallium/drivers/r600/r600_state_common.c.egbe	2016-02-22 21:42:41.000000000 +1000
fa677b
+++ mesa-20160225/src/gallium/drivers/r600/r600_state_common.c	2016-02-25 13:06:47.352154086 +1000
fa677b
@@ -2704,7 +2704,7 @@ uint32_t r600_translate_colorformat(enum
ede8cb
 
ede8cb
 uint32_t r600_colorformat_endian_swap(uint32_t colorformat)
ede8cb
 {
ede8cb
-	if (R600_BIG_ENDIAN) {
ede8cb
+	if (0 && R600_BIG_ENDIAN) {
ede8cb
 		switch(colorformat) {
ede8cb
 		/* 8-bit buffers. */
ede8cb
 		case V_0280A0_COLOR_4_4:
fa677b
diff -up mesa-20160225/src/gallium/drivers/radeon/r600_pipe_common.h.egbe mesa-20160225/src/gallium/drivers/radeon/r600_pipe_common.h
fa677b
--- mesa-20160225/src/gallium/drivers/radeon/r600_pipe_common.h.egbe	2016-02-22 21:42:41.000000000 +1000
fa677b
+++ mesa-20160225/src/gallium/drivers/radeon/r600_pipe_common.h	2016-02-25 13:06:47.352154086 +1000
fa677b
@@ -576,7 +576,7 @@ struct pipe_surface *r600_create_surface
ede8cb
 						struct pipe_resource *texture,
ede8cb
 						const struct pipe_surface *templ,
ede8cb
 						unsigned width, unsigned height);
ede8cb
-unsigned r600_translate_colorswap(enum pipe_format format);
ede8cb
+unsigned r600_translate_colorswap(enum chip_class chip, enum pipe_format format);
ede8cb
 void evergreen_do_fast_color_clear(struct r600_common_context *rctx,
ede8cb
 				   struct pipe_framebuffer_state *fb,
ede8cb
 				   struct r600_atom *fb_state,
fa677b
diff -up mesa-20160225/src/gallium/drivers/radeon/r600_texture.c.egbe mesa-20160225/src/gallium/drivers/radeon/r600_texture.c
fa677b
--- mesa-20160225/src/gallium/drivers/radeon/r600_texture.c.egbe	2016-02-22 21:42:41.000000000 +1000
fa677b
+++ mesa-20160225/src/gallium/drivers/radeon/r600_texture.c	2016-02-25 13:07:22.903127421 +1000
fa677b
@@ -1252,10 +1252,215 @@ static void r600_surface_destroy(struct
ede8cb
 	FREE(surface);
ede8cb
 }
ede8cb
 
ede8cb
-unsigned r600_translate_colorswap(enum pipe_format format)
ede8cb
+static uint32_t evergreen_translate_colorswap(enum pipe_format format)
ede8cb
+{
ede8cb
+	switch (format) {
ede8cb
+	/* 8-bit buffers. */
ede8cb
+	case PIPE_FORMAT_A8_UNORM:
ede8cb
+	case PIPE_FORMAT_A8_SNORM:
ede8cb
+	case PIPE_FORMAT_A8_UINT:
ede8cb
+	case PIPE_FORMAT_A8_SINT:
ede8cb
+	case PIPE_FORMAT_A16_UNORM:
ede8cb
+	case PIPE_FORMAT_A16_SNORM:
ede8cb
+	case PIPE_FORMAT_A16_UINT:
ede8cb
+	case PIPE_FORMAT_A16_SINT:
ede8cb
+	case PIPE_FORMAT_A16_FLOAT:
ede8cb
+	case PIPE_FORMAT_A32_UINT:
ede8cb
+	case PIPE_FORMAT_A32_SINT:
ede8cb
+	case PIPE_FORMAT_A32_FLOAT:
ede8cb
+	case PIPE_FORMAT_R4A4_UNORM:
ede8cb
+		return V_0280A0_SWAP_ALT_REV;
ede8cb
+	case PIPE_FORMAT_I8_UNORM:
ede8cb
+	case PIPE_FORMAT_I8_SNORM:
ede8cb
+	case PIPE_FORMAT_I8_UINT:
ede8cb
+	case PIPE_FORMAT_I8_SINT:
ede8cb
+	case PIPE_FORMAT_L8_UNORM:
ede8cb
+	case PIPE_FORMAT_L8_SNORM:
ede8cb
+	case PIPE_FORMAT_L8_UINT:
ede8cb
+	case PIPE_FORMAT_L8_SINT:
ede8cb
+	case PIPE_FORMAT_L8_SRGB:
ede8cb
+	case PIPE_FORMAT_L16_UNORM:
ede8cb
+	case PIPE_FORMAT_L16_SNORM:
ede8cb
+	case PIPE_FORMAT_L16_UINT:
ede8cb
+	case PIPE_FORMAT_L16_SINT:
ede8cb
+	case PIPE_FORMAT_L16_FLOAT:
ede8cb
+	case PIPE_FORMAT_L32_UINT:
ede8cb
+	case PIPE_FORMAT_L32_SINT:
ede8cb
+	case PIPE_FORMAT_L32_FLOAT:
ede8cb
+	case PIPE_FORMAT_I16_UNORM:
ede8cb
+	case PIPE_FORMAT_I16_SNORM:
ede8cb
+	case PIPE_FORMAT_I16_UINT:
ede8cb
+	case PIPE_FORMAT_I16_SINT:
ede8cb
+	case PIPE_FORMAT_I16_FLOAT:
ede8cb
+	case PIPE_FORMAT_I32_UINT:
ede8cb
+	case PIPE_FORMAT_I32_SINT:
ede8cb
+	case PIPE_FORMAT_I32_FLOAT:
ede8cb
+	case PIPE_FORMAT_R8_UNORM:
ede8cb
+	case PIPE_FORMAT_R8_SNORM:
ede8cb
+	case PIPE_FORMAT_R8_UINT:
ede8cb
+	case PIPE_FORMAT_R8_SINT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_L4A4_UNORM:
ede8cb
+	case PIPE_FORMAT_A4R4_UNORM:
ede8cb
+		return V_0280A0_SWAP_ALT;
ede8cb
+
ede8cb
+	/* 16-bit buffers. */
ede8cb
+	case PIPE_FORMAT_B5G6R5_UNORM:
ede8cb
+		return V_0280A0_SWAP_STD_REV;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_B5G5R5A1_UNORM:
ede8cb
+	case PIPE_FORMAT_B5G5R5X1_UNORM:
ede8cb
+		return V_0280A0_SWAP_ALT;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_B4G4R4A4_UNORM:
ede8cb
+	case PIPE_FORMAT_B4G4R4X4_UNORM:
ede8cb
+		return V_0280A0_SWAP_ALT;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_Z16_UNORM:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_L8A8_UNORM:
ede8cb
+	case PIPE_FORMAT_L8A8_SNORM:
ede8cb
+	case PIPE_FORMAT_L8A8_UINT:
ede8cb
+	case PIPE_FORMAT_L8A8_SINT:
ede8cb
+	case PIPE_FORMAT_L8A8_SRGB:
ede8cb
+	case PIPE_FORMAT_L16A16_UNORM:
ede8cb
+	case PIPE_FORMAT_L16A16_SNORM:
ede8cb
+	case PIPE_FORMAT_L16A16_UINT:
ede8cb
+	case PIPE_FORMAT_L16A16_SINT:
ede8cb
+	case PIPE_FORMAT_L16A16_FLOAT:
ede8cb
+	case PIPE_FORMAT_L32A32_UINT:
ede8cb
+	case PIPE_FORMAT_L32A32_SINT:
ede8cb
+	case PIPE_FORMAT_L32A32_FLOAT:
ede8cb
+        case PIPE_FORMAT_R8A8_UNORM:
ede8cb
+	case PIPE_FORMAT_R8A8_SNORM:
ede8cb
+	case PIPE_FORMAT_R8A8_UINT:
ede8cb
+	case PIPE_FORMAT_R8A8_SINT:
ede8cb
+	case PIPE_FORMAT_R16A16_UNORM:
ede8cb
+	case PIPE_FORMAT_R16A16_SNORM:
ede8cb
+	case PIPE_FORMAT_R16A16_UINT:
ede8cb
+	case PIPE_FORMAT_R16A16_SINT:
ede8cb
+	case PIPE_FORMAT_R16A16_FLOAT:
ede8cb
+	case PIPE_FORMAT_R32A32_UINT:
ede8cb
+	case PIPE_FORMAT_R32A32_SINT:
ede8cb
+	case PIPE_FORMAT_R32A32_FLOAT:
ede8cb
+		return V_0280A0_SWAP_ALT;
ede8cb
+	case PIPE_FORMAT_R8G8_UNORM:
ede8cb
+	case PIPE_FORMAT_R8G8_SNORM:
ede8cb
+	case PIPE_FORMAT_R8G8_UINT:
ede8cb
+	case PIPE_FORMAT_R8G8_SINT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_R16_UNORM:
ede8cb
+	case PIPE_FORMAT_R16_SNORM:
ede8cb
+	case PIPE_FORMAT_R16_UINT:
ede8cb
+	case PIPE_FORMAT_R16_SINT:
ede8cb
+	case PIPE_FORMAT_R16_FLOAT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	/* 32-bit buffers. */
ede8cb
+
ede8cb
+	case PIPE_FORMAT_A8B8G8R8_SRGB:
ede8cb
+		return V_0280A0_SWAP_STD_REV;
ede8cb
+	case PIPE_FORMAT_B8G8R8A8_SRGB:
ede8cb
+		return V_0280A0_SWAP_ALT;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_B8G8R8A8_UNORM:
ede8cb
+	case PIPE_FORMAT_B8G8R8X8_UNORM:
ede8cb
+		return V_0280A0_SWAP_ALT;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_A8R8G8B8_UNORM:
ede8cb
+	case PIPE_FORMAT_X8R8G8B8_UNORM:
ede8cb
+		return V_0280A0_SWAP_ALT_REV;
ede8cb
+	case PIPE_FORMAT_R8G8B8A8_SNORM:
ede8cb
+	case PIPE_FORMAT_R8G8B8A8_UNORM:
ede8cb
+	case PIPE_FORMAT_R8G8B8X8_UNORM:
ede8cb
+	case PIPE_FORMAT_R8G8B8X8_SNORM:
ede8cb
+	case PIPE_FORMAT_R8G8B8X8_SRGB:
ede8cb
+	case PIPE_FORMAT_R8G8B8X8_UINT:
ede8cb
+	case PIPE_FORMAT_R8G8B8X8_SINT:
ede8cb
+	case PIPE_FORMAT_R8G8B8A8_SINT:
ede8cb
+	case PIPE_FORMAT_R8G8B8A8_UINT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_A8B8G8R8_UNORM:
ede8cb
+	case PIPE_FORMAT_X8B8G8R8_UNORM:
ede8cb
+	/* case PIPE_FORMAT_R8SG8SB8UX8U_NORM: */
ede8cb
+		return V_0280A0_SWAP_STD_REV;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_Z24X8_UNORM:
ede8cb
+	case PIPE_FORMAT_Z24_UNORM_S8_UINT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_R10G10B10A2_UNORM:
ede8cb
+	case PIPE_FORMAT_R10G10B10X2_SNORM:
ede8cb
+	case PIPE_FORMAT_R10SG10SB10SA2U_NORM:
ede8cb
+	case PIPE_FORMAT_R10G10B10A2_UINT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_B10G10R10A2_UNORM:
ede8cb
+	case PIPE_FORMAT_B10G10R10A2_UINT:
ede8cb
+	case PIPE_FORMAT_B10G10R10X2_UNORM:
ede8cb
+		return V_0280A0_SWAP_ALT;
ede8cb
+
ede8cb
+	case PIPE_FORMAT_R11G11B10_FLOAT:
ede8cb
+	case PIPE_FORMAT_R16G16_UNORM:
ede8cb
+	case PIPE_FORMAT_R16G16_SNORM:
ede8cb
+	case PIPE_FORMAT_R16G16_FLOAT:
ede8cb
+	case PIPE_FORMAT_R16G16_UINT:
ede8cb
+	case PIPE_FORMAT_R16G16_SINT:
ede8cb
+	case PIPE_FORMAT_R32_UINT:
ede8cb
+	case PIPE_FORMAT_R32_SINT:
ede8cb
+	case PIPE_FORMAT_R32_FLOAT:
ede8cb
+	case PIPE_FORMAT_Z32_FLOAT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+
ede8cb
+	/* 64-bit buffers. */
ede8cb
+	case PIPE_FORMAT_R32G32_FLOAT:
ede8cb
+	case PIPE_FORMAT_R32G32_UINT:
ede8cb
+	case PIPE_FORMAT_R32G32_SINT:
ede8cb
+	case PIPE_FORMAT_R16G16B16A16_UNORM:
ede8cb
+	case PIPE_FORMAT_R16G16B16A16_SNORM:
ede8cb
+	case PIPE_FORMAT_R16G16B16A16_UINT:
ede8cb
+	case PIPE_FORMAT_R16G16B16A16_SINT:
ede8cb
+	case PIPE_FORMAT_R16G16B16A16_FLOAT:
ede8cb
+	case PIPE_FORMAT_R16G16B16X16_UNORM:
ede8cb
+	case PIPE_FORMAT_R16G16B16X16_SNORM:
ede8cb
+	case PIPE_FORMAT_R16G16B16X16_FLOAT:
ede8cb
+	case PIPE_FORMAT_R16G16B16X16_UINT:
ede8cb
+	case PIPE_FORMAT_R16G16B16X16_SINT:
ede8cb
+	case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
ede8cb
+
ede8cb
+	/* 128-bit buffers. */
ede8cb
+	case PIPE_FORMAT_R32G32B32A32_FLOAT:
ede8cb
+	case PIPE_FORMAT_R32G32B32A32_SNORM:
ede8cb
+	case PIPE_FORMAT_R32G32B32A32_UNORM:
ede8cb
+	case PIPE_FORMAT_R32G32B32A32_SINT:
ede8cb
+	case PIPE_FORMAT_R32G32B32A32_UINT:
ede8cb
+	case PIPE_FORMAT_R32G32B32X32_FLOAT:
ede8cb
+	case PIPE_FORMAT_R32G32B32X32_UINT:
ede8cb
+	case PIPE_FORMAT_R32G32B32X32_SINT:
ede8cb
+		return V_0280A0_SWAP_STD;
ede8cb
+	default:
ede8cb
+		R600_ERR("unsupported colorswap format %d\n", format);
ede8cb
+		return ~0U;
ede8cb
+	}
ede8cb
+	return ~0U;
ede8cb
+}
ede8cb
+
ede8cb
+unsigned r600_translate_colorswap(enum chip_class chip, enum pipe_format format)
ede8cb
 {
ede8cb
 	const struct util_format_description *desc = util_format_description(format);
ede8cb
 
ede8cb
+#ifdef PIPE_ARCH_BIG_ENDIAN
ede8cb
+	if (chip == EVERGREEN) {
ede8cb
+	    unsigned ret = evergreen_translate_colorswap(format);
ede8cb
+	    if (ret != ~0U)
ede8cb
+		return ret;
ede8cb
+	}
ede8cb
+#endif
ede8cb
+
ede8cb
 #define HAS_SWIZZLE(chan,swz) (desc->swizzle[chan] == UTIL_FORMAT_SWIZZLE_##swz)
ede8cb
 
ede8cb
 	if (format == PIPE_FORMAT_R11G11B10_FLOAT) /* isn't plain */
fa677b
@@ -1411,6 +1616,10 @@ void evergreen_do_fast_color_clear(struc
fa677b
 	if (rctx->render_cond)
fa677b
 		return;
ede8cb
 
ede8cb
+#ifdef PIPE_ARCH_BIG_ENDIAN
ede8cb
+	return false; /* broken; overkill to just disable them, but */
ede8cb
+#endif
ede8cb
+
fa677b
 	for (i = 0; i < fb->nr_cbufs; i++) {
fa677b
 		struct r600_texture *tex;
fa677b
 		unsigned clear_bit = PIPE_CLEAR_COLOR0 << i;
fa677b
diff -up mesa-20160225/src/gallium/drivers/radeonsi/si_state.c.egbe mesa-20160225/src/gallium/drivers/radeonsi/si_state.c
fa677b
--- mesa-20160225/src/gallium/drivers/radeonsi/si_state.c.egbe	2016-02-22 21:42:41.000000000 +1000
fa677b
+++ mesa-20160225/src/gallium/drivers/radeonsi/si_state.c	2016-02-25 13:06:47.353154114 +1000
fa677b
@@ -1966,7 +1966,7 @@ static bool si_is_vertex_format_supporte
ede8cb
 static bool si_is_colorbuffer_format_supported(enum pipe_format format)
ede8cb
 {
ede8cb
 	return si_translate_colorformat(format) != V_028C70_COLOR_INVALID &&
ede8cb
-		r600_translate_colorswap(format) != ~0U;
ede8cb
+		r600_translate_colorswap(0, format) != ~0U;
ede8cb
 }
ede8cb
 
ede8cb
 static bool si_is_zs_format_supported(enum pipe_format format)
fa677b
@@ -2249,7 +2249,7 @@ static void si_initialize_color_surface(
ede8cb
 		R600_ERR("Invalid CB format: %d, disabling CB.\n", surf->base.format);
ede8cb
 	}
ede8cb
 	assert(format != V_028C70_COLOR_INVALID);
ede8cb
-	swap = r600_translate_colorswap(surf->base.format);
ede8cb
+	swap = r600_translate_colorswap(0, surf->base.format);
ede8cb
 	if (rtex->resource.b.b.usage == PIPE_USAGE_STAGING) {
ede8cb
 		endian = V_028C70_ENDIAN_NONE;
ede8cb
 	} else {