From 995e34840f03598fd71bc8eaef32e2e470b5002f Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Wed, 16 Nov 2022 21:27:11 +0100 Subject: [PATCH] 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 Reviewed-by: Christian Gmeiner Part-of: --- .../drivers/etnaviv/etnaviv_resource.c | 1 - .../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.