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);
