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

Author: Alyssa Rosenzweig <[email protected]>
Date:   Wed May  4 08:14:37 2022 -0400

panfrost: Extract afbc_stride_blocks helper

Let's keep all the AFBC computations inside the layout code, to keep pan_cs
dumb. This helper will need some extension for tiled AFBC.

Signed-off-by: Alyssa Rosenzweig <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16697>

---

 src/panfrost/lib/pan_cs.c      |  6 ++----
 src/panfrost/lib/pan_layout.c  | 11 +++++++++++
 src/panfrost/lib/pan_texture.h |  2 ++
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/src/panfrost/lib/pan_cs.c b/src/panfrost/lib/pan_cs.c
index ab05585abee..d010dd29f01 100644
--- a/src/panfrost/lib/pan_cs.c
+++ b/src/panfrost/lib/pan_cs.c
@@ -206,8 +206,7 @@ pan_prepare_zs(const struct pan_fb_info *fb,
 #if PAN_ARCH >= 6
                 const struct pan_image_slice_layout *slice = 
&zs->image->layout.slices[level];
 
-                ext->zs_afbc_row_stride = slice->row_stride /
-                                          AFBC_HEADER_BYTES_PER_TILE;
+                ext->zs_afbc_row_stride = 
pan_afbc_stride_blocks(slice->row_stride);
 #else
                 ext->zs_block_format = MALI_BLOCK_FORMAT_AFBC;
                 ext->zs_afbc_body_size = 0x1000;
@@ -448,8 +447,7 @@ pan_prepare_rt(const struct pan_fb_info *fb, unsigned idx,
                 const struct pan_image_slice_layout *slice = 
&rt->image->layout.slices[level];
 
 #if PAN_ARCH >= 6
-                cfg->afbc.row_stride = slice->row_stride /
-                                       AFBC_HEADER_BYTES_PER_TILE;
+                cfg->afbc.row_stride = 
pan_afbc_stride_blocks(slice->row_stride);
                 cfg->afbc.afbc_wide_block_enable =
                         panfrost_afbc_is_wide(rt->image->layout.modifier);
 #else
diff --git a/src/panfrost/lib/pan_layout.c b/src/panfrost/lib/pan_layout.c
index ee135f2a511..977f68874d3 100644
--- a/src/panfrost/lib/pan_layout.c
+++ b/src/panfrost/lib/pan_layout.c
@@ -130,6 +130,17 @@ panfrost_block_size(uint64_t modifier, enum pipe_format 
format)
                 return (struct pan_block_size) { 1, 1 };
 }
 
+/*
+ * Determine the number of header blocks between header rows. This is equal to
+ * the number of bytes between header rows divided by the bytes per blocks of a
+ * header tile
+ */
+uint32_t
+pan_afbc_stride_blocks(uint32_t row_stride_bytes)
+{
+        return row_stride_bytes / AFBC_HEADER_BYTES_PER_TILE;
+}
+
 /* Computes sizes for checksumming, which is 8 bytes per 16x16 tile.
  * Checksumming is believed to be a CRC variant (CRC64 based on the size?).
  * This feature is also known as "transaction elimination". */
diff --git a/src/panfrost/lib/pan_texture.h b/src/panfrost/lib/pan_texture.h
index c44777f7534..0d963d4c206 100644
--- a/src/panfrost/lib/pan_texture.h
+++ b/src/panfrost/lib/pan_texture.h
@@ -194,6 +194,8 @@ unsigned panfrost_afbc_superblock_height(uint64_t modifier);
 
 unsigned panfrost_afbc_is_wide(uint64_t modifier);
 
+uint32_t pan_afbc_stride_blocks(uint32_t row_stride_bytes);
+
 struct pan_block_size
 panfrost_block_size(uint64_t modifier, enum pipe_format format);
 

Reply via email to