llvmpipe: rework query fence signalling for get_query_result_resource
authorDave Airlie <airlied@redhat.com>
Thu, 15 Jul 2021 00:01:28 +0000 (10:01 +1000)
committerMarge Bot <eric+marge@anholt.net>
Thu, 22 Jul 2021 20:47:48 +0000 (20:47 +0000)
For compute shaders stats avail was never signalling because nothing
flushed.

Fixes dEQP-VK.query_pool.statistics_query.host_query_reset.compute_shader_invocations.64bits_cmdcopyquerypoolresults_primary
and others

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11913>

src/gallium/drivers/llvmpipe/lp_query.c

index 38c1319..e369925 100644 (file)
@@ -214,15 +214,17 @@ llvmpipe_get_query_result_resource(struct pipe_context *pipe,
    unsigned num_threads = MAX2(1, screen->num_threads);
    struct llvmpipe_query *pq = llvmpipe_query(q);
    struct llvmpipe_resource *lpr = llvmpipe_resource(resource);
-   bool unflushed = false;
    bool unsignalled = false;
    if (pq->fence) {
       /* only have a fence if there was a scene */
       if (!lp_fence_signalled(pq->fence)) {
-         unsignalled = true;
          if (!lp_fence_issued(pq->fence))
-            unflushed = true;
+            llvmpipe_flush(pipe, NULL, __FUNCTION__);
+
+         if (wait)
+            lp_fence_wait(pq->fence);
       }
+      unsignalled = !lp_fence_signalled(pq->fence);
    }
 
 
@@ -236,15 +238,6 @@ llvmpipe_get_query_result_resource(struct pipe_context *pipe,
    else {
       unsigned i;
 
-      if (unflushed) {
-         llvmpipe_flush(pipe, NULL, __FUNCTION__);
-
-         if (!wait)
-            return;
-
-         lp_fence_wait(pq->fence);
-      }
-
       switch (pq->type) {
       case PIPE_QUERY_OCCLUSION_COUNTER:
          for (i = 0; i < num_threads; i++) {