venus: tighten up the sync fd requirements for Android wsi

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379>
This commit is contained in:
Yiwei Zhang 2023-02-15 09:48:49 -08:00 committed by Marge Bot
parent 657cd2e1d4
commit 19c3608672
3 changed files with 29 additions and 36 deletions

View file

@ -782,19 +782,18 @@ vn_AcquireImageANDROID(VkDevice device,
return vn_result(dev->instance, result); return vn_result(dev->instance, result);
} }
static VkResult static inline VkResult
vn_android_sync_fence_create(struct vn_queue *queue, bool external) vn_android_sync_fence_create(struct vn_queue *queue)
{ {
struct vn_device *dev = queue->device; struct vn_device *dev = queue->device;
const VkExportFenceCreateInfo export_info = { const VkExportFenceCreateInfo export_info = {
.sType = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
.pNext = NULL,
.handleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, .handleTypes = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,
}; };
const VkFenceCreateInfo create_info = { const VkFenceCreateInfo create_info = {
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
.pNext = external ? &export_info : NULL, .pNext = &export_info,
.flags = 0, .flags = 0,
}; };
return vn_CreateFence(vn_device_to_handle(dev), &create_info, NULL, 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_queue *queue = vn_queue_from_handle(_queue);
struct vn_device *dev = queue->device; struct vn_device *dev = queue->device;
const VkAllocationCallbacks *alloc = &dev->base.base.alloc; 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); VkDevice device = vn_device_to_handle(dev);
VkPipelineStageFlags local_stage_masks[8]; VkPipelineStageFlags local_stage_masks[8];
VkPipelineStageFlags *stage_masks = local_stage_masks; VkPipelineStageFlags *stage_masks = local_stage_masks;
@ -827,7 +824,7 @@ vn_QueueSignalReleaseImageANDROID(VkQueue _queue,
/* lazily create sync fence for Android wsi */ /* lazily create sync fence for Android wsi */
if (queue->sync_fence == VK_NULL_HANDLE) { 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) if (result != VK_SUCCESS)
return result; return result;
} }
@ -845,14 +842,9 @@ vn_QueueSignalReleaseImageANDROID(VkQueue _queue,
const VkSubmitInfo submit_info = { const VkSubmitInfo submit_info = {
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.pNext = NULL,
.waitSemaphoreCount = waitSemaphoreCount, .waitSemaphoreCount = waitSemaphoreCount,
.pWaitSemaphores = pWaitSemaphores, .pWaitSemaphores = pWaitSemaphores,
.pWaitDstStageMask = stage_masks, .pWaitDstStageMask = stage_masks,
.commandBufferCount = 0,
.pCommandBuffers = NULL,
.signalSemaphoreCount = 0,
.pSignalSemaphores = NULL,
}; };
result = vn_QueueSubmit(_queue, 1, &submit_info, queue->sync_fence); result = vn_QueueSubmit(_queue, 1, &submit_info, queue->sync_fence);
@ -862,22 +854,12 @@ vn_QueueSignalReleaseImageANDROID(VkQueue _queue,
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return vn_error(dev->instance, result); return vn_error(dev->instance, result);
if (has_sync_fd_fence_export) { const VkFenceGetFdInfoKHR fd_info = {
const VkFenceGetFdInfoKHR fd_info = { .sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR,
.sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, .fence = queue->sync_fence,
.pNext = NULL, .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT,
.fence = queue->sync_fence, };
.handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, result = vn_GetFenceFdKHR(device, &fd_info, &fd);
};
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);
}
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return vn_error(dev->instance, result); return vn_error(dev->instance, result);

View file

@ -252,8 +252,9 @@ vn_device_fix_create_info(const struct vn_device *dev,
} }
if (app_exts->ANDROID_native_buffer) { if (app_exts->ANDROID_native_buffer) {
if (!app_exts->KHR_external_fence_fd && /* see vn_QueueSignalReleaseImageANDROID */
physical_dev->renderer_sync_fd.fence_exportable) { if (!app_exts->KHR_external_fence_fd) {
assert(physical_dev->renderer_sync_fd.fence_exportable);
extra_exts[extra_count++] = extra_exts[extra_count++] =
VK_KHR_EXTERNAL_FENCE_FD_EXTENSION_NAME; 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 */ /* see vn_queue_submission_count_batch_semaphores */
if (!app_exts->KHR_external_semaphore_fd && if (!app_exts->KHR_external_semaphore_fd && has_wsi) {
physical_dev->renderer_sync_fd.semaphore_importable) { assert(physical_dev->renderer_sync_fd.semaphore_importable);
extra_exts[extra_count++] = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME; extra_exts[extra_count++] = VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME;
} }

View file

@ -950,7 +950,20 @@ vn_physical_device_get_native_extensions(
if (can_external_mem && renderer_exts->EXT_image_drm_format_modifier && if (can_external_mem && renderer_exts->EXT_image_drm_format_modifier &&
renderer_exts->EXT_queue_family_foreign) { renderer_exts->EXT_queue_family_foreign) {
exts->ANDROID_external_memory_android_hardware_buffer = true; 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) if (physical_dev->renderer_sync_fd.fence_exportable)
@ -967,9 +980,6 @@ vn_physical_device_get_native_extensions(
} }
#endif /* ANDROID */ #endif /* ANDROID */
/* Semaphore sync fd import required for WSI to skip scrubbing
* the wsi/external wait semaphores.
*/
#ifdef VN_USE_WSI_PLATFORM #ifdef VN_USE_WSI_PLATFORM
if (renderer_exts->EXT_image_drm_format_modifier && if (renderer_exts->EXT_image_drm_format_modifier &&
renderer_exts->EXT_queue_family_foreign && renderer_exts->EXT_queue_family_foreign &&