buildroot/package/mesa3d/0122-zink-add-a-binary-sema...

93 lines
4.0 KiB
Diff

From 68b3ac8688ee43cd7efa1e592392124a0c0aaa14 Mon Sep 17 00:00:00 2001
From: Imagination Technologies <powervr@imgtec.com>
Date: Thu, 12 Jan 2023 14:21:20 -0500
Subject: [PATCH 122/168] zink: add a binary semaphore cache
after being waited upon, a binary semaphore can be reused, which saves
tons of present-related ioctls when fps is high
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20681>
---
src/gallium/drivers/zink/zink_batch.c | 9 +++++++--
src/gallium/drivers/zink/zink_screen.c | 15 +++++++++++++++
src/gallium/drivers/zink/zink_types.h | 3 +++
3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 7063463404d..5ee10eadf63 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -198,8 +198,13 @@ unref_resources(struct zink_screen *screen, struct zink_batch_state *bs)
/* this is typically where resource objects get destroyed */
zink_resource_object_reference(screen, &obj, NULL);
}
- while (util_dynarray_contains(&bs->unref_semaphores, VkSemaphore))
- VKSCR(DestroySemaphore)(screen->dev, util_dynarray_pop(&bs->unref_semaphores, VkSemaphore), NULL);
+ /* check the arrays first to avoid locking unnecessarily */
+ if (!util_dynarray_contains(&bs->unref_semaphores, VkSemaphore))
+ return;
+ simple_mtx_lock(&screen->semaphores_lock);
+ util_dynarray_append_dynarray(&screen->semaphores, &bs->unref_semaphores);
+ util_dynarray_clear(&bs->unref_semaphores);
+ simple_mtx_unlock(&screen->semaphores_lock);
}
/* utility for resetting a batch state; called on context destruction */
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index bb3f92c9612..90ff84e9cb3 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -1415,6 +1415,10 @@ zink_destroy_screen(struct pipe_screen *pscreen)
if (screen->threaded)
util_queue_destroy(&screen->flush_queue);
+ simple_mtx_destroy(&screen->semaphores_lock);
+ while (util_dynarray_contains(&screen->semaphores, VkSemaphore))
+ VKSCR(DestroySemaphore)(screen->dev, util_dynarray_pop(&screen->semaphores, VkSemaphore), NULL);
+
simple_mtx_destroy(&screen->queue_lock);
VKSCR(DestroyDevice)(screen->dev, NULL);
VKSCR(DestroyInstance)(screen->instance, NULL);
@@ -2463,6 +2467,14 @@ zink_create_semaphore(struct zink_screen *screen)
0
};
VkSemaphore sem = VK_NULL_HANDLE;
+ if (util_dynarray_contains(&screen->semaphores, VkSemaphore)) {
+ simple_mtx_lock(&screen->semaphores_lock);
+ if (util_dynarray_contains(&screen->semaphores, VkSemaphore))
+ sem = util_dynarray_pop(&screen->semaphores, VkSemaphore);
+ simple_mtx_unlock(&screen->semaphores_lock);
+ }
+ if (sem)
+ return sem;
VkResult ret = VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &sem);
return ret == VK_SUCCESS ? sem : VK_NULL_HANDLE;
}
@@ -2725,6 +2737,9 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
util_idalloc_mt_init_tc(&screen->buffer_ids);
+ simple_mtx_init(&screen->semaphores_lock, mtx_plain);
+ util_dynarray_init(&screen->semaphores, screen);
+
util_vertex_state_cache_init(&screen->vertex_state_cache,
zink_create_vertex_state, zink_vertex_state_destroy);
screen->base.create_vertex_state = zink_cache_create_vertex_state;
diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h
index 0164bf2e348..5aa2b0579b0 100644
--- a/src/gallium/drivers/zink/zink_types.h
+++ b/src/gallium/drivers/zink/zink_types.h
@@ -1184,6 +1184,9 @@ struct zink_screen {
struct util_queue flush_queue;
struct zink_context *copy_context;
+ simple_mtx_t semaphores_lock;
+ struct util_dynarray semaphores;
+
unsigned buffer_rebind_counter;
unsigned image_rebind_counter;
unsigned robust_ctx_count;
--
2.17.1