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