Module: Mesa Branch: main Commit: 61e27debf5b13e792ec74bc79fb0abf9f83a4d71 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=61e27debf5b13e792ec74bc79fb0abf9f83a4d71
Author: Lucas Stach <[email protected]> Date: Fri Nov 18 18:08:06 2022 +0100 etnaviv: keep blit destination tile status valid if possible If the blit was just a resource flush on a uncompressed buffer we can keep the tile status as valid, as in that case only clear tiles are filled in the target buffer, but it doesn't hurt to look at the TS buffer when fetching from this resource as the tile status matches the content of the buffer. For compressed formats we can't do the same, as the compressed tiles are uncompressed when flushing the resource, so the compression tags don't match the buffer content anymore. Signed-off-by: Lucas Stach <[email protected]> Reviewed-by: Christian Gmeiner <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19964> --- src/gallium/drivers/etnaviv/etnaviv_blt.c | 9 ++++++++- src/gallium/drivers/etnaviv/etnaviv_rs.c | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_blt.c b/src/gallium/drivers/etnaviv/etnaviv_blt.c index 00daea00439..0592b4083f8 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blt.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blt.c @@ -579,7 +579,14 @@ etna_try_blt_blit(struct pipe_context *pctx, resource_written(ctx, &dst->base); etna_resource_level_mark_changed(dst_lev); - etna_resource_level_ts_mark_invalid(dst_lev); + + /* We don't need to mark the TS as invalid if this was just a flush without + * compression, as in that case only clear tiles are filled and the tile + * status still matches the blit target buffer. For compressed formats the + * tiles are decompressed, so tile status doesn't match anymore. + */ + if (src != dst || src_lev->ts_compress_fmt >= 0) + etna_resource_level_ts_mark_invalid(dst_lev); return true; } diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index eeae7dcd124..659ed0d7762 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -807,7 +807,15 @@ etna_try_rs_blit(struct pipe_context *pctx, resource_read(ctx, &src->base); resource_written(ctx, &dst->base); etna_resource_level_mark_changed(dst_lev); - etna_resource_level_ts_mark_invalid(dst_lev); + + /* We don't need to mark the TS as invalid if this was just a flush without + * compression, as in that case only clear tiles are filled and the tile + * status still matches the blit target buffer. For compressed formats the + * tiles are decompressed, so tile status doesn't match anymore. + */ + if (src != dst || src_lev->ts_compress_fmt >= 0) + etna_resource_level_ts_mark_invalid(dst_lev); + ctx->dirty |= ETNA_DIRTY_DERIVE_TS; return true;
