venus: make vn_instance_wait_roundtrip asynchronous
authorYiwei Zhang <zzyiwei@chromium.org>
Fri, 3 Mar 2023 07:33:00 +0000 (23:33 -0800)
committerMarge Bot <emma+marge@anholt.net>
Tue, 14 Mar 2023 18:07:38 +0000 (18:07 +0000)
vn_instance_roundtrip does 2 things:
1. vn_instance_submit_roundtrip
   - before: encode a cmd to write vq seqno to ring extra field
   - after: encode a cmd to update vq seqno against a ring
   - submit the encoded cmd via vq
2. vn_instance_wait_roundtrip
   - before: wait until ring extra field has the vq seqno
   - after: let renderer ring thread wait for the vq seqno

Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21716>

src/virtio/vulkan/vn_instance.c

index 3405321..354ccfc 100644 (file)
@@ -196,11 +196,13 @@ vn_instance_init_experimental_features(struct vn_instance *instance)
              "\n\tmemoryResourceAllocationSize = %u"
              "\n\tglobalFencing = %u"
              "\n\tlargeRing = %u"
-             "\n\tsyncFdFencing = %u",
+             "\n\tsyncFdFencing = %u"
+             "\n\tasyncRoundtrip = %u",
              instance->experimental.memoryResourceAllocationSize,
              instance->experimental.globalFencing,
              instance->experimental.largeRing,
-             instance->experimental.syncFdFencing);
+             instance->experimental.syncFdFencing,
+             instance->experimental.asyncRoundtrip);
    }
 
    return VK_SUCCESS;
@@ -279,18 +281,22 @@ VkResult
 vn_instance_submit_roundtrip(struct vn_instance *instance,
                              uint64_t *roundtrip_seqno)
 {
-   uint32_t write_ring_extra_data[8];
-   struct vn_cs_encoder local_enc = VN_CS_ENCODER_INITIALIZER_LOCAL(
-      write_ring_extra_data, sizeof(write_ring_extra_data));
+   uint32_t local_data[8];
+   struct vn_cs_encoder local_enc =
+      VN_CS_ENCODER_INITIALIZER_LOCAL(local_data, sizeof(local_data));
 
-   /* submit a vkWriteRingExtraMESA through the renderer */
    mtx_lock(&instance->ring.roundtrip_mutex);
    const uint64_t seqno = instance->ring.roundtrip_next++;
-   /* clamp to 32bit for legacy ring extra based roundtrip waiting */
-   vn_encode_vkWriteRingExtraMESA(&local_enc, 0, instance->ring.id, 0, seqno);
-   VkResult result =
-      vn_renderer_submit_simple(instance->renderer, write_ring_extra_data,
-                                vn_cs_encoder_get_len(&local_enc));
+   if (instance->experimental.asyncRoundtrip) {
+      vn_encode_vkSubmitVirtqueueSeqno100000MESA(&local_enc, 0,
+                                                 instance->ring.id, seqno);
+   } else {
+      /* clamp to 32bit for legacy ring extra based roundtrip waiting */
+      vn_encode_vkWriteRingExtraMESA(&local_enc, 0, instance->ring.id, 0,
+                                     seqno);
+   }
+   VkResult result = vn_renderer_submit_simple(
+      instance->renderer, local_data, vn_cs_encoder_get_len(&local_enc));
    mtx_unlock(&instance->ring.roundtrip_mutex);
 
    *roundtrip_seqno = seqno;
@@ -309,6 +315,12 @@ vn_instance_wait_roundtrip(struct vn_instance *instance,
                            uint64_t roundtrip_seqno)
 {
    VN_TRACE_FUNC();
+
+   if (instance->experimental.asyncRoundtrip) {
+      vn_async_vkWaitVirtqueueSeqno100000MESA(instance, roundtrip_seqno);
+      return;
+   }
+
    const struct vn_ring *ring = &instance->ring.ring;
    const volatile atomic_uint *ptr = ring->shared.extra;
    uint32_t iter = 0;