Mesa (main): etnaviv: add tile size helper
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Apr 27 09:19:02 UTC 2022
Module: Mesa
Branch: main
Commit: 6261ca742572b350962c824b90501b83436b66a3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=6261ca742572b350962c824b90501b83436b66a3
Author: Lucas Stach <l.stach at pengutronix.de>
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 <l.stach at pengutronix.de>
Reviewed-by: Philipp Zabel <p.zabel at pengutronix.de>
Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>
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
More information about the mesa-commit
mailing list