r600g: use do_endian_swap in color swapping functions

For some formats we need to take "do_endian_swap" into account when
configuring swapping for color buffers.

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>
This commit is contained in:
Oded Gabbay 2016-04-21 15:51:40 +03:00
parent 686ad477bd
commit c86c761343
2 changed files with 14 additions and 8 deletions

View File

@ -2639,7 +2639,7 @@ uint32_t r600_translate_colorformat(enum chip_class chip, enum pipe_format forma
return V_0280A0_COLOR_32_32; return V_0280A0_COLOR_32_32;
} }
} else if (HAS_SIZE(8,24,0,0)) { } else if (HAS_SIZE(8,24,0,0)) {
return V_0280A0_COLOR_24_8; return (do_endian_swap ? V_0280A0_COLOR_8_24 : V_0280A0_COLOR_24_8);
} else if (HAS_SIZE(24,8,0,0)) { } else if (HAS_SIZE(24,8,0,0)) {
return V_0280A0_COLOR_8_24; return V_0280A0_COLOR_8_24;
} }

View File

@ -1419,7 +1419,8 @@ unsigned r600_translate_colorswap(enum pipe_format format, bool do_endian_swap)
else if ((HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,X)) || else if ((HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,X)) ||
(HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,NONE)) || (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(1,NONE)) ||
(HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,X))) (HAS_SWIZZLE(0,NONE) && HAS_SWIZZLE(1,X)))
return V_0280A0_SWAP_STD_REV; /* YX__ */ /* YX__ */
return (do_endian_swap ? V_0280A0_SWAP_STD : V_0280A0_SWAP_STD_REV);
else if (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(3,Y)) else if (HAS_SWIZZLE(0,X) && HAS_SWIZZLE(3,Y))
return V_0280A0_SWAP_ALT; /* X__Y */ return V_0280A0_SWAP_ALT; /* X__Y */
else if (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(3,X)) else if (HAS_SWIZZLE(0,Y) && HAS_SWIZZLE(3,X))
@ -1427,20 +1428,25 @@ unsigned r600_translate_colorswap(enum pipe_format format, bool do_endian_swap)
break; break;
case 3: case 3:
if (HAS_SWIZZLE(0,X)) if (HAS_SWIZZLE(0,X))
return V_0280A0_SWAP_STD; /* XYZ */ return (do_endian_swap ? V_0280A0_SWAP_STD_REV : V_0280A0_SWAP_STD);
else if (HAS_SWIZZLE(0,Z)) else if (HAS_SWIZZLE(0,Z))
return V_0280A0_SWAP_STD_REV; /* ZYX */ return V_0280A0_SWAP_STD_REV; /* ZYX */
break; break;
case 4: case 4:
/* check the middle channels, the 1st and 4th channel can be NONE */ /* check the middle channels, the 1st and 4th channel can be NONE */
if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,Z)) if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,Z)) {
return V_0280A0_SWAP_STD; /* XYZW */ return V_0280A0_SWAP_STD; /* XYZW */
else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,Y)) } else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,Y)) {
return V_0280A0_SWAP_STD_REV; /* WZYX */ return V_0280A0_SWAP_STD_REV; /* WZYX */
else if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,X)) } else if (HAS_SWIZZLE(1,Y) && HAS_SWIZZLE(2,X)) {
return V_0280A0_SWAP_ALT; /* ZYXW */ return V_0280A0_SWAP_ALT; /* ZYXW */
else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,W)) } else if (HAS_SWIZZLE(1,Z) && HAS_SWIZZLE(2,W)) {
return V_0280A0_SWAP_ALT_REV; /* YZWX */ /* YZWX */
if (desc->is_array)
return V_0280A0_SWAP_ALT_REV;
else
return (do_endian_swap ? V_0280A0_SWAP_ALT : V_0280A0_SWAP_ALT_REV);
}
break; break;
} }
return ~0U; return ~0U;