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