Mesa (main): panfrost: Add Valhall compressed formats

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Mar 30 17:48:28 UTC 2022


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

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Sun Mar 13 17:27:28 2022 -0400

panfrost: Add Valhall compressed formats

We need to map to the interchange format, since there is no longer a pixel
format for the memory layout. Use this new format table on v9.

Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15586>

---

 src/panfrost/lib/meson.build  |   2 +-
 src/panfrost/lib/pan_format.c | 108 ++++++++++++++++++++++++++++++++++++++++++
 src/panfrost/lib/pan_format.h |   2 +
 src/panfrost/lib/pan_props.c  |   4 +-
 4 files changed, 114 insertions(+), 2 deletions(-)

diff --git a/src/panfrost/lib/meson.build b/src/panfrost/lib/meson.build
index 298229bf3e1..0c0f0e62d7b 100644
--- a/src/panfrost/lib/meson.build
+++ b/src/panfrost/lib/meson.build
@@ -21,7 +21,7 @@
 
 subdir('genxml')
 
-pixel_format_versions = ['6', '7']
+pixel_format_versions = ['6', '7', '9']
 libpanfrost_pixel_format = []
 
 foreach ver : pixel_format_versions
diff --git a/src/panfrost/lib/pan_format.c b/src/panfrost/lib/pan_format.c
index 1d6ba97e88b..387e150a455 100644
--- a/src/panfrost/lib/pan_format.c
+++ b/src/panfrost/lib/pan_format.c
@@ -171,6 +171,8 @@ GENX(panfrost_blendable_formats)[PIPE_FORMAT_COUNT] = {
 
 const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = {
         FMT(NONE,                    CONSTANT,        0000, L, VTR_),
+
+#if PAN_ARCH <= 7
         FMT(ETC1_RGB8,               ETC2_RGB8,       RGB1, L, _T__),
         FMT(ETC2_RGB8,               ETC2_RGB8,       RGB1, L, _T__),
         FMT(ETC2_SRGB8,              ETC2_RGB8,       RGB1, S, _T__),
@@ -246,6 +248,92 @@ const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = {
         FMT(ASTC_6x5x5_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
         FMT(ASTC_6x6x5_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
         FMT(ASTC_6x6x6_SRGB,         ASTC_3D_LDR,     RGBA, S, _T__),
+#else
+        /* Map to interchange format, as compression is specified in the plane
+         * descriptor on Valhall.
+         */
+        FMT(ETC1_RGB8,               RGBA8_UNORM,     RGB1, L, _T__),
+        FMT(ETC2_RGB8,               RGBA8_UNORM,     RGB1, L, _T__),
+        FMT(ETC2_SRGB8,              RGBA8_UNORM,     RGB1, S, _T__),
+        FMT(ETC2_R11_UNORM,          R16_UNORM,       R001, L, _T__),
+        FMT(ETC2_RGBA8,              RGBA8_UNORM,     RGBA, L, _T__),
+        FMT(ETC2_SRGBA8,             RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ETC2_RG11_UNORM,         RG16_UNORM,      RG01, L, _T__),
+        FMT(ETC2_R11_SNORM,          R16_SNORM,       R001, L, _T__),
+        FMT(ETC2_RG11_SNORM,         RG16_SNORM,      RG01, L, _T__),
+        FMT(ETC2_RGB8A1,             RGBA8_UNORM,     RGBA, L, _T__),
+        FMT(ETC2_SRGB8A1,            RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(DXT1_RGB,                RGBA8_UNORM,     RGB1, L, _T__),
+        FMT(DXT1_RGBA,               RGBA8_UNORM,     RGBA, L, _T__),
+        FMT(DXT1_SRGB,               RGBA8_UNORM,     RGB1, S, _T__),
+        FMT(DXT1_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(DXT3_RGBA,               RGBA8_UNORM,     RGBA, L, _T__),
+        FMT(DXT3_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(DXT5_RGBA,               RGBA8_UNORM,     RGBA, L, _T__),
+        FMT(DXT5_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(RGTC1_UNORM,             R16_UNORM,       R001, L, _T__),
+        FMT(RGTC1_SNORM,             R16_SNORM,       R001, L, _T__),
+        FMT(RGTC2_UNORM,             RG16_UNORM,      RG01, L, _T__),
+        FMT(RGTC2_SNORM,             RG16_SNORM,      RG01, L, _T__),
+        FMT(BPTC_RGB_FLOAT,          RGBA16F,         RGB1, L, _T__),
+        FMT(BPTC_RGB_UFLOAT,         RGBA16F,         RGB1, L, _T__),
+        FMT(BPTC_RGBA_UNORM,         RGBA8_UNORM,     RGBA, L, _T__),
+        FMT(BPTC_SRGBA,              RGBA8_UNORM,     RGBA, S, _T__),
+
+        /* Mesa does not yet support astc_decode_mode extensions, so non-sRGB
+         * formats must be assumed to be wide.
+         */
+        FMT(ASTC_4x4,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_5x4,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_5x5,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_6x5,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_6x6,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_8x5,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_8x6,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_8x8,                RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_10x5,               RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_10x6,               RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_10x8,               RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_10x10,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_12x10,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_12x12,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_3x3x3,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_4x3x3,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_4x4x3,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_4x4x4,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_5x4x4,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_5x5x4,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_5x5x5,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_6x5x5,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_6x6x5,              RGBA16F,         RGBA, L, _T__),
+        FMT(ASTC_6x6x6,              RGBA16F,         RGBA, L, _T__),
+
+        /* By definition, sRGB formats are narrow */
+        FMT(ASTC_4x4_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_5x4_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_5x5_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_6x5_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_6x6_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_8x5_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_8x6_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_8x8_SRGB,           RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_10x5_SRGB,          RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_10x6_SRGB,          RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_10x8_SRGB,          RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_10x10_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_12x10_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_12x12_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_3x3x3_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_4x3x3_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_4x4x3_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_4x4x4_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_5x4x4_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_5x5x4_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_5x5x5_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_6x5x5_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+        FMT(ASTC_6x6x5_SRGB,         RGBA8_UNORM,     RGBA, S, _T__),
+#endif
+
         FMT(R5G6B5_UNORM,            RGB565,          RGB1, L, VTR_),
         FMT(B5G6R5_UNORM,            RGB565,          BGR1, L, VTR_),
         FMT(R5G5B5X1_UNORM,          RGB5_A1_UNORM,   RGB1, L, VT__),
@@ -466,13 +554,33 @@ const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = {
         FMT(Z24_UNORM_S8_UINT,       Z24X8_UNORM,     RGBA, L, _T_Z),
         FMT(Z24X8_UNORM,             Z24X8_UNORM,     RGBA, L, _T_Z),
         FMT(Z32_FLOAT,               R32F,            RGBA, L, _T_Z),
+
+#if PAN_ARCH >= 9
+        /* Specify interchange formats, the actual format for depth/stencil is
+         * determined by the plane descriptor on Valhall.
+         *
+         * On Valhall, S8 logically acts like "X8S8", so "S8 RGBA" is logically
+         * "0s00" and "S8 GRBA" is logically "s000". For backwards compatibility
+         * we want stencil in the green channel, so we use the RGBA swizzles on
+         * Valhall despite the GRBA swizzles on Bifrost.
+         */
+        FMT(Z32_FLOAT_S8X24_UINT,    R32F,            RGBA, L, _T_Z),
+        FMT(X32_S8X24_UINT,          S8,              RGBA, L, _T__),
+        FMT(X24S8_UINT,              S8,              RGBA, L, _T_Z),
+        FMT(S8_UINT,                 S8,              RGBA, L, _T__),
+
+#else
+        /* Specify real formats on Bifrost */
         FMT(Z32_FLOAT_S8X24_UINT,    Z32_X32,         RGBA, L, _T_Z),
         FMT(X32_S8X24_UINT,          X32_S8X24,       GRBA, L, _T__),
         FMT(X24S8_UINT,              X24S8,           GRBA, L, _T_Z),
         FMT(S8_UINT,                 S8,              GRBA, L, _T__),
 
+        /* Obsolete formats removed in Valhall */
         FMT(A8_UNORM,                A8_UNORM,        000A, L, VTR_),
         FMT(L8A8_UNORM,              R8A8_UNORM,      RRRA, L, VTR_),
         FMT(L8A8_SRGB,               R8A8_UNORM,      RRRA, S, VTR_),
 #endif
+
+#endif
 };
diff --git a/src/panfrost/lib/pan_format.h b/src/panfrost/lib/pan_format.h
index b8a505706b1..547e009bb2b 100644
--- a/src/panfrost/lib/pan_format.h
+++ b/src/panfrost/lib/pan_format.h
@@ -51,8 +51,10 @@ struct pan_blendable_format {
 
 extern const struct pan_blendable_format panfrost_blendable_formats_v6[PIPE_FORMAT_COUNT];
 extern const struct pan_blendable_format panfrost_blendable_formats_v7[PIPE_FORMAT_COUNT];
+extern const struct pan_blendable_format panfrost_blendable_formats_v9[PIPE_FORMAT_COUNT];
 extern const struct panfrost_format panfrost_pipe_format_v6[PIPE_FORMAT_COUNT];
 extern const struct panfrost_format panfrost_pipe_format_v7[PIPE_FORMAT_COUNT];
+extern const struct panfrost_format panfrost_pipe_format_v9[PIPE_FORMAT_COUNT];
 
 /* Helpers to construct swizzles */
 
diff --git a/src/panfrost/lib/pan_props.c b/src/panfrost/lib/pan_props.c
index b5ef6bdb9d3..693b475beb5 100644
--- a/src/panfrost/lib/pan_props.c
+++ b/src/panfrost/lib/pan_props.c
@@ -271,8 +271,10 @@ panfrost_open_device(void *memctx, int fd, struct panfrost_device *dev)
 
         if (dev->arch <= 6)
                 dev->formats = panfrost_pipe_format_v6;
-        else
+        else if (dev->arch <= 7)
                 dev->formats = panfrost_pipe_format_v7;
+        else
+                dev->formats = panfrost_pipe_format_v9;
 
         util_sparse_array_init(&dev->bo_map, sizeof(struct panfrost_bo), 512);
 



More information about the mesa-commit mailing list