Mesa (main): panfrost: Add afbc_superblock_{size, width, height} helpers
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Apr 26 18:19:26 UTC 2022
Module: Mesa
Branch: main
Commit: 36449bdcdcdce8967cb6fc2c9f4dd66a5f974a43
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=36449bdcdcdce8967cb6fc2c9f4dd66a5f974a43
Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date: Sat Apr 16 10:23:33 2022 -0400
panfrost: Add afbc_superblock_{size, width, height} helpers
...and use them to implement block_dim transitionally.
These should be clearer than the general block_dim.
Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15991>
---
src/panfrost/lib/pan_layout.c | 62 ++++++++++++++++++++++++++++++++++--------
src/panfrost/lib/pan_texture.h | 18 ++++++++++++
2 files changed, 68 insertions(+), 12 deletions(-)
diff --git a/src/panfrost/lib/pan_layout.c b/src/panfrost/lib/pan_layout.c
index 7dfec7bb827..18c8a9dc289 100644
--- a/src/panfrost/lib/pan_layout.c
+++ b/src/panfrost/lib/pan_layout.c
@@ -45,6 +45,50 @@ uint64_t pan_best_modifiers[PAN_MODIFIER_COUNT] = {
DRM_FORMAT_MOD_LINEAR
};
+/* Table of AFBC superblock sizes */
+static const struct pan_block_size
+afbc_superblock_sizes[] = {
+ [AFBC_FORMAT_MOD_BLOCK_SIZE_16x16] = { 16, 16 },
+ [AFBC_FORMAT_MOD_BLOCK_SIZE_32x8] = { 32, 8 },
+ [AFBC_FORMAT_MOD_BLOCK_SIZE_64x4] = { 64, 4 },
+};
+
+/*
+ * Given an AFBC modifier, return the superblock size.
+ *
+ * We do not yet have any use cases for multiplanar YCBCr formats with different
+ * superblock sizes on the luma and chroma planes. These formats are unsupported
+ * for now.
+ */
+struct pan_block_size
+panfrost_afbc_superblock_size(uint64_t modifier)
+{
+ unsigned index = (modifier & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK);
+
+ assert(drm_is_afbc(modifier));
+ assert(index < ARRAY_SIZE(afbc_superblock_sizes));
+
+ return afbc_superblock_sizes[index];
+}
+
+/*
+ * Given an AFBC modifier, return the width of the superblock.
+ */
+unsigned
+panfrost_afbc_superblock_width(uint64_t modifier)
+{
+ return panfrost_afbc_superblock_size(modifier).width;
+}
+
+/*
+ * Given an AFBC modifier, return the height of the superblock.
+ */
+unsigned
+panfrost_afbc_superblock_height(uint64_t modifier)
+{
+ return panfrost_afbc_superblock_size(modifier).height;
+}
+
/* If not explicitly, line stride is calculated for block-based formats as
* (ceil(width / block_width) * block_size). As a special case, this is left
* zero if there is only a single block vertically. So, we have a helper to
@@ -60,18 +104,12 @@ panfrost_block_dim(uint64_t modifier, bool width, unsigned plane)
return 16;
}
- switch (modifier & AFBC_FORMAT_MOD_BLOCK_SIZE_MASK) {
- case AFBC_FORMAT_MOD_BLOCK_SIZE_16x16:
- return 16;
- case AFBC_FORMAT_MOD_BLOCK_SIZE_32x8:
- return width ? 32 : 8;
- case AFBC_FORMAT_MOD_BLOCK_SIZE_64x4:
- return width ? 64 : 4;
- case AFBC_FORMAT_MOD_BLOCK_SIZE_32x8_64x4:
- return plane ? (width ? 64 : 4) : (width ? 32 : 8);
- default:
- unreachable("Invalid AFBC block size");
- }
+ assert(plane == 0 && "multiplanar formats not supported");
+
+ if (width)
+ return panfrost_afbc_superblock_width(modifier);
+ else
+ return panfrost_afbc_superblock_height(modifier);
}
/* Computes sizes for checksumming, which is 8 bytes per 16x16 tile.
diff --git a/src/panfrost/lib/pan_texture.h b/src/panfrost/lib/pan_texture.h
index 82571216e27..8a60e07cf31 100644
--- a/src/panfrost/lib/pan_texture.h
+++ b/src/panfrost/lib/pan_texture.h
@@ -159,6 +159,24 @@ panfrost_afbc_header_size(unsigned width, unsigned height);
bool
panfrost_afbc_can_ytr(enum pipe_format format);
+/*
+ * Represents the block size of a single plane. For AFBC, this represents the
+ * superblock size. For u-interleaving, this represents the tile size.
+ */
+struct pan_block_size {
+ /** Width of block */
+ unsigned width;
+
+ /** Height of blocks */
+ unsigned height;
+};
+
+struct pan_block_size panfrost_afbc_superblock_size(uint64_t modifier);
+
+unsigned panfrost_afbc_superblock_width(uint64_t modifier);
+
+unsigned panfrost_afbc_superblock_height(uint64_t modifier);
+
unsigned
panfrost_block_dim(uint64_t modifier, bool width, unsigned plane);
More information about the mesa-commit
mailing list