Module: Mesa
Branch: main
Commit: 995e34840f03598fd71bc8eaef32e2e470b5002f
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=995e34840f03598fd71bc8eaef32e2e470b5002f

Author: Lucas Stach <[email protected]>
Date:   Wed Nov 16 21:27:11 2022 +0100

etnaviv: add tile status buffer status into TS metadata

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 <[email protected]>
Reviewed-by: Christian Gmeiner <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19964>

---

 src/gallium/drivers/etnaviv/etnaviv_resource.c |  1 -
 src/gallium/drivers/etnaviv/etnaviv_resource.h | 54 +++++++++++++++++++++-----
 2 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c 
b/src/gallium/drivers/etnaviv/etnaviv_resource.c
index c8accb8bf19..00780138c5e 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_resource.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c
@@ -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;
diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.h 
b/src/gallium/drivers/etnaviv/etnaviv_resource.h
index 95f2f637975..1c480a8666f 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_resource.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_resource.h
@@ -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.

Reply via email to