From f1f5627286e101e6b7724310648b097065f21dfa Mon Sep 17 00:00:00 2001 From: Sidney Just Date: Tue, 22 Mar 2022 22:57:49 -0700 Subject: [PATCH] zink: implement win32 fence import Reviewed-By: Mike Blumenkrantz Part-of: --- 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;