panfrost: Add support for AFBC(split)
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:
committed by
Louis-Francis Ratté-Boulianne
parent
762a0f4133
commit
4af57952b1
@@ -391,6 +391,7 @@ panfrost_should_pack_afbc(struct panfrost_device *dev,
|
||||
return panfrost_afbc_can_pack(prsrc->base.format) && panfrost_is_2d(prsrc) &&
|
||||
drm_is_afbc(prsrc->image.layout.modifier) &&
|
||||
(prsrc->image.layout.modifier & AFBC_FORMAT_MOD_SPARSE) &&
|
||||
!(prsrc->image.layout.modifier & AFBC_FORMAT_MOD_SPLIT) &&
|
||||
(prsrc->base.bind & ~valid_binding) == 0 &&
|
||||
!prsrc->modifier_constant && prsrc->base.array_size == 1 &&
|
||||
prsrc->base.width0 >= 32 && prsrc->base.height0 >= 32 ;
|
||||
|
||||
@@ -699,14 +699,20 @@ panfrost_walk_dmabuf_modifiers(struct pipe_screen *screen,
|
||||
unsigned count = 0;
|
||||
|
||||
for (unsigned i = 0; i < PAN_MODIFIER_COUNT; ++i) {
|
||||
if (drm_is_afbc(pan_best_modifiers[i]) && !afbc)
|
||||
continue;
|
||||
if (drm_is_afbc(pan_best_modifiers[i])) {
|
||||
if (!afbc)
|
||||
continue;
|
||||
|
||||
if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_YTR) && !ytr)
|
||||
continue;
|
||||
if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_SPLIT) &&
|
||||
!panfrost_afbc_can_split(dev->arch, format, pan_best_modifiers[i]))
|
||||
continue;
|
||||
|
||||
if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_TILED) && !tiled_afbc)
|
||||
continue;
|
||||
if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_YTR) && !ytr)
|
||||
continue;
|
||||
|
||||
if ((pan_best_modifiers[i] & AFBC_FORMAT_MOD_TILED) && !tiled_afbc)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (drm_is_afrc(pan_best_modifiers[i]) && !afrc)
|
||||
continue;
|
||||
|
||||
@@ -178,6 +178,26 @@ panfrost_afbc_can_ytr(enum pipe_format format)
|
||||
return desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB;
|
||||
}
|
||||
|
||||
bool
|
||||
panfrost_afbc_can_split(unsigned arch, enum pipe_format format,
|
||||
uint64_t modifier)
|
||||
{
|
||||
unsigned block_width = panfrost_afbc_superblock_width(modifier);
|
||||
|
||||
if (arch < 6)
|
||||
return false;
|
||||
|
||||
if (block_width == 16) {
|
||||
return true;
|
||||
} else if (block_width == 32) {
|
||||
enum pan_afbc_mode mode = panfrost_afbc_format(arch, format);
|
||||
return (mode == PAN_AFBC_MODE_R8G8B8A8 ||
|
||||
mode == PAN_AFBC_MODE_R10G10B10A2);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Only support packing for RGB formats for now. */
|
||||
|
||||
bool
|
||||
|
||||
@@ -543,6 +543,8 @@ pan_prepare_rt(const struct pan_fb_info *fb, unsigned layer_idx,
|
||||
cfg->afbc.yuv_transform = true;
|
||||
|
||||
cfg->afbc.wide_block = panfrost_afbc_is_wide(image->layout.modifier);
|
||||
cfg->afbc.split_block =
|
||||
(image->layout.modifier & AFBC_FORMAT_MOD_SPLIT);
|
||||
cfg->afbc.header = surf.afbc.header;
|
||||
cfg->afbc.body_offset = surf.afbc.body - surf.afbc.header;
|
||||
assert(surf.afbc.body >= surf.afbc.header);
|
||||
@@ -557,6 +559,8 @@ pan_prepare_rt(const struct pan_fb_info *fb, unsigned layer_idx,
|
||||
pan_afbc_stride_blocks(image->layout.modifier, slice->row_stride);
|
||||
cfg->afbc.afbc_wide_block_enable =
|
||||
panfrost_afbc_is_wide(image->layout.modifier);
|
||||
cfg->afbc.afbc_split_block_enable =
|
||||
(image->layout.modifier & AFBC_FORMAT_MOD_SPLIT);
|
||||
#else
|
||||
cfg->afbc.chunk_size = 9;
|
||||
cfg->afbc.sparse = true;
|
||||
|
||||
@@ -94,6 +94,9 @@ panfrost_compression_tag(const struct util_format_description *desc,
|
||||
|
||||
if (panfrost_afbc_is_wide(modifier))
|
||||
flags |= MALI_AFBC_SURFACE_FLAG_WIDE_BLOCK;
|
||||
|
||||
if (modifier & AFBC_FORMAT_MOD_SPLIT)
|
||||
flags |= MALI_AFBC_SURFACE_FLAG_SPLIT_BLOCK;
|
||||
#endif
|
||||
|
||||
#if PAN_ARCH >= 7
|
||||
@@ -418,6 +421,7 @@ panfrost_emit_plane(const struct pan_image_view *iview, int index,
|
||||
cfg.plane_type = MALI_PLANE_TYPE_AFBC;
|
||||
cfg.afbc.superblock_size = translate_superblock_size(layout->modifier);
|
||||
cfg.afbc.ytr = (layout->modifier & AFBC_FORMAT_MOD_YTR);
|
||||
cfg.afbc.split_block = (layout->modifier & AFBC_FORMAT_MOD_SPLIT);
|
||||
cfg.afbc.tiled_header = (layout->modifier & AFBC_FORMAT_MOD_TILED);
|
||||
cfg.afbc.prefetch = true;
|
||||
cfg.afbc.compression_mode = GENX(pan_afbc_compression_mode)(format);
|
||||
|
||||
@@ -242,6 +242,9 @@ panfrost_format_supports_afbc(unsigned arch, enum pipe_format format)
|
||||
|
||||
bool panfrost_afbc_can_ytr(enum pipe_format format);
|
||||
|
||||
bool panfrost_afbc_can_split(unsigned arch, enum pipe_format format,
|
||||
uint64_t modifier);
|
||||
|
||||
bool panfrost_afbc_can_pack(enum pipe_format format);
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user