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, &copy_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