From f0c54e02cfcdea807f56e74c6808672994c8ff67 Mon Sep 17 00:00:00 2001 From: Lucas Stach Date: Fri, 5 Jul 2024 21:13:35 +0200 Subject: [PATCH] etnaviv: always flush pending queries on get_query_result This is basically a port from commit 591a3c738d7a ("freedreno: Be more strict about QUERY_AVAILABLE to simplify the code.") to etnaviv. perfmon queries already forced such a flush by setting no_wait_cnt to a value above the flush threshold, now we unify the behavior between occlusion and perfmon queries. Signed-off-by: Lucas Stach Reviewed-by: Christian Gmeiner Part-of: --- .../drivers/etnaviv/etnaviv_query_acc.c | 32 ++++++++----------- .../drivers/etnaviv/etnaviv_query_acc.h | 1 - .../etnaviv/etnaviv_query_acc_perfmon.c | 3 -- 3 files changed, 13 insertions(+), 23 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_acc.c b/src/gallium/drivers/etnaviv/etnaviv_query_acc.c index 9578cb780d2..e356828dbea 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_query_acc.c +++ b/src/gallium/drivers/etnaviv/etnaviv_query_acc.c @@ -113,31 +113,25 @@ etna_acc_get_query_result(struct etna_context *ctx, struct etna_query *q, struct etna_acc_query *aq = etna_acc_query(q); struct etna_resource *rsc = etna_resource(aq->prsc); const struct etna_acc_sample_provider *p = aq->provider; + uint32_t prep_op = DRM_ETNA_PREP_READ; assert(list_is_empty(&aq->node)); - 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 - * to get query result forever with wait==false.. we don't - * wait to flush unnecessarily but we also don't want to - * spin forever. - */ - if (aq->no_wait_cnt++ > 5) { - etna_flush(&ctx->base, NULL, 0, true); - aq->no_wait_cnt = 0; - } + /* ARB_occlusion_query says: + * "Querying the state for a given occlusion query forces that + * occlusion query to complete within a finite amount of time." + * + * So, regardless of whether we are supposed to wait or not, we do need to + * flush now. + */ + if (etna_resource_status(ctx, rsc) & ETNA_PENDING_WRITE) + etna_flush(&ctx->base, NULL, 0, true); - return false; - } else { - /* flush that GPU executes all query related actions */ - etna_flush(&ctx->base, NULL, 0, true); - } - } + if (!wait) + prep_op |= DRM_ETNA_PREP_NOSYNC; /* get the result */ - int ret = etna_bo_cpu_prep(rsc->bo, DRM_ETNA_PREP_READ); + int ret = etna_bo_cpu_prep(rsc->bo, prep_op); if (ret) return false; diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_acc.h b/src/gallium/drivers/etnaviv/etnaviv_query_acc.h index 9204befa03d..11fe4ddfa44 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_query_acc.h +++ b/src/gallium/drivers/etnaviv/etnaviv_query_acc.h @@ -49,7 +49,6 @@ struct etna_acc_query { struct pipe_resource *prsc; unsigned samples; /* number of samples stored in resource */ - unsigned no_wait_cnt; /* see etna_hw_get_query_result() */ struct list_head node; /* list-node in ctx->active_hw_queries */ const struct etna_acc_sample_provider *provider; diff --git a/src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c b/src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c index b6a9eb0caa3..30afb0d831f 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c +++ b/src/gallium/drivers/etnaviv/etnaviv_query_acc_perfmon.c @@ -90,9 +90,6 @@ pm_query(struct etna_context *ctx, struct etna_acc_query *aq, unsigned flags) etna_cmd_stream_perf(stream, &p); resource_written(ctx, aq->prsc); - - /* force a flush in !wait case in etna_acc_get_query_result(..) */ - aq->no_wait_cnt = 10; } static bool