Module: Mesa
Branch: main
Commit: 19c3608672efc7940e1ee6caa8f5d9136fbecbce
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=19c3608672efc7940e1ee6caa8f5d9136fbecbce

Author: Yiwei Zhang <[email protected]>
Date:   Wed Feb 15 09:48:49 2023 -0800

venus: tighten up the sync fd requirements for Android wsi

Signed-off-by: Yiwei Zhang <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21379>

---

 src/virtio/vulkan/vn_android.c         | 38 +++++++++-------------------------
 src/virtio/vulkan/vn_device.c          |  9 ++++----
 src/virtio/vulkan/vn_physical_device.c | 18 ++++++++++++----
 3 files changed, 29 insertions(+), 36 deletions(-)

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 &&

Reply via email to