Module: Mesa Branch: main Commit: 6261ca742572b350962c824b90501b83436b66a3 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6261ca742572b350962c824b90501b83436b66a3
Author: Lucas Stach <[email protected]> Date: Sun Apr 10 13:30:35 2022 +0200 etnaviv: add tile size helper On older GPUs a color tile was always 64 Byte. On new GPUs with CACHE128B256BPERLINE support the tile size is either 128 Byte or 256 Byte depending on the TS mode. Add a helper to return the color tile size and use in in places that use hard-coded tile size values or do their own calculation. Signed-off-by: Lucas Stach <[email protected]> Reviewed-by: Philipp Zabel <[email protected]> Reviewed-by: Christian Gmeiner <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9255> --- src/gallium/drivers/etnaviv/etnaviv_blt.c | 3 ++- src/gallium/drivers/etnaviv/etnaviv_internal.h | 2 ++ src/gallium/drivers/etnaviv/etnaviv_resource.c | 18 ++++++------------ src/gallium/drivers/etnaviv/etnaviv_rs.c | 3 ++- src/gallium/drivers/etnaviv/etnaviv_screen.h | 12 ++++++++++++ 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_blt.c b/src/gallium/drivers/etnaviv/etnaviv_blt.c index ec762024573..87197e31835 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blt.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blt.c @@ -450,7 +450,8 @@ etna_try_blt_blit(struct pipe_context *pctx, op.ts_clear_value[0] = src_lev->clear_value; op.ts_clear_value[1] = src_lev->clear_value; op.ts_mode = src_lev->ts_mode; - op.num_tiles = DIV_ROUND_UP(src_lev->size, src_lev->ts_mode ? 256 : 128); + op.num_tiles = DIV_ROUND_UP(src_lev->size, + etna_screen_get_tile_size(ctx->screen, src_lev->ts_mode)); op.bpp = util_format_get_blocksize(src->base.format); etna_set_state(ctx->stream, VIVS_GL_FLUSH_CACHE, 0x00000c23); diff --git a/src/gallium/drivers/etnaviv/etnaviv_internal.h b/src/gallium/drivers/etnaviv/etnaviv_internal.h index cab0d99d8f6..7115abced6e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_internal.h +++ b/src/gallium/drivers/etnaviv/etnaviv_internal.h @@ -28,6 +28,8 @@ #include <stdbool.h> #include <stdint.h> +#include "hw/common.xml.h" +#include "hw/common_3d.xml.h" #include "hw/state.xml.h" #include "hw/state_3d.xml.h" diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c index 9b15176afd2..c88c04e10a4 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c @@ -85,7 +85,6 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen, { struct etna_screen *screen = etna_screen(pscreen); size_t rt_ts_size, ts_layer_stride; - size_t bytes_per_tile; uint8_t ts_mode = TS_MODE_128B; int8_t ts_compress_fmt; @@ -98,20 +97,15 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen, ts_compress_fmt = (screen->specs.v4_compression || rsc->base.nr_samples > 1) ? translate_ts_format(rsc->base.format) : -1; - if (VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE)) { - /* enable 256B ts mode with compression, as it improves performance - * the size of the resource might also determine if we want to use it or not - */ - if (ts_compress_fmt >= 0) + /* enable 256B ts mode with compression, as it improves performance + * the size of the resource might also determine if we want to use it or not + */ + if (VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE) && + ts_compress_fmt >= 0) ts_mode = TS_MODE_256B; - bytes_per_tile = ts_mode == TS_MODE_256B ? 256 : 128; - } else { - bytes_per_tile = 64; - } - ts_layer_stride = align(DIV_ROUND_UP(rsc->levels[0].layer_stride, - bytes_per_tile * + etna_screen_get_tile_size(screen, ts_mode) * 8 / screen->specs.bits_per_tile), 0x100 * screen->specs.pixel_pipes); rt_ts_size = ts_layer_stride * rsc->base.array_size; diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index 69e610a06b6..c2f9d02547a 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -789,7 +789,8 @@ etna_try_rs_blit(struct pipe_context *pctx, .clear_mode = VIVS_RS_CLEAR_CONTROL_MODE_DISABLED, .width = width, .height = height, - .tile_count = src_lev->layer_stride / 64 + .tile_count = src_lev->layer_stride / + etna_screen_get_tile_size(ctx->screen, src_lev->ts_mode), }); etna_submit_rs_state(ctx, ©_to_screen); diff --git a/src/gallium/drivers/etnaviv/etnaviv_screen.h b/src/gallium/drivers/etnaviv/etnaviv_screen.h index 325af3d19a8..3172cfd551a 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_screen.h +++ b/src/gallium/drivers/etnaviv/etnaviv_screen.h @@ -109,4 +109,16 @@ struct pipe_screen * etna_screen_create(struct etna_device *dev, struct etna_gpu *gpu, struct renderonly *ro); +static inline size_t +etna_screen_get_tile_size(struct etna_screen *screen, uint8_t ts_mode) +{ + if (!VIV_FEATURE(screen, chipMinorFeatures6, CACHE128B256BPERLINE)) + return 64; + + if (ts_mode == TS_MODE_256B) + return 256; + else + return 128; +} + #endif
