From 778b51f491cfe56da463195e1392293379b9fe26 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 4 Dec 2019 12:47:31 -0600 Subject: [PATCH] vulkan/wsi: Add a hooks for signaling semaphores and fences Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Lionel Landwerlin --- src/vulkan/wsi/wsi_common.c | 23 ++++++++++++++++++++++- src/vulkan/wsi/wsi_common.h | 16 ++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 3abffe3dee7..65ab543cc5d 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -1004,7 +1004,28 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi, { WSI_FROM_HANDLE(wsi_swapchain, swapchain, pAcquireInfo->swapchain); - return swapchain->acquire_next_image(swapchain, pAcquireInfo, pImageIndex); + VkResult result = swapchain->acquire_next_image(swapchain, pAcquireInfo, + pImageIndex); + if (result != VK_SUCCESS) + return result; + + if (pAcquireInfo->semaphore != VK_NULL_HANDLE && + wsi->signal_semaphore_for_memory != NULL) { + struct wsi_image *image = + swapchain->get_wsi_image(swapchain, *pImageIndex); + wsi->signal_semaphore_for_memory(device, pAcquireInfo->semaphore, + image->memory); + } + + if (pAcquireInfo->fence != VK_NULL_HANDLE && + wsi->signal_fence_for_memory != NULL) { + struct wsi_image *image = + swapchain->get_wsi_image(swapchain, *pImageIndex); + wsi->signal_fence_for_memory(device, pAcquireInfo->fence, + image->memory); + } + + return VK_SUCCESS; } VkResult diff --git a/src/vulkan/wsi/wsi_common.h b/src/vulkan/wsi/wsi_common.h index d15dea7b0eb..704c1abd809 100644 --- a/src/vulkan/wsi/wsi_common.h +++ b/src/vulkan/wsi/wsi_common.h @@ -130,6 +130,22 @@ struct wsi_device { uint64_t (*image_get_modifier)(VkImage image); + /* Signals the semaphore such that any wait on the semaphore will wait on + * any reads or writes on the give memory object. This is used to + * implement the semaphore signal operation in vkAcquireNextImage. + */ + void (*signal_semaphore_for_memory)(VkDevice device, + VkSemaphore semaphore, + VkDeviceMemory memory); + + /* Signals the fence such that any wait on the fence will wait on any reads + * or writes on the give memory object. This is used to implement the + * semaphore signal operation in vkAcquireNextImage. + */ + void (*signal_fence_for_memory)(VkDevice device, + VkFence fence, + VkDeviceMemory memory); + #define WSI_CB(cb) PFN_vk##cb cb WSI_CB(AllocateMemory); WSI_CB(AllocateCommandBuffers); -- 2.30.2