vulkan/wsi: Add a helper for AcquireNextImage

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>
This commit is contained in:
Jason Ekstrand
2017-11-16 10:44:41 -08:00
parent 8ff49951c3
commit 516dfb34e1
4 changed files with 43 additions and 13 deletions

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

View 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;
}

View 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,

View 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,