Module: Mesa
Branch: main
Commit: 7147313d0a1e06d149e9db42e4ae4115c9081644
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=7147313d0a1e06d149e9db42e4ae4115c9081644

Author: Asahi Lina <[email protected]>
Date:   Sun Jun 19 04:02:24 2022 +0900

asahi: Support XRGB formats

Just treat them like ARGB. Not sure if this is sane, but it works for now...

Signed-off-by: Asahi Lina <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19606>

---

 src/asahi/lib/agx_formats.c           | 12 ++++++++++++
 src/gallium/drivers/asahi/agx_state.c |  8 ++++----
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/asahi/lib/agx_formats.c b/src/asahi/lib/agx_formats.c
index 3b6db88215e..81a713adcd8 100644
--- a/src/asahi/lib/agx_formats.c
+++ b/src/asahi/lib/agx_formats.c
@@ -43,6 +43,10 @@ const struct agx_pixel_format_entry 
agx_pixel_format[PIPE_FORMAT_COUNT] = {
    AGX_FMT(A8R8G8B8_UNORM,          R8G8B8A8,      UNORM,  T, U8NORM),
    AGX_FMT(A8B8G8R8_UNORM,          R8G8B8A8,      UNORM,  T, U8NORM),
    AGX_FMT(B8G8R8A8_UNORM,          R8G8B8A8,      UNORM,  T, U8NORM),
+   AGX_FMT(R8G8B8X8_UNORM,          R8G8B8A8,      UNORM,  T, U8NORM),
+   AGX_FMT(X8R8G8B8_UNORM,          R8G8B8A8,      UNORM,  T, U8NORM),
+   AGX_FMT(X8B8G8R8_UNORM,          R8G8B8A8,      UNORM,  T, U8NORM),
+   AGX_FMT(B8G8R8X8_UNORM,          R8G8B8A8,      UNORM,  T, U8NORM),
 
    AGX_FMT(R16_UNORM,               R16,           UNORM,  T, U16NORM),
    AGX_FMT(R16G16_UNORM,            R16G16,        UNORM,  T, U16NORM),
@@ -54,6 +58,10 @@ const struct agx_pixel_format_entry 
agx_pixel_format[PIPE_FORMAT_COUNT] = {
    AGX_FMT(A8R8G8B8_SRGB,           R8G8B8A8,      UNORM,  T, SRGBA8),
    AGX_FMT(A8B8G8R8_SRGB,           R8G8B8A8,      UNORM,  T, SRGBA8),
    AGX_FMT(B8G8R8A8_SRGB,           R8G8B8A8,      UNORM,  T, SRGBA8),
+   AGX_FMT(R8G8B8X8_SRGB,           R8G8B8A8,      UNORM,  T, SRGBA8),
+   AGX_FMT(X8R8G8B8_SRGB,           R8G8B8A8,      UNORM,  T, SRGBA8),
+   AGX_FMT(X8B8G8R8_SRGB,           R8G8B8A8,      UNORM,  T, SRGBA8),
+   AGX_FMT(B8G8R8X8_SRGB,           R8G8B8A8,      UNORM,  T, SRGBA8),
 
    AGX_FMT(R8_SNORM,                R8,            SNORM,  T, S8NORM),
    AGX_FMT(R8G8_SNORM,              R8G8,          SNORM,  T, S8NORM),
@@ -61,6 +69,10 @@ const struct agx_pixel_format_entry 
agx_pixel_format[PIPE_FORMAT_COUNT] = {
    AGX_FMT(A8R8G8B8_SNORM,          R8G8B8A8,      SNORM,  T, S8NORM),
    AGX_FMT(A8B8G8R8_SNORM,          R8G8B8A8,      SNORM,  T, S8NORM),
    AGX_FMT(B8G8R8A8_SNORM,          R8G8B8A8,      SNORM,  T, S8NORM),
+   AGX_FMT(R8G8B8X8_SNORM,          R8G8B8A8,      SNORM,  T, S8NORM),
+   AGX_FMT(X8R8G8B8_SNORM,          R8G8B8A8,      SNORM,  T, S8NORM),
+   AGX_FMT(X8B8G8R8_SNORM,          R8G8B8A8,      SNORM,  T, S8NORM),
+   AGX_FMT(B8G8R8X8_SNORM,          R8G8B8A8,      SNORM,  T, S8NORM),
 
    AGX_FMT(R16_FLOAT,               R16,           FLOAT,  T, F16),
    AGX_FMT(R16G16_FLOAT,            R16G16,        FLOAT,  T, F16),
diff --git a/src/gallium/drivers/asahi/agx_state.c 
b/src/gallium/drivers/asahi/agx_state.c
index 085506c8413..e843613d108 100644
--- a/src/gallium/drivers/asahi/agx_state.c
+++ b/src/gallium/drivers/asahi/agx_state.c
@@ -783,16 +783,16 @@ agx_set_framebuffer_state(struct pipe_context *pctx,
          cfg.type = agx_pixel_format[surf->format].type;
 
          assert(desc->nr_channels >= 1 && desc->nr_channels <= 4);
-         cfg.swizzle_r = agx_channel_from_pipe(desc->swizzle[0]);
+         cfg.swizzle_r = agx_channel_from_pipe(desc->swizzle[0]) & 3;
 
          if (desc->nr_channels >= 2)
-            cfg.swizzle_g = agx_channel_from_pipe(desc->swizzle[1]);
+            cfg.swizzle_g = agx_channel_from_pipe(desc->swizzle[1]) & 3;
 
          if (desc->nr_channels >= 3)
-            cfg.swizzle_b = agx_channel_from_pipe(desc->swizzle[2]);
+            cfg.swizzle_b = agx_channel_from_pipe(desc->swizzle[2]) & 3;
 
          if (desc->nr_channels >= 4)
-            cfg.swizzle_a = agx_channel_from_pipe(desc->swizzle[3]);
+            cfg.swizzle_a = agx_channel_from_pipe(desc->swizzle[3]) & 3;
 
          cfg.width = state->width;
          cfg.height = state->height;

Reply via email to