mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 13:58:04 +02:00
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:
parent
8ff49951c3
commit
516dfb34e1
4 changed files with 43 additions and 13 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue