zink: implement win32 fence import

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15504>
This commit is contained in:
Sidney Just 2022-03-22 22:57:49 -07:00 committed by Marge Bot
parent 7e3d6a0238
commit f1f5627286
3 changed files with 51 additions and 0 deletions

View File

@ -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)
{

View File

@ -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

View File

@ -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;