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

Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Aug 30 16:13:33 2023 -0400

zink: add a util for getting cached fd semaphores

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

---

 src/gallium/drivers/zink/zink_screen.c | 27 +++++++++++++++++++++++++++
 src/gallium/drivers/zink/zink_screen.h |  3 +++
 2 files changed, 30 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_screen.c 
b/src/gallium/drivers/zink/zink_screen.c
index 6da99be70d5..7991961f29d 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -2172,6 +2172,33 @@ zink_screen_init_semaphore(struct zink_screen *screen)
    return VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &screen->sem) == 
VK_SUCCESS;
 }
 
+VkSemaphore
+zink_create_exportable_semaphore(struct zink_screen *screen)
+{
+   VkExportSemaphoreCreateInfo eci = {
+      VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
+      NULL,
+      VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT
+   };
+   VkSemaphoreCreateInfo sci = {
+      VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
+      &eci,
+      0
+   };
+
+   VkSemaphore sem = VK_NULL_HANDLE;
+   if (util_dynarray_contains(&screen->fd_semaphores, VkSemaphore)) {
+      simple_mtx_lock(&screen->semaphores_lock);
+      if (util_dynarray_contains(&screen->fd_semaphores, VkSemaphore))
+         sem = util_dynarray_pop(&screen->fd_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;
+}
+
 bool
 zink_screen_timeline_wait(struct zink_screen *screen, uint64_t batch_id, 
uint64_t timeout)
 {
diff --git a/src/gallium/drivers/zink/zink_screen.h 
b/src/gallium/drivers/zink/zink_screen.h
index 57b63880e04..9151db43fc1 100644
--- a/src/gallium/drivers/zink/zink_screen.h
+++ b/src/gallium/drivers/zink/zink_screen.h
@@ -122,6 +122,9 @@ zink_screen_lock_context(struct zink_screen *screen);
 void
 zink_screen_unlock_context(struct zink_screen *screen);
 
+VkSemaphore
+zink_create_exportable_semaphore(struct zink_screen *screen);
+
 VkFormat
 zink_get_format(struct zink_screen *screen, enum pipe_format format);
 

Reply via email to