From a11fa44b2d8cb6337305bbd6209ac7cff6072f64 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Fri, 7 Jan 2022 20:30:11 +0100 Subject: [PATCH] etnaviv: add function to get resource status Don't access the status member of etna_resource directly, as this go away to get rid of shared mutable state. Add a wrapper function that allows to plug in the new status lookup. Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- src/gallium/drivers/etnaviv/etnaviv_query_acc.c | 2 +- src/gallium/drivers/etnaviv/etnaviv_resource.h | 6 ++++++ src/gallium/drivers/etnaviv/etnaviv_rs.c | 4 ++-- src/gallium/drivers/etnaviv/etnaviv_transfer.c | 7 ++++--- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_acc.c b/src/gallium/drivers/etnaviv/etnaviv_query_acc.c index 789f1234f32..193fa87cd34 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_query_acc.c +++ b/src/gallium/drivers/etnaviv/etnaviv_query_acc.c @@ -118,7 +118,7 @@ etna_acc_get_query_result(struct etna_context *ctx, struct etna_query *q, assert(list_is_empty(&aq->node)); - if (rsc->status & ETNA_PENDING_WRITE) { + if (etna_resource_status(ctx, rsc) & ETNA_PENDING_WRITE) { if (!wait) { /* piglit spec@arb_occlusion_query@occlusion_query_conform * test, and silly apps perhaps, get stuck in a loop trying diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.h b/src/gallium/drivers/etnaviv/etnaviv_resource.h index 167cf4ed069..562585cb08b 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.h +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.h @@ -169,6 +169,12 @@ resource_written(struct etna_context *ctx, struct pipe_resource *prsc) etna_resource_used(ctx, prsc, ETNA_PENDING_WRITE); } +static inline enum etna_resource_status +etna_resource_status(struct etna_context *ctx, struct etna_resource *res) +{ + return res->status; +} + /* Allocate Tile Status for an etna resource. * Tile status is a cache of the clear status per tile. This means a smaller * surface has to be cleared which is faster. diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index c2f9d02547a..bbd6d4bc220 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -805,8 +805,8 @@ etna_try_rs_blit(struct pipe_context *pctx, manual: if (src->layout == ETNA_LAYOUT_TILED && dst->layout == ETNA_LAYOUT_TILED) { - if ((src->status & ETNA_PENDING_WRITE) || - (dst->status & ETNA_PENDING_WRITE)) + if ((etna_resource_status(ctx, src) & ETNA_PENDING_WRITE) || + (etna_resource_status(ctx, dst) & ETNA_PENDING_WRITE)) pctx->flush(pctx, NULL, 0); return etna_manual_blit(dst, dst_lev, dst_offset, src, src_lev, src_offset, blit_info); } diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c index c893f0b7bb1..f4b3debaa11 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c @@ -374,6 +374,7 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc, * transfers without a temporary resource. */ if (trans->rsc || !(usage & PIPE_MAP_UNSYNCHRONIZED)) { + enum etna_resource_status status = etna_resource_status(ctx, rsc); uint32_t prep_flags = 0; /* @@ -384,10 +385,10 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc, */ mtx_lock(&ctx->lock); - if ((trans->rsc && (etna_resource(trans->rsc)->status & ETNA_PENDING_WRITE)) || + if ((trans->rsc && (status & ETNA_PENDING_WRITE)) || (!trans->rsc && - (((usage & PIPE_MAP_READ) && (rsc->status & ETNA_PENDING_WRITE)) || - ((usage & PIPE_MAP_WRITE) && rsc->status)))) { + (((usage & PIPE_MAP_READ) && (status & ETNA_PENDING_WRITE)) || + ((usage & PIPE_MAP_WRITE) && status)))) { mtx_lock(&rsc->lock); set_foreach(rsc->pending_ctx, entry) { struct etna_context *pend_ctx = (struct etna_context *)entry->key;