v3dv: signal semaphore/fence if needed after acquiring a swapchain image
Fixes:
dEQP-VK.wsi.*.swapchain.acquire.too_many
dEQP-VK.wsi.*.swapchain.acquire.too_many_timeout
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/vulkan/v3dv_wsi.c b/src/broadcom/vulkan/v3dv_wsi.c
index c47a51a..fec8039 100644
--- a/src/broadcom/vulkan/v3dv_wsi.c
+++ b/src/broadcom/vulkan/v3dv_wsi.c
@@ -243,10 +243,23 @@
uint32_t* pImageIndex)
{
V3DV_FROM_HANDLE(v3dv_device, device, _device);
+ V3DV_FROM_HANDLE(v3dv_fence, fence, pAcquireInfo->fence);
+ V3DV_FROM_HANDLE(v3dv_semaphore, semaphore, pAcquireInfo->semaphore);
+
struct v3dv_physical_device *pdevice = &device->instance->physicalDevice;
- return wsi_common_acquire_next_image2(&pdevice->wsi_device, _device,
- pAcquireInfo, pImageIndex);
+ VkResult result;
+ result = wsi_common_acquire_next_image2(&pdevice->wsi_device, _device,
+ pAcquireInfo, pImageIndex);
+
+ if (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR) {
+ if (fence)
+ drmSyncobjSignal(device->render_fd, &fence->sync, 1);
+ if (semaphore)
+ drmSyncobjSignal(device->render_fd, &semaphore->sync, 1);
+ }
+
+ return result;
}
VkResult v3dv_QueuePresentKHR(