venus: refactor to add vn_sync_payload_external
authorYiwei Zhang <zzyiwei@chromium.org>
Wed, 8 Mar 2023 01:53:28 +0000 (17:53 -0800)
committerMarge Bot <emma+marge@anholt.net>
Tue, 14 Mar 2023 18:07:38 +0000 (18:07 +0000)
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21716>

src/virtio/vulkan/vn_queue.c
src/virtio/vulkan/vn_queue.h

index 306d0c8..c4f89fe 100644 (file)
@@ -63,9 +63,7 @@ struct vn_queue_submission {
    bool has_feedback_semaphore;
    const struct vn_device_memory *wsi_mem;
    uint32_t sem_cmd_buffer_count;
-
-   bool ring_seqno_valid;
-   uint32_t ring_seqno;
+   struct vn_sync_payload_external external;
 
    /* Temporary storage allocation for submission
     * A single alloc for storage is performed and the offsets inside
@@ -285,6 +283,7 @@ vn_queue_submission_prepare(struct vn_queue_submission *submit)
     * - has an external signal semaphore
     */
    struct vn_queue *queue = vn_queue_from_handle(submit->queue_handle);
+   submit->external.ring_idx = queue->ring_idx;
    submit->synchronous =
       has_external_fence ||
       (!queue->device->instance->experimental.asyncRoundtrip &&
@@ -805,15 +804,15 @@ vn_queue_wsi_present(struct vn_queue_submission *submit)
 
    if (dev->instance->renderer->info.has_implicit_fencing) {
       struct vn_renderer_submit_batch batch = {
-         .ring_idx = queue->ring_idx,
+         .ring_idx = submit->external.ring_idx,
       };
 
       uint32_t local_data[8];
       struct vn_cs_encoder local_enc =
          VN_CS_ENCODER_INITIALIZER_LOCAL(local_data, sizeof(local_data));
-      if (submit->ring_seqno_valid) {
+      if (submit->external.ring_seqno_valid) {
          vn_encode_vkWaitRingSeqno100000MESA(&local_enc, 0, instance->ring.id,
-                                             submit->ring_seqno);
+                                             submit->external.ring_seqno);
          batch.cs_data = local_data;
          batch.cs_size = vn_cs_encoder_get_len(&local_enc);
       }
@@ -883,8 +882,8 @@ vn_queue_submit(struct vn_queue_submission *submit)
          vn_queue_submission_cleanup(submit);
          return vn_error(dev->instance, VK_ERROR_DEVICE_LOST);
       }
-      submit->ring_seqno_valid = true;
-      submit->ring_seqno = instance_submit.ring_seqno;
+      submit->external.ring_seqno_valid = true;
+      submit->external.ring_seqno = instance_submit.ring_seqno;
    }
 
    /* If external fence, track the submission's ring_idx to facilitate
@@ -894,9 +893,10 @@ vn_queue_submit(struct vn_queue_submission *submit)
     * because an fd is already available.
     */
    struct vn_fence *fence = vn_fence_from_handle(submit->fence_handle);
-   if (fence && fence->is_external &&
-       fence->payload->type == VN_SYNC_TYPE_DEVICE_ONLY)
-      fence->ring_idx = queue->ring_idx;
+   if (fence && fence->is_external) {
+      assert(fence->payload->type == VN_SYNC_TYPE_DEVICE_ONLY);
+      fence->external = submit->external;
+   }
 
    for (uint32_t i = 0; i < submit->batch_count; i++) {
       uint32_t signal_semaphore_count =
@@ -904,9 +904,9 @@ vn_queue_submit(struct vn_queue_submission *submit)
       for (uint32_t j = 0; j < signal_semaphore_count; j++) {
          struct vn_semaphore *sem =
             vn_semaphore_from_handle(vn_get_signal_semaphore(submit, i, j));
-         if (sem->is_external &&
-             sem->payload->type == VN_SYNC_TYPE_DEVICE_ONLY) {
-            sem->ring_idx = queue->ring_idx;
+         if (sem->is_external) {
+            assert(sem->payload->type == VN_SYNC_TYPE_DEVICE_ONLY);
+            sem->external = submit->external;
          }
       }
    }
@@ -1351,7 +1351,9 @@ vn_WaitForFences(VkDevice device,
 }
 
 static VkResult
-vn_create_sync_file(struct vn_device *dev, uint32_t ring_idx, int *out_fd)
+vn_create_sync_file(struct vn_device *dev,
+                    struct vn_sync_payload_external *payload,
+                    int *out_fd)
 {
    struct vn_renderer_sync *sync;
    VkResult result = vn_renderer_sync_create(dev->renderer, 0,
@@ -1365,7 +1367,7 @@ vn_create_sync_file(struct vn_device *dev, uint32_t ring_idx, int *out_fd)
             .syncs = &sync,
             .sync_values = &(const uint64_t){ 1 },
             .sync_count = 1,
-            .ring_idx = ring_idx,
+            .ring_idx = payload->ring_idx,
          },
       .batch_count = 1,
    };
@@ -1433,7 +1435,7 @@ vn_GetFenceFdKHR(VkDevice device,
 
    int fd = -1;
    if (payload->type == VN_SYNC_TYPE_DEVICE_ONLY) {
-      result = vn_create_sync_file(dev, fence->ring_idx, &fd);
+      result = vn_create_sync_file(dev, &fence->external, &fd);
       if (result != VK_SUCCESS)
          return vn_error(dev->instance, result);
 
@@ -1888,7 +1890,7 @@ vn_GetSemaphoreFdKHR(VkDevice device,
 
    int fd = -1;
    if (payload->type == VN_SYNC_TYPE_DEVICE_ONLY) {
-      VkResult result = vn_create_sync_file(dev, sem->ring_idx, &fd);
+      VkResult result = vn_create_sync_file(dev, &sem->external, &fd);
       if (result != VK_SUCCESS)
          return vn_error(dev->instance, result);
 
index cdfc46b..935ebe1 100644 (file)
@@ -52,6 +52,22 @@ struct vn_sync_payload {
    int fd;
 };
 
+/* For external fences and external semaphores submitted to be signaled. The
+ * Vulkan spec guarantees those external syncs are on permanent payload.
+ */
+struct vn_sync_payload_external {
+   /* ring_idx of the last queue submission */
+   uint32_t ring_idx;
+   /* ring_seqno_valid is false when:
+    * - feature asyncRoundtrip is not supported by the renderer
+    * - NO_ASYNC_QUEUE_SUBMIT perf option is used
+    * - external fence and external semaphore
+    */
+   bool ring_seqno_valid;
+   /* ring seqno of the last queue submission */
+   uint32_t ring_seqno;
+};
+
 struct vn_fence {
    struct vn_object_base base;
 
@@ -67,11 +83,7 @@ struct vn_fence {
    } feedback;
 
    bool is_external;
-
-   /* ring_idx of the last queue submission (only used for permanent
-    * payload of external fences)
-    */
-   uint32_t ring_idx;
+   struct vn_sync_payload_external external;
 };
 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_fence,
                                base.base,
@@ -121,11 +133,7 @@ struct vn_semaphore {
    } feedback;
 
    bool is_external;
-
-   /* ring_idx of the last queue submission (only used for permanent
-    * payload of external semaphores)
-    */
-   uint32_t ring_idx;
+   struct vn_sync_payload_external external;
 };
 VK_DEFINE_NONDISP_HANDLE_CASTS(vn_semaphore,
                                base.base,