diff --git a/src/gallium/drivers/zink/zink_fence.c b/src/gallium/drivers/zink/zink_fence.c index 1c107a2182e..c71eccd6748 100644 --- a/src/gallium/drivers/zink/zink_fence.c +++ b/src/gallium/drivers/zink/zink_fence.c @@ -275,6 +275,35 @@ zink_fence_server_sync(struct pipe_context *pctx, struct pipe_fence_handle *pfen util_dynarray_append(&ctx->bs->fences, struct zink_tc_fence*, mfence); } +static struct zink_tc_fence* +zink_semaphore_fence_create(struct pipe_screen *pscreen, VkSemaphoreType sema_type) +{ + struct zink_screen *screen = zink_screen(pscreen); + VkResult result; + + struct zink_tc_fence *mfence = zink_create_tc_fence(); + if (!mfence) + return NULL; + + const VkSemaphoreTypeCreateInfo tci = { + VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, + NULL, + sema_type, + }; + const VkSemaphoreCreateInfo sci = { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, + &tci + }; + result = VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &mfence->sem); + if (result != VK_SUCCESS) { + mesa_loge("ZINK: vkCreateSemaphore failed (%s)", vk_Result_to_str(result)); + FREE(mfence); + return NULL; + } + + return mfence; +} + void zink_create_fence_fd(struct pipe_context *pctx, struct pipe_fence_handle **pfence, int fd, enum pipe_fd_type type) { @@ -287,26 +316,11 @@ zink_create_fence_fd(struct pipe_context *pctx, struct pipe_fence_handle **pfenc }; assert(fd >= 0); + *pfence = NULL; - struct zink_tc_fence *mfence = zink_create_tc_fence(); + struct zink_tc_fence *mfence = zink_semaphore_fence_create(pctx->screen, semtype[type]); if (!mfence) - goto fail_tc_fence_create; - - const VkSemaphoreTypeCreateInfo tci = { - VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, - NULL, - semtype[type], - }; - const VkSemaphoreCreateInfo sci = { - .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, - &tci - }; - - result = VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &mfence->sem); - if (result != VK_SUCCESS) { - mesa_loge("ZINK: vkCreateSemaphore failed (%s)", vk_Result_to_str(result)); - goto fail_sem_create; - } + return; int dup_fd = os_dupfd_cloexec(fd); if (dup_fd < 0) @@ -346,10 +360,6 @@ fail_sem_import: close(dup_fd); fail_fd_dup: VKSCR(DestroySemaphore)(screen->dev, mfence->sem, NULL); -fail_sem_create: - FREE(mfence); -fail_tc_fence_create: - *pfence = NULL; } #ifdef _WIN32