panfrost: Add debug flag to force packing of AFBC textures on upload

Add `forcepack` flag that will force conversion to AFBC-packed right
after a texture is uploaded when possible. We only pack 2D resources
larger than 32x32 as of now.

Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25012>
This commit is contained in:
Louis-Francis Ratté-Boulianne
2023-09-01 13:31:19 -04:00
committed by Marge Bot
parent bc91af8021
commit 33b48a5585
6 changed files with 46 additions and 3 deletions

View File

@@ -387,7 +387,23 @@ panfrost_should_tile_afbc(const struct panfrost_device *dev,
const struct panfrost_resource *pres)
{
return panfrost_afbc_can_tile(dev) && pres->base.width0 >= 128 &&
pres->base.height0 >= 128;
pres->base.height0 >= 128 && !(dev->debug & PAN_DBG_FORCE_PACK);
}
bool
panfrost_should_pack_afbc(struct panfrost_device *dev,
const struct panfrost_resource *prsrc)
{
const unsigned valid_binding = PIPE_BIND_DEPTH_STENCIL |
PIPE_BIND_RENDER_TARGET |
PIPE_BIND_SAMPLER_VIEW;
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->base.bind & ~valid_binding) == 0 &&
!prsrc->modifier_constant && prsrc->base.width0 >= 32 &&
prsrc->base.height0 >= 32;
}
static bool
@@ -1429,6 +1445,7 @@ panfrost_ptr_unmap(struct pipe_context *pctx, struct pipe_transfer *transfer)
{
/* Gallium expects writeback here, so we tile */
struct panfrost_context *ctx = pan_context(pctx);
struct panfrost_transfer *trans = pan_transfer(transfer);
struct panfrost_resource *prsrc =
(struct panfrost_resource *)transfer->resource;
@@ -1457,8 +1474,13 @@ panfrost_ptr_unmap(struct pipe_context *pctx, struct pipe_transfer *transfer)
} else {
pan_blit_from_staging(pctx, trans);
panfrost_flush_batches_accessing_rsrc(
pan_context(pctx), pan_resource(trans->staging.rsrc),
ctx, pan_resource(trans->staging.rsrc),
"AFBC write staging blit");
if (dev->debug & PAN_DBG_FORCE_PACK) {
if (panfrost_should_pack_afbc(dev, prsrc))
panfrost_pack_afbc(ctx, prsrc);
}
}
}

View File

@@ -181,6 +181,9 @@ struct panfrost_bo *panfrost_get_afbc_superblock_sizes(
struct panfrost_context *ctx, struct panfrost_resource *rsrc,
unsigned first_level, unsigned last_level, unsigned *out_offsets);
bool panfrost_should_pack_afbc(struct panfrost_device *dev,
const struct panfrost_resource *rsrc);
void panfrost_pack_afbc(struct panfrost_context *ctx,
struct panfrost_resource *prsrc);

View File

@@ -72,6 +72,7 @@ static const struct debug_named_value panfrost_debug_options[] = {
{"overflow", PAN_DBG_OVERFLOW, "Check for buffer overflows in pool uploads"},
#endif
{"yuv", PAN_DBG_YUV, "Tint YUV textures with blue for 1-plane and green for 2-plane"},
{"forcepack", PAN_DBG_FORCE_PACK, "Force packing of AFBC textures on upload"},
DEBUG_NAMED_VALUE_END
};
/* clang-format on */

View File

@@ -187,6 +187,20 @@ panfrost_afbc_can_ytr(enum pipe_format format)
return desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB;
}
/* Only support packing for RGB formats for now. */
bool
panfrost_afbc_can_pack(enum pipe_format format)
{
const struct util_format_description *desc = util_format_description(format);
if (desc->nr_channels != 1 && desc->nr_channels != 3 &&
desc->nr_channels != 4)
return false;
return desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB;
}
/*
* Check if the device supports AFBC with tiled headers (and hence also solid
* colour blocks).

View File

@@ -233,6 +233,8 @@ enum pan_afbc_mode panfrost_afbc_format(unsigned arch, enum pipe_format format);
bool panfrost_afbc_can_ytr(enum pipe_format format);
bool panfrost_afbc_can_pack(enum pipe_format format);
bool panfrost_afbc_can_tile(const struct panfrost_device *dev);
/*

View File

@@ -52,7 +52,8 @@
#define PAN_DBG_OVERFLOW 0x8000
#endif
#define PAN_DBG_YUV 0x20000
#define PAN_DBG_YUV 0x20000
#define PAN_DBG_FORCE_PACK 0x40000
struct panfrost_device;