- RADV_FROM_HANDLE(radv_fence, fence, _fence);
-
- 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;
- fence->signalled = true;
+ RADV_FROM_HANDLE(radv_fence, fence, pAcquireInfo->fence);
+ RADV_FROM_HANDLE(radv_semaphore, semaphore, pAcquireInfo->semaphore);
+
+ VkResult result = wsi_common_acquire_next_image2(&pdevice->wsi_device,
+ _device,
+ pAcquireInfo,
+ pImageIndex);
+
+ if (result == VK_SUCCESS || result == VK_SUBOPTIMAL_KHR) {
+ if (fence) {
+ struct radv_fence_part *part =
+ fence->temporary.kind != RADV_FENCE_NONE ?
+ &fence->temporary : &fence->permanent;
+
+ switch (part->kind) {
+ case RADV_FENCE_NONE:
+ break;
+ case RADV_FENCE_WINSYS:
+ device->ws->signal_fence(part->fence);
+ break;
+ case RADV_FENCE_SYNCOBJ:
+ device->ws->signal_syncobj(device->ws, part->syncobj, 0);
+ break;
+ default:
+ unreachable("Invalid WSI fence type");
+ }
+ }
+ if (semaphore) {
+ struct radv_semaphore_part *part =
+ semaphore->temporary.kind != RADV_SEMAPHORE_NONE ?
+ &semaphore->temporary : &semaphore->permanent;
+
+ switch (part->kind) {
+ case RADV_SEMAPHORE_NONE:
+ case RADV_SEMAPHORE_WINSYS:
+ /* Do not need to do anything. */
+ break;
+ case RADV_SEMAPHORE_TIMELINE:
+ unreachable("WSI only allows binary semaphores.");
+ case RADV_SEMAPHORE_SYNCOBJ:
+ device->ws->signal_syncobj(device->ws, part->syncobj, 0);
+ break;
+ }
+ }