diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c index 40f948c1623..25954f41ab1 100644 --- a/src/virtio/vulkan/vn_android.c +++ b/src/virtio/vulkan/vn_android.c @@ -782,19 +782,18 @@ vn_AcquireImageANDROID(VkDevice device, return vn_result(dev->instance, result); } -static VkResult -vn_android_sync_fence_create(struct vn_queue *queue, bool external) +static inline VkResult +vn_android_sync_fence_create(struct vn_queue *queue) { struct vn_device *dev = queue->device; const VkExportFenceCreateInfo export_info = { .sType = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, - .pNext = NULL, .handleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, }; const VkFenceCreateInfo create_info = { .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, - .pNext = external ? &export_info : NULL, + .pNext = &export_info, .flags = 0, }; return vn_CreateFence(vn_device_to_handle(dev), &create_info, NULL, @@ -812,8 +811,6 @@ vn_QueueSignalReleaseImageANDROID(VkQueue _queue, struct vn_queue *queue = vn_queue_from_handle(_queue); struct vn_device *dev = queue->device; const VkAllocationCallbacks *alloc = &dev->base.base.alloc; - const bool has_sync_fd_fence_export = - dev->physical_device->renderer_sync_fd.fence_exportable; VkDevice device = vn_device_to_handle(dev); VkPipelineStageFlags local_stage_masks[8]; VkPipelineStageFlags *stage_masks = local_stage_masks; @@ -827,7 +824,7 @@ vn_QueueSignalReleaseImageANDROID(VkQueue _queue, /* lazily create sync fence for Android wsi */ if (queue->sync_fence == VK_NULL_HANDLE) { - result = vn_android_sync_fence_create(queue, has_sync_fd_fence_export); + result = vn_android_sync_fence_create(queue); if (result != VK_SUCCESS) return result; } @@ -845,14 +842,9 @@ vn_QueueSignalReleaseImageANDROID(VkQueue _queue, const VkSubmitInfo submit_info = { .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, - .pNext = NULL, .waitSemaphoreCount = waitSemaphoreCount, .pWaitSemaphores = pWaitSemaphores, .pWaitDstStageMask = stage_masks, - .commandBufferCount = 0, - .pCommandBuffers = NULL, - .signalSemaphoreCount = 0, - .pSignalSemaphores = NULL, }; result = vn_QueueSubmit(_queue, 1, &submit_info, queue->sync_fence); @@ -862,22 +854,12 @@ vn_QueueSignalReleaseImageANDROID(VkQueue _queue, if (result != VK_SUCCESS) return vn_error(dev->instance, result); - if (has_sync_fd_fence_export) { - const VkFenceGetFdInfoKHR fd_info = { - .sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, - .pNext = NULL, - .fence = queue->sync_fence, - .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, - }; - result = vn_GetFenceFdKHR(device, &fd_info, &fd); - } else { - result = - vn_WaitForFences(device, 1, &queue->sync_fence, VK_TRUE, UINT64_MAX); - if (result != VK_SUCCESS) - return vn_error(dev->instance, result); - - result = vn_ResetFences(device, 1, &queue->sync_fence); - } + const VkFenceGetFdInfoKHR fd_info = { + .sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, + .fence = queue->sync_fence, + .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, + }; + result = vn_GetFenceFdKHR(device, &fd_info, &fd); if (result != VK_SUCCESS) return vn_error(dev->instance, result); diff --git a/src/virtio/vulkan/vn_device.c b/src/virtio/vulkan/vn_device.c index 5bfc6f8bfa2..ab9aea7cdd5 100644 --- a/src/virtio/vulkan/vn_device.c +++ b/src/virtio/vulkan/vn_device.c @@ -252,8 +252,9 @@ vn_device_fix_create_info(const struct vn_device *dev, } if (app_exts->ANDROID_native_buffer) { - if (!app_exts->KHR_external_fence_fd && - physical_dev->renderer_sync_fd.fence_exportable) { + /* see vn_QueueSignalReleaseImageANDROID */ + if (!app_exts->KHR_external_fence_fd) { + assert(physical_dev->renderer_sync_fd.fence_exportable); extra_exts[extra_count++] = VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME; } @@ -297,8 +298,8 @@ vn_device_fix_create_info(const struct vn_device *dev, } /* see vn_queue_submission_count_batch_semaphores */ - if (!app_exts->KHR_external_semaphore_fd && - physical_dev->renderer_sync_fd.semaphore_importable) { + if (!app_exts->KHR_external_semaphore_fd && has_wsi) { + assert(physical_dev->renderer_sync_fd.semaphore_importable); extra_exts[extra_count++] = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME; } diff --git a/src/virtio/vulkan/vn_physical_device.c b/src/virtio/vulkan/vn_physical_device.c index 5bd8da70415..0d626a4a0c8 100644 --- a/src/virtio/vulkan/vn_physical_device.c +++ b/src/virtio/vulkan/vn_physical_device.c @@ -950,7 +950,20 @@ vn_physical_device_get_native_extensions( if (can_external_mem && renderer_exts->EXT_image_drm_format_modifier && renderer_exts->EXT_queue_family_foreign) { exts->ANDROID_external_memory_android_hardware_buffer = true; - exts->ANDROID_native_buffer = true; + + /* For wsi, we require renderer: + * - semaphore sync fd import for queue submission to skip scrubbing the + * wsi wait semaphores. + * - fence sync fd export for QueueSignalReleaseImageANDROID to export a + * sync fd. + * + * TODO: relax these requirements by: + * - properly scrubbing wsi wait semaphores + * - not creating external fence but exporting sync fd directly + */ + if (physical_dev->renderer_sync_fd.semaphore_importable && + physical_dev->renderer_sync_fd.fence_exportable) + exts->ANDROID_native_buffer = true; } if (physical_dev->renderer_sync_fd.fence_exportable) @@ -967,9 +980,6 @@ vn_physical_device_get_native_extensions( } #endif /* ANDROID */ - /* Semaphore sync fd import required for WSI to skip scrubbing - * the wsi/external wait semaphores. - */ #ifdef VN_USE_WSI_PLATFORM if (renderer_exts->EXT_image_drm_format_modifier && renderer_exts->EXT_queue_family_foreign &&