iris: Reorder the loops in iris_fence_await() for clarity.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 25 Aug 2020 16:47:13 +0000 (09:47 -0700)
committerMarge Bot <eric+marge@anholt.net>
Thu, 27 Aug 2020 16:40:22 +0000 (16:40 +0000)
Swapping the order of the loops makes the logic much easier to follow:
for each point in our fence, if it hasn't gone by, make future work in
all batches depend on it.  Both loops are necessary, and now it's
clearer why.

(This doesn't actually fix a bug but needs to be cherry-picked for
the next patch to apply, which does fix a bug.)

Fixes: f459c56be6b ("iris: Add fence support using drm_syncobj")
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Tested-by: Tapani Pälli <tapani.palli@intel.com>
Tested-by: Yang A Shi <yang.a.shi@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6463>

src/gallium/drivers/iris/iris_fence.c

index 4600c1c4238231b0709234b75c09f757b3189344..22acc317c0c0b072ea7a22c73f6cac4eb2917978 100644 (file)
@@ -256,19 +256,21 @@ iris_fence_await(struct pipe_context *ctx,
                          "is unlikely to work without kernel 5.8+\n");
    }
 
-   /* Flush any current work in our context as it doesn't need to wait
-    * for this fence.  Any future work in our context must wait.
-    */
-   for (unsigned b = 0; b < IRIS_BATCH_COUNT; b++) {
-      struct iris_batch *batch = &ice->batches[b];
+   for (unsigned i = 0; i < ARRAY_SIZE(fence->fine); i++) {
+      struct iris_fine_fence *fine = fence->fine[i];
 
-      for (unsigned i = 0; i < ARRAY_SIZE(fence->fine); i++) {
-         struct iris_fine_fence *fine = fence->fine[i];
+      if (iris_fine_fence_signaled(fine))
+         continue;
 
-         if (iris_fine_fence_signaled(fine))
-            continue;
+      for (unsigned b = 0; b < IRIS_BATCH_COUNT; b++) {
+         struct iris_batch *batch = &ice->batches[b];
 
+         /* We're going to make any future work in this batch wait for our
+          * fence to have gone by.  But any currently queued work doesn't
+          * need to wait.  Flush the batch now, so it can happen sooner.
+          */
          iris_batch_flush(batch);
+
          iris_batch_add_syncobj(batch, fine->syncobj, I915_EXEC_FENCE_WAIT);
       }
    }