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 <l.stach@pengutronix.de>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14466>
This commit is contained in:
Lucas Stach 2022-01-07 20:30:11 +01:00 committed by Marge Bot
parent ce4e5198a3
commit a11fa44b2d
4 changed files with 13 additions and 6 deletions

View file

@ -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

View file

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

View file

@ -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);
}

View file

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