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