panfrost: Increase AFBC body alignment requirement on v6+

AFBC body is required to be aligned on 128 bytes on v6+ hardware.

Cc: mesa-stable
Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Lars-Ivar Hesselberg Simonsen <lars-ivar.simonsen@arm.com>
Reviewed-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Acked-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31948>
This commit is contained in:
Boris Brezillon
2023-10-26 20:58:27 +02:00
committed by Louis-Francis Ratté-Boulianne
parent 45c523104a
commit ca84b1e9b5
4 changed files with 36 additions and 5 deletions

View File

@@ -1651,7 +1651,7 @@ panfrost_pack_afbc(struct panfrost_context *ctx,
dst_slice->afbc.nr_blocks = dst_stride * dst_height;
dst_slice->afbc.header_size =
ALIGN_POT(dst_stride * dst_height * AFBC_HEADER_BYTES_PER_TILE,
pan_afbc_body_align(dst_modifier));
pan_afbc_body_align(dev->arch, dst_modifier));
dst_slice->afbc.body_size = offset;
dst_slice->afbc.surface_stride = dst_slice->afbc.header_size + offset;

View File

@@ -312,9 +312,15 @@ pan_slice_align(uint64_t modifier)
* are required on all current GPUs.
*/
uint32_t
pan_afbc_body_align(uint64_t modifier)
pan_afbc_body_align(unsigned arch, uint64_t modifier)
{
return (modifier & AFBC_FORMAT_MOD_TILED) ? 4096 : 64;
if (modifier & AFBC_FORMAT_MOD_TILED)
return 4096;
if (arch >= 6)
return 128;
return 64;
}
static inline unsigned
@@ -555,7 +561,7 @@ pan_image_layout_init(unsigned arch, struct pan_image_layout *layout,
slice->afbc.stride * (effective_height / block_size.height);
slice->afbc.header_size =
ALIGN_POT(slice->row_stride * (effective_height / align_h),
pan_afbc_body_align(layout->modifier));
pan_afbc_body_align(arch, layout->modifier));
if (explicit_layout &&
explicit_layout->row_stride < slice->row_stride) {

View File

@@ -281,7 +281,7 @@ uint32_t pan_afbc_stride_blocks(uint64_t modifier, uint32_t row_stride_bytes);
uint32_t pan_slice_align(uint64_t modifier);
uint32_t pan_afbc_body_align(uint64_t modifier);
uint32_t pan_afbc_body_align(unsigned arch, uint64_t modifier);
/* AFRC */

View File

@@ -444,6 +444,31 @@ TEST(AFBCLayout, Linear16x16Minimal)
EXPECT_EQ(l.slices[0].size, 64 + (32 * 8));
}
TEST(AFBCLayout, Linear16x16Minimalv6)
{
uint64_t modifier = DRM_FORMAT_MOD_ARM_AFBC(
AFBC_FORMAT_MOD_BLOCK_SIZE_16x16 | AFBC_FORMAT_MOD_SPARSE);
struct pan_image_layout l = {.modifier = modifier,
.format = PIPE_FORMAT_R8_UNORM,
.width = 1,
.height = 1,
.depth = 1,
.nr_samples = 1,
.dim = MALI_TEXTURE_DIMENSION_2D,
.nr_slices = 1};
ASSERT_TRUE(pan_image_layout_init(6, &l, NULL));
/* Image is 1x1 to test for correct alignment everywhere. */
EXPECT_EQ(l.slices[0].offset, 0);
EXPECT_EQ(l.slices[0].row_stride, 16);
EXPECT_EQ(l.slices[0].afbc.header_size, 128);
EXPECT_EQ(l.slices[0].afbc.body_size, 32 * 8);
EXPECT_EQ(l.slices[0].surface_stride, 128 + (32 * 8));
EXPECT_EQ(l.slices[0].size, 128 + (32 * 8));
}
TEST(AFBCLayout, Tiled16x16Minimal)
{
uint64_t modifier =