iris: Flush any current work in iris_fence_await before adding deps
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 15 Feb 2020 00:40:07 +0000 (16:40 -0800)
committerMarge Bot <eric+marge@anholt.net>
Fri, 1 May 2020 19:00:02 +0000 (19:00 +0000)
Receiving a fence_server_sync (iris_fence_await) means that any future
work needs to wait for the fence.  But previous work doesn't need to.

So flush it now, to avoid delaying it arbitrarily.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3802>

src/gallium/drivers/iris/iris_fence.c

index c43c892bb87cee5650bdd212fdd4f6fb60e3d1a9..ff280599060465616c7a1cd83b303d8d92a126be 100644 (file)
@@ -213,6 +213,9 @@ iris_fence_await(struct pipe_context *ctx,
 {
    struct iris_context *ice = (struct iris_context *)ctx;
 
+   /* 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];
 
@@ -222,6 +225,7 @@ iris_fence_await(struct pipe_context *ctx,
          if (iris_seqno_signaled(seqno))
             continue;
 
+         iris_batch_flush(batch);
          iris_batch_add_syncobj(batch, seqno->syncobj, I915_EXEC_FENCE_WAIT);
       }
    }