panfrost: Support tiled AFBC in stride helpers
Part 1 of tiled AFBC. This requires modifier information. Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16697>
This commit is contained in:
parent
5c86f53112
commit
9c9b7f7a42
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue