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 <l.stach@pengutronix.de>
Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19964>
This commit is contained in:
Lucas Stach
2022-11-16 21:27:11 +01:00
committed by Marge Bot
parent 49d2f9f918
commit 995e34840f
2 changed files with 45 additions and 10 deletions

View 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;

View 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.