Mesa (main): panfrost: Handle texturing from AFBC on Valhall

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 1 20:07:15 UTC 2022


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

Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date:   Tue May 17 14:27:44 2022 -0400

panfrost: Handle texturing from AFBC on Valhall

We need to pack special AFBC-specific plane descriptors instead of the generic
plane descriptor. Nothing too fancy here, though.

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

---

 src/panfrost/lib/pan_texture.c | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/src/panfrost/lib/pan_texture.c b/src/panfrost/lib/pan_texture.c
index 91c29b53b62..446fffe234c 100644
--- a/src/panfrost/lib/pan_texture.c
+++ b/src/panfrost/lib/pan_texture.c
@@ -344,6 +344,23 @@ panfrost_clump_format(enum pipe_format format)
         }
 }
 
+static enum mali_afbc_superblock_size
+translate_superblock_size(uint64_t modifier)
+{
+        assert(drm_is_afbc(modifier));
+
+        switch (modifier & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK) {
+        case AFBC_FORMAT_MOD_BLOCK_SIZE_16x16:
+                return MALI_AFBC_SUPERBLOCK_SIZE_16X16;
+        case AFBC_FORMAT_MOD_BLOCK_SIZE_32x8:
+                return MALI_AFBC_SUPERBLOCK_SIZE_32X8;
+        case AFBC_FORMAT_MOD_BLOCK_SIZE_64x4:
+                return MALI_AFBC_SUPERBLOCK_SIZE_64X4;
+        default:
+                unreachable("Invalid superblock size");
+        }
+}
+
 static void
 panfrost_emit_plane(const struct pan_image_layout *layout,
                     enum pipe_format format,
@@ -359,6 +376,8 @@ panfrost_emit_plane(const struct pan_image_layout *layout,
         panfrost_get_surface_strides(layout, level, &row_stride, &surface_stride);
         assert(row_stride >= 0 && surface_stride >= 0 && "negative stride");
 
+        bool afbc = drm_is_afbc(layout->modifier);
+
         pan_pack(payload, PLANE, cfg) {
                 cfg.pointer = pointer;
                 cfg.row_stride = row_stride;
@@ -369,6 +388,8 @@ panfrost_emit_plane(const struct pan_image_layout *layout,
                                    panfrost_get_layer_stride(layout, level);
 
                 if (desc->layout == UTIL_FORMAT_LAYOUT_ASTC) {
+                        assert(!afbc);
+
                         if (desc->block.depth > 1) {
                                 cfg.plane_type = MALI_PLANE_TYPE_ASTC_3D;
                                 cfg.astc._3d.block_width = panfrost_astc_dim_3d(desc->block.width);
@@ -393,14 +414,22 @@ panfrost_emit_plane(const struct pan_image_layout *layout,
                          * yet.
                          */
                         cfg.astc.decode_wide = !srgb;
+                } else if (afbc) {
+                        cfg.plane_type = MALI_PLANE_TYPE_AFBC;
+                        cfg.afbc.superblock_size = translate_superblock_size(layout->modifier);
+                        cfg.afbc.ytr = (layout->modifier & AFBC_FORMAT_MOD_YTR);
+                        cfg.afbc.tiled_header = (layout->modifier & AFBC_FORMAT_MOD_TILED);
+                        cfg.afbc.prefetch = true;
+                        cfg.afbc.compression_mode = pan_afbc_compression_mode(format);
+                        cfg.afbc.header_stride = layout->slices[level].afbc.header_size;
                 } else {
                         cfg.plane_type = MALI_PLANE_TYPE_GENERIC;
                         cfg.clump_format = panfrost_clump_format(format);
                 }
 
-                if (layout->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED)
+                if (!afbc && layout->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED)
                         cfg.clump_ordering = MALI_CLUMP_ORDERING_TILED_U_INTERLEAVED;
-                else
+                else if (!afbc)
                         cfg.clump_ordering = MALI_CLUMP_ORDERING_LINEAR;
         }
 }



More information about the mesa-commit mailing list