etnaviv: rework wait/flush logic
authorChristian Gmeiner <christian.gmeiner@gmail.com>
Wed, 31 Jul 2019 10:38:53 +0000 (12:38 +0200)
committerMarge Bot <eric+marge@anholt.net>
Sun, 5 Apr 2020 18:01:43 +0000 (18:01 +0000)
Saves us from doing an extra flush in !wait case and seems more
logical now. Also evaluate etna_bo_cpu_prep(..) retun value.

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/1530>

src/gallium/drivers/etnaviv/etnaviv_query_acc.c

index a1628534d277657c42a25da5e9e6e0040c86be4c..446a629c6e8a534c1330104ee5a7ee0e8cbcc98c 100644 (file)
@@ -167,10 +167,8 @@ etna_acc_get_query_result(struct etna_context *ctx, struct etna_query *q,
 
    assert(list_is_empty(&aq->node));
 
-   if (!wait) {
-      int ret;
-
-      if (rsc->status & ETNA_PENDING_WRITE) {
+   if (rsc->status & 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
@@ -183,20 +181,16 @@ etna_acc_get_query_result(struct etna_context *ctx, struct etna_query *q,
          }
 
          return false;
+      } else {
+         /* flush that GPU executes all query related actions */
+         ctx->base.flush(&ctx->base, NULL, 0);
       }
-
-      ret = etna_bo_cpu_prep(rsc->bo, DRM_ETNA_PREP_READ | DRM_ETNA_PREP_NOSYNC);
-      if (ret)
-         return false;
-
-      etna_bo_cpu_fini(rsc->bo);
    }
 
-   /* flush that GPU executes all query related actions */
-   ctx->base.flush(&ctx->base, NULL, 0);
-
    /* get the result */
-   etna_bo_cpu_prep(rsc->bo, DRM_ETNA_PREP_READ);
+   int ret = etna_bo_cpu_prep(rsc->bo, DRM_ETNA_PREP_READ);
+   if (ret)
+      return false;
 
    void *ptr = etna_bo_map(rsc->bo);
    p->result(aq, ptr, result);