etnaviv: add tile status buffer status into TS metadata
authorLucas Stach <l.stach@pengutronix.de>
Wed, 16 Nov 2022 20:27:11 +0000 (21:27 +0100)
committerMarge Bot <emma+marge@anholt.net>
Fri, 14 Jul 2023 14:21:35 +0000 (14:21 +0000)
When the TS is shared all sharing instances must see the same status
information about the resource TS buffer. Add this information to the
shared TS metadata and make it take precedence over the internal
status tracking when the TS is shared.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19964>

src/gallium/drivers/etnaviv/etnaviv_resource.c
src/gallium/drivers/etnaviv/etnaviv_resource.h

index c8accb8..0078013 100644 (file)
@@ -632,7 +632,6 @@ static void etna_resource_finish_ts_import(struct etna_screen *screen,
    lvl->clear_value = lvl->ts_meta->v0.clear_value;
    lvl->ts_size = lvl->ts_meta->v0.data_size;
    lvl->ts_mode = ts_mode;
-   etna_resource_level_ts_mark_valid(lvl);
 
    etna_resource_destroy(&screen->base, rsc->base.next);
    rsc->base.next = NULL;
index 95f2f63..1c480a8 100644 (file)
@@ -50,6 +50,10 @@ struct etna_ts_sw_meta {
       uint32_t layer_stride;
       uint32_t comp_format;
       uint64_t clear_value;
+      uint32_t seqno;
+      uint32_t flush_seqno;
+      uint8_t valid;
+      uint8_t pad[3];
    } v0;
 };
 
@@ -85,7 +89,10 @@ static inline bool
 etna_resource_level_newer(struct etna_resource_level *a,
                           struct etna_resource_level *b)
 {
-   return (int)(a->seqno - b->seqno) > 0;
+   uint32_t a_seqno = a->ts_meta ? a->ts_meta->v0.seqno : a->seqno;
+   uint32_t b_seqno = b->ts_meta ? b->ts_meta->v0.seqno : b->seqno;
+
+   return (int)(a_seqno - b_seqno) > 0;
 }
 
 /* returns TRUE if a is older than b */
@@ -93,51 +100,80 @@ static inline bool
 etna_resource_level_older(struct etna_resource_level *a,
                           struct etna_resource_level *b)
 {
-   return (int)(a->seqno - b->seqno) < 0;
+   uint32_t a_seqno = a->ts_meta ? a->ts_meta->v0.seqno : a->seqno;
+   uint32_t b_seqno = b->ts_meta ? b->ts_meta->v0.seqno : b->seqno;
+
+   return (int)(a_seqno - b_seqno) < 0;
 }
 
 static inline bool
 etna_resource_level_ts_valid(struct etna_resource_level *lvl)
 {
-   return lvl->ts_valid;
+   if (unlikely(lvl->ts_meta))
+      return lvl->ts_meta->v0.valid;
+   else
+      return lvl->ts_valid;
 }
 
 static inline void
 etna_resource_level_ts_mark_valid(struct etna_resource_level *lvl)
 {
-   lvl->ts_valid = true;
+   if (unlikely(lvl->ts_meta))
+      lvl->ts_meta->v0.valid = 1;
+   else
+      lvl->ts_valid = true;
 }
 
 static inline void
 etna_resource_level_ts_mark_invalid(struct etna_resource_level *lvl)
 {
-   lvl->ts_valid = false;
+   if (unlikely(lvl->ts_meta))
+      lvl->ts_meta->v0.valid = 0;
+   else
+      lvl->ts_valid = false;
 }
 
 /* returns TRUE if a is older than b */
 static inline bool
 etna_resource_level_needs_flush(struct etna_resource_level *lvl)
 {
-   return lvl->ts_valid && ((int)(lvl->seqno - lvl->flush_seqno) > 0);
+   if (!etna_resource_level_ts_valid(lvl))
+      return false;
+
+   if (unlikely(lvl->ts_meta))
+      return ((int)(lvl->ts_meta->v0.seqno - lvl->ts_meta->v0.flush_seqno) > 0);
+   else
+      return ((int)(lvl->seqno - lvl->flush_seqno) > 0);
 }
 
 static inline void
 etna_resource_level_mark_flushed(struct etna_resource_level *lvl)
 {
-   lvl->flush_seqno = lvl->seqno;
+   if (unlikely(lvl->ts_meta))
+      lvl->ts_meta->v0.flush_seqno = lvl->ts_meta->v0.seqno;
+   else
+      lvl->flush_seqno = lvl->seqno;
 }
 
 static inline void
 etna_resource_level_mark_changed(struct etna_resource_level *lvl)
 {
-   lvl->seqno++;
+   if (unlikely(lvl->ts_meta))
+      lvl->ts_meta->v0.seqno++;
+   else
+      lvl->seqno++;
 }
 
 static inline void
 etna_resource_level_copy_seqno(struct etna_resource_level *dst,
                                struct etna_resource_level *src)
 {
-   dst->seqno = src->seqno;
+   uint32_t src_seqno = src->ts_meta ? src->ts_meta->v0.seqno : src->seqno;
+
+   if (unlikely(dst->ts_meta))
+      dst->ts_meta->v0.seqno = src_seqno;
+   else
+      dst->seqno = src_seqno;
 }
 
 /* status of queued up but not flushed reads and write operations.