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