vulkan/wsi: Add a helper for AcquireNextImage
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 16 Nov 2017 18:44:41 +0000 (10:44 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 4 Dec 2017 18:04:19 +0000 (10:04 -0800)
Unfortunately, due to the fact that AcquireNextImage does not take a
queue, the ANV trick for triggering the fence won't work in general.  We
leave dealing with the fence up to the caller for now.

Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Chad Versace <chadversary@chromium.org>
src/amd/vulkan/radv_wsi.c
src/intel/vulkan/anv_wsi.c
src/vulkan/wsi/wsi_common.c
src/vulkan/wsi/wsi_common.h

index d00e0281689df55091bba1009aadc94d2598c3a7..d864a9f613f615c332ac8df560d5616bb14d840f 100644 (file)
@@ -206,18 +206,23 @@ VkResult radv_GetSwapchainImagesKHR(
 }
 
 VkResult radv_AcquireNextImageKHR(
-       VkDevice                                     device,
-       VkSwapchainKHR                               _swapchain,
+       VkDevice                                     _device,
+       VkSwapchainKHR                               swapchain,
        uint64_t                                     timeout,
        VkSemaphore                                  semaphore,
        VkFence                                      _fence,
        uint32_t*                                    pImageIndex)
 {
-       RADV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
+       RADV_FROM_HANDLE(radv_device, device, _device);
+       struct radv_physical_device *pdevice = device->physical_device;
        RADV_FROM_HANDLE(radv_fence, fence, _fence);
 
-       VkResult result = swapchain->acquire_next_image(swapchain, timeout, semaphore,
-                                                       pImageIndex);
+       VkResult result = wsi_common_acquire_next_image(&pdevice->wsi_device,
+                                                       _device,
+                                                       swapchain,
+                                                       timeout,
+                                                       semaphore,
+                                                       pImageIndex);
 
        if (fence && (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR)) {
                fence->submitted = true;
index 62368a10a066ce693fdf6da231282749098ac613..6f5aaf6b7044f7ec4701fbe469ff71852fc48a97 100644 (file)
@@ -234,24 +234,27 @@ VkResult anv_GetSwapchainImagesKHR(
 
 VkResult anv_AcquireNextImageKHR(
     VkDevice                                     _device,
-    VkSwapchainKHR                               _swapchain,
+    VkSwapchainKHR                               swapchain,
     uint64_t                                     timeout,
     VkSemaphore                                  semaphore,
-    VkFence                                      _fence,
+    VkFence                                      fence,
     uint32_t*                                    pImageIndex)
 {
    ANV_FROM_HANDLE(anv_device, device, _device);
-   ANV_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
-   ANV_FROM_HANDLE(anv_fence, fence, _fence);
+   struct anv_physical_device *pdevice = &device->instance->physicalDevice;
 
-   VkResult result = swapchain->acquire_next_image(swapchain, timeout,
-                                                   semaphore, pImageIndex);
+   VkResult result = wsi_common_acquire_next_image(&pdevice->wsi_device,
+                                                   _device,
+                                                   swapchain,
+                                                   timeout,
+                                                   semaphore,
+                                                   pImageIndex);
 
    /* Thanks to implicit sync, the image is ready immediately.  However, we
     * should wait for the current GPU state to finish.
     */
-   if (fence)
-      anv_QueueSubmit(anv_queue_to_handle(&device->queue), 0, NULL, _fence);
+   if (fence != VK_NULL_HANDLE)
+      anv_QueueSubmit(anv_queue_to_handle(&device->queue), 0, NULL, fence);
 
    return result;
 }
index 69cb71dfdbc5e3e4688f2a41cc818c9cc3bbca46..50680a6fd751d3029575058b8ee0c6ecd9bcaa30 100644 (file)
@@ -539,6 +539,20 @@ wsi_common_get_images(VkSwapchainKHR _swapchain,
    return vk_outarray_status(&images);
 }
 
+VkResult
+wsi_common_acquire_next_image(const struct wsi_device *wsi,
+                              VkDevice device,
+                              VkSwapchainKHR _swapchain,
+                              uint64_t timeout,
+                              VkSemaphore semaphore,
+                              uint32_t *pImageIndex)
+{
+   WSI_FROM_HANDLE(wsi_swapchain, swapchain, _swapchain);
+
+   return swapchain->acquire_next_image(swapchain, timeout,
+                                        semaphore, pImageIndex);
+}
+
 VkResult
 wsi_common_queue_present(const struct wsi_device *wsi,
                          VkDevice device,
index 6ed10b85921d1bb2f898bd2352b9380076a2351f..aab6ca1c2717d79f074d25ae2f2861dbc159e69c 100644 (file)
@@ -220,6 +220,14 @@ wsi_common_get_images(VkSwapchainKHR _swapchain,
                       uint32_t *pSwapchainImageCount,
                       VkImage *pSwapchainImages);
 
+VkResult
+wsi_common_acquire_next_image(const struct wsi_device *wsi,
+                              VkDevice device,
+                              VkSwapchainKHR swapchain,
+                              uint64_t timeout,
+                              VkSemaphore semaphore,
+                              uint32_t *pImageIndex);
+
 VkResult
 wsi_common_create_swapchain(struct wsi_device *wsi,
                             VkDevice device,