zink: add a util for getting cached fd semaphores
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>
Wed, 30 Aug 2023 20:13:33 +0000 (16:13 -0400)
committerMarge Bot <emma+marge@anholt.net>
Sat, 9 Sep 2023 03:44:05 +0000 (03:44 +0000)
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24962>

src/gallium/drivers/zink/zink_screen.c
src/gallium/drivers/zink/zink_screen.h

index 6da99be..7991961 100644 (file)
@@ -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)
 {
index 57b6388..9151db4 100644 (file)
@@ -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);