diff --git a/src/panfrost/lib/pan_cs.c b/src/panfrost/lib/pan_cs.c index d010dd29f01..e3f2be599b8 100644 --- a/src/panfrost/lib/pan_cs.c +++ b/src/panfrost/lib/pan_cs.c @@ -206,7 +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 = pan_afbc_stride_blocks(slice->row_stride); + ext->zs_afbc_row_stride = pan_afbc_stride_blocks(zs->image->layout.modifier, slice->row_stride); #else ext->zs_block_format = MALI_BLOCK_FORMAT_AFBC; ext->zs_afbc_body_size = 0x1000; @@ -447,7 +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 = pan_afbc_stride_blocks(slice->row_stride); + cfg->afbc.row_stride = pan_afbc_stride_blocks(rt->image->layout.modifier, 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 b16a00d420f..db0cfa8d996 100644 --- a/src/panfrost/lib/pan_layout.c +++ b/src/panfrost/lib/pan_layout.c @@ -143,25 +143,30 @@ pan_afbc_tile_size(uint64_t modifier) /* * Determine the number of bytes between header rows for an AFBC image. For an * image with linear headers, this is simply the number of header blocks - * (=superblocks) per row times the numbers of bytes per header block. + * (=superblocks) per row times the numbers of bytes per header block. For an + * image with linear headers, this is multipled by the number of rows of + * header blocks are in a tile together. */ uint32_t pan_afbc_row_stride(uint64_t modifier, uint32_t width) { unsigned block_width = panfrost_afbc_superblock_width(modifier); - return (width / block_width) * AFBC_HEADER_BYTES_PER_TILE; + return (width / block_width) * pan_afbc_tile_size(modifier) * + AFBC_HEADER_BYTES_PER_TILE; } /* * 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 + * header tile. This is also divided by the tile size to give a "line stride" in + * blocks, rather than a real row stride. This is required by Bifrost. */ uint32_t -pan_afbc_stride_blocks(uint32_t row_stride_bytes) +pan_afbc_stride_blocks(uint64_t modifier, uint32_t row_stride_bytes) { - return row_stride_bytes / AFBC_HEADER_BYTES_PER_TILE; + return row_stride_bytes / + (AFBC_HEADER_BYTES_PER_TILE * pan_afbc_tile_size(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 4cf9e6cd36c..a183bd8ce6c 100644 --- a/src/panfrost/lib/pan_texture.h +++ b/src/panfrost/lib/pan_texture.h @@ -196,7 +196,7 @@ bool panfrost_afbc_is_wide(uint64_t modifier); uint32_t pan_afbc_row_stride(uint64_t modifier, uint32_t width); -uint32_t pan_afbc_stride_blocks(uint32_t row_stride_bytes); +uint32_t pan_afbc_stride_blocks(uint64_t modifier, uint32_t row_stride_bytes); struct pan_block_size panfrost_block_size(uint64_t modifier, enum pipe_format format);