Mesa (main): zink: do not create fences at all if timeline semaphores are supported

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 18 23:55:48 UTC 2022


Module: Mesa
Branch: main
Commit: 07c86e99b13869095b87983a2d5b000eb4003af4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=07c86e99b13869095b87983a2d5b000eb4003af4

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Fri Mar 25 12:09:50 2022 -0400

zink: do not create fences at all if timeline semaphores are supported

there's no point in doing this, as it's just extra objects that don't need
to ever be used

Acked-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15904>

---

 src/gallium/drivers/zink/zink_batch.c   | 16 +++++++++-------
 src/gallium/drivers/zink/zink_context.c | 10 ++++++++--
 src/gallium/drivers/zink/zink_fence.c   | 23 +++++++++++++++++++++++
 3 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 1dc01fc75eb..0ad479b55f6 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -244,11 +244,13 @@ create_batch_state(struct zink_context *ctx)
    if (!screen->batch_descriptor_init(screen, bs))
       goto fail;
 
-   VkFenceCreateInfo fci = {0};
-   fci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
+   if (!screen->info.have_KHR_timeline_semaphore) {
+      VkFenceCreateInfo fci = {0};
+      fci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
 
-   if (VKSCR(CreateFence)(screen->dev, &fci, NULL, &bs->fence.fence) != VK_SUCCESS)
-      goto fail;
+      if (VKSCR(CreateFence)(screen->dev, &fci, NULL, &bs->fence.fence) != VK_SUCCESS)
+         goto fail;
+   }
 
    util_queue_fence_init(&bs->flush_completed);
    bs->queue = screen->threaded ? screen->thread_queue : screen->queue;
@@ -288,7 +290,7 @@ get_batch_state(struct zink_context *ctx, struct zink_batch *batch)
    }
    simple_mtx_unlock(&ctx->batch_mtx);
    if (bs) {
-      if (bs->fence.submitted && !bs->fence.completed)
+      if (bs->fence.submitted && !bs->fence.completed && bs->fence.fence)
          /* this fence is already done, so we need vulkan to release the cmdbuf */
          zink_vkfence_wait(screen, &bs->fence, PIPE_TIMEOUT_INFINITE);
       zink_reset_batch_state(ctx, bs);
@@ -374,7 +376,7 @@ submit_queue(void *data, void *gdata, int thread_index)
       }
    }
 
-   if (VKSCR(ResetFences)(screen->dev, 1, &bs->fence.fence) != VK_SUCCESS) {
+   if (bs->fence.fence && VKSCR(ResetFences)(screen->dev, 1, &bs->fence.fence) != VK_SUCCESS) {
       mesa_loge("ZINK: vkResetFences failed");
    }
 
@@ -473,7 +475,7 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch *batch)
          if (!zink_check_batch_completion(ctx, fence->batch_id, true))
             break;
 
-         if (bs->fence.submitted && !bs->fence.completed)
+         if (bs->fence.submitted && !bs->fence.completed && bs->fence.fence)
             /* this fence is already done, so we need vulkan to release the cmdbuf */
             zink_vkfence_wait(screen, &bs->fence, PIPE_TIMEOUT_INFINITE);
          pop_batch_state(ctx);
diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 79d2ded9645..0b89b7c02e2 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -2612,8 +2612,12 @@ reapply_color_write(struct zink_context *ctx)
 static void
 stall(struct zink_context *ctx)
 {
+   struct zink_screen *screen = zink_screen(ctx->base.screen);
    sync_flush(ctx, zink_batch_state(ctx->last_fence));
-   zink_vkfence_wait(zink_screen(ctx->base.screen), ctx->last_fence, PIPE_TIMEOUT_INFINITE);
+   if (ctx->have_timelines)
+      zink_screen_timeline_wait(screen, ctx->last_fence->batch_id, PIPE_TIMEOUT_INFINITE);
+   else
+      zink_vkfence_wait(screen, ctx->last_fence, PIPE_TIMEOUT_INFINITE);
    zink_batch_reset_all(ctx);
 }
 
@@ -3326,7 +3330,9 @@ zink_flush(struct pipe_context *pctx,
          * in some cases in order to correctly draw the first frame, though it's
          * unknown at this time why this is the case
          */
-         if (!ctx->first_frame_done)
+         if (screen->info.have_KHR_timeline_semaphore)
+            zink_screen_timeline_wait(screen, fence->batch_id, PIPE_TIMEOUT_INFINITE);
+         else
             zink_vkfence_wait(screen, fence, PIPE_TIMEOUT_INFINITE);
          ctx->first_frame_done = true;
       }
diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c
index a47398af865..52a3cc4fb67 100644
--- a/src/gallium/drivers/zink/zink_fence.c
+++ b/src/gallium/drivers/zink/zink_fence.c
@@ -117,6 +117,27 @@ tc_fence_finish(struct zink_context *ctx, struct zink_tc_fence *mfence, uint64_t
    return true;
 }
 
+static bool
+fence_wait(struct zink_screen *screen, struct zink_fence *fence, uint64_t timeout_ns)
+{
+   if (screen->device_lost)
+      return true;
+   if (p_atomic_read(&fence->completed))
+      return true;
+
+   assert(fence->batch_id);
+   assert(fence->submitted);
+
+   bool success = zink_screen_timeline_wait(screen, fence->batch_id, timeout_ns);
+
+   if (success) {
+      p_atomic_set(&fence->completed, true);
+      zink_batch_state(fence)->usage.usage = 0;
+      zink_screen_update_last_finished(screen, fence->batch_id);
+   }
+   return success;
+}
+
 bool
 zink_vkfence_wait(struct zink_screen *screen, struct zink_fence *fence, uint64_t timeout_ns)
 {
@@ -186,6 +207,8 @@ zink_fence_finish(struct zink_screen *screen, struct pipe_context *pctx, struct
    if (fence->submitted && zink_screen_check_last_finished(screen, fence->batch_id))
       return true;
 
+   if (screen->info.have_KHR_timeline_semaphore)
+      return fence_wait(screen, fence, timeout_ns);
    return zink_vkfence_wait(screen, fence, timeout_ns);
 }
 



More information about the mesa-commit mailing list