Mesa (main): freedreno/a6xx: Add support for A/XRGB1555 formats.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Oct 5 20:44:49 UTC 2021
Module: Mesa
Branch: main
Commit: 38f23b1108cb3d137a7456257bfa18ffe2191ad8
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=38f23b1108cb3d137a7456257bfa18ffe2191ad8
Author: Emma Anholt <emma at anholt.net>
Date: Fri Oct 1 15:43:49 2021 -0700
freedreno/a6xx: Add support for A/XRGB1555 formats.
This switches the format we use by default for GLES's rgb5_a1, and means
that our formats supported more closely matches turnip.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13046>
---
src/freedreno/fdl/fd6_format_table.c | 27 +++++++++++++++++++++++++
src/gallium/drivers/freedreno/a6xx/fd6_format.c | 2 +-
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/src/freedreno/fdl/fd6_format_table.c b/src/freedreno/fdl/fd6_format_table.c
index 62ff3fb595c..8f200db40e1 100644
--- a/src/freedreno/fdl/fd6_format_table.c
+++ b/src/freedreno/fdl/fd6_format_table.c
@@ -120,6 +120,8 @@ static const struct fd6_format formats[PIPE_FORMAT_COUNT] = {
_TC(B5G5R5A1_UNORM, 5_5_5_1_UNORM, WXYZ),
_TC(B5G5R5X1_UNORM, 5_5_5_1_UNORM, WXYZ),
+ _TC(A1R5G5B5_UNORM, 5_5_5_1_UNORM, ZYXW),
+ _TC(A1B5G5R5_UNORM, 5_5_5_1_UNORM, XYZW),
_TC(R4G4B4A4_UNORM, 4_4_4_4_UNORM, WZYX),
_TC(B4G4R4A4_UNORM, 4_4_4_4_UNORM, WXYZ),
@@ -386,12 +388,37 @@ fd6_texture_format(enum pipe_format format, enum a6xx_tile_mode tile_mode)
{
if (!formats[format].present)
return FMT6_NONE;
+
+ /* Linear ARGB/ABGR1555 has a special format for sampling (tiled 1555/5551
+ * formats always have the same swizzle and layout).
+ */
+ if (!tile_mode) {
+ switch (format) {
+ case PIPE_FORMAT_A1R5G5B5_UNORM:
+ case PIPE_FORMAT_A1B5G5R5_UNORM:
+ return FMT6_1_5_5_5_UNORM;
+ default:
+ break;
+ }
+ }
+
return formats[format].tex;
}
enum a3xx_color_swap
fd6_texture_swap(enum pipe_format format, enum a6xx_tile_mode tile_mode)
{
+ if (!tile_mode) {
+ switch (format) {
+ case PIPE_FORMAT_A1R5G5B5_UNORM:
+ return WZYX;
+ case PIPE_FORMAT_A1B5G5R5_UNORM:
+ return WXYZ;
+ default:
+ break;
+ }
+ }
+
return fd6_pipe2swap(format, tile_mode);
}
diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_format.c b/src/gallium/drivers/freedreno/a6xx/fd6_format.c
index c910b91eabb..5007001dc3a 100644
--- a/src/gallium/drivers/freedreno/a6xx/fd6_format.c
+++ b/src/gallium/drivers/freedreno/a6xx/fd6_format.c
@@ -68,7 +68,7 @@ fd6_tex_swiz(enum pipe_format format, enum a6xx_tile_mode tile_mode, unsigned ch
} else if (format == PIPE_FORMAT_R8G8_R8B8_UNORM || format == PIPE_FORMAT_G8R8_B8R8_UNORM) {
unsigned char fswiz[4] = {PIPE_SWIZZLE_Z, PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_1};
util_format_compose_swizzles(fswiz, uswiz, swiz);
- } else if (fd6_texture_swap(format, TILE6_LINEAR) != WZYX) {
+ } else if (fd6_texture_swap(format, TILE6_LINEAR) != WZYX || format == PIPE_FORMAT_A1R5G5B5_UNORM) {
/* Formats with a non-pass-through swap are permutations of RGBA
* formats. We program the permutation using the swap and don't
* need to compose the format swizzle with the user swizzle.
More information about the mesa-commit
mailing list