Mesa (main): zink: implement win32 fence import

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun May 15 20:23:01 UTC 2022


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

Author: Sidney Just <justsid at x-plane.com>
Date:   Tue Mar 22 22:57:49 2022 -0700

zink: implement win32 fence import

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15504>

---

 src/gallium/drivers/zink/zink_fence.c  | 43 ++++++++++++++++++++++++++++++++++
 src/gallium/drivers/zink/zink_fence.h  |  4 ++++
 src/gallium/drivers/zink/zink_screen.c |  4 ++++
 3 files changed, 51 insertions(+)

diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c
index 90990ecd4c4..65e94eb4968 100644
--- a/src/gallium/drivers/zink/zink_fence.c
+++ b/src/gallium/drivers/zink/zink_fence.c
@@ -261,6 +261,49 @@ fail:
    FREE(mfence);
 }
 
+#ifdef _WIN32
+void
+zink_create_fence_win32(struct pipe_screen *pscreen, struct pipe_fence_handle **pfence, void *handle, enum pipe_fd_type type)
+{
+   struct zink_screen *screen = zink_screen(pscreen);
+   VkResult ret = VK_ERROR_UNKNOWN;
+   VkSemaphoreCreateInfo sci = {
+      VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
+      NULL,
+      0
+   };
+   struct zink_tc_fence *mfence = zink_create_tc_fence();
+   VkExternalSemaphoreHandleTypeFlagBits flags[] = {
+      [PIPE_FD_TYPE_NATIVE_SYNC] = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,
+      [PIPE_FD_TYPE_SYNCOBJ] = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT,
+   };
+   VkImportSemaphoreWin32HandleInfoKHR sdi = {0};
+   assert(type < ARRAY_SIZE(flags));
+
+   *pfence = NULL;
+
+   if (VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &mfence->sem) != VK_SUCCESS) {
+      FREE(mfence);
+      return;
+   }
+
+   sdi.sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR;
+   sdi.semaphore = mfence->sem;
+   sdi.handleType = flags[type];
+   sdi.handle = handle;
+   ret = VKSCR(ImportSemaphoreWin32HandleKHR)(screen->dev, &sdi);
+
+   if (!zink_screen_handle_vkresult(screen, ret))
+      goto fail;
+   *pfence = (struct pipe_fence_handle *)mfence;
+   return;
+
+fail:
+   VKSCR(DestroySemaphore)(screen->dev, mfence->sem, NULL);
+   FREE(mfence);
+}
+#endif
+
 void
 zink_screen_fence_init(struct pipe_screen *pscreen)
 {
diff --git a/src/gallium/drivers/zink/zink_fence.h b/src/gallium/drivers/zink/zink_fence.h
index 1cd82969c5e..f0693062f12 100644
--- a/src/gallium/drivers/zink/zink_fence.h
+++ b/src/gallium/drivers/zink/zink_fence.h
@@ -80,6 +80,10 @@ zink_fence_reference(struct zink_screen *screen,
 
 void
 zink_create_fence_fd(struct pipe_context *pctx, struct pipe_fence_handle **pfence, int fd, enum pipe_fd_type type);
+#ifdef _WIN32
+void
+zink_create_fence_win32(struct pipe_screen *screen, struct pipe_fence_handle **pfence, void *handle, enum pipe_fd_type type);
+#endif
 void
 zink_fence_server_signal(struct pipe_context *pctx, struct pipe_fence_handle *pfence);
 void
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index eaff4f27a12..fd8e9fc747a 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -2183,6 +2183,10 @@ zink_internal_create_screen(const struct pipe_screen_config *config)
       screen->base.is_dmabuf_modifier_supported = zink_is_dmabuf_modifier_supported;
       screen->base.get_dmabuf_modifier_planes = zink_get_dmabuf_modifier_planes;
    }
+#ifdef _WIN32
+   if (screen->info.have_KHR_external_memory_win32)
+      screen->base.create_fence_win32 = zink_create_fence_win32;
+#endif
    screen->base.context_create = zink_context_create;
    screen->base.flush_frontbuffer = zink_flush_frontbuffer;
    screen->base.destroy = zink_destroy_screen;



More information about the mesa-commit mailing list