venus: let vn_instance_submit_command track ring seqno
authorYiwei Zhang <zzyiwei@chromium.org>
Fri, 3 Mar 2023 01:13:55 +0000 (17:13 -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_instance.c
src/virtio/vulkan/vn_instance.h
src/virtio/vulkan/vn_queue.c

index 354ccfc..aded646 100644 (file)
@@ -599,16 +599,20 @@ vn_instance_submit_command(struct vn_instance *instance,
          goto fail;
    }
 
-   uint32_t ring_seqno;
-   VkResult result = vn_instance_ring_submit_locked(
-      instance, &submit->command, submit->reply_shmem, &ring_seqno);
+   submit->ring_seqno_valid =
+      VK_SUCCESS == vn_instance_ring_submit_locked(instance, &submit->command,
+                                                   submit->reply_shmem,
+                                                   &submit->ring_seqno);
 
    mtx_unlock(&instance->ring.mutex);
 
-   submit->reply = VN_CS_DECODER_INITIALIZER(reply_ptr, submit->reply_size);
+   if (submit->reply_size) {
+      submit->reply =
+         VN_CS_DECODER_INITIALIZER(reply_ptr, submit->reply_size);
 
-   if (submit->reply_size && result == VK_SUCCESS)
-      vn_ring_wait(&instance->ring.ring, ring_seqno);
+      if (submit->ring_seqno_valid)
+         vn_ring_wait(&instance->ring.ring, submit->ring_seqno);
+   }
 
    return;
 
index a72a2fa..c4f3419 100644 (file)
@@ -123,6 +123,9 @@ struct vn_instance_submit_command {
    /* when reply_size is non-zero, NULL can be returned on errors */
    struct vn_renderer_shmem *reply_shmem;
    struct vn_cs_decoder reply;
+
+   bool ring_seqno_valid;
+   uint32_t ring_seqno;
 };
 
 static inline struct vn_cs_encoder *
index 9d3b6d1..a248ed8 100644 (file)
@@ -847,14 +847,19 @@ vn_queue_submit(struct vn_queue_submission *submit)
          return vn_error(dev->instance, result);
       }
    } else {
+      struct vn_instance_submit_command instance_submit;
       if (submit->batch_type == VK_STRUCTURE_TYPE_SUBMIT_INFO_2) {
-         vn_async_vkQueueSubmit2(instance, submit->queue_handle,
-                                 submit->batch_count, submit->submit_batches2,
-                                 submit->fence_handle);
+         vn_submit_vkQueueSubmit2(
+            instance, 0, submit->queue_handle, submit->batch_count,
+            submit->submit_batches2, submit->fence_handle, &instance_submit);
       } else {
-         vn_async_vkQueueSubmit(instance, submit->queue_handle,
-                                submit->batch_count, submit->submit_batches,
-                                submit->fence_handle);
+         vn_submit_vkQueueSubmit(instance, 0, submit->queue_handle,
+                                 submit->batch_count, submit->submit_batches,
+                                 submit->fence_handle, &instance_submit);
+      }
+      if (!instance_submit.ring_seqno_valid) {
+         vn_queue_submission_cleanup(submit);
+         return vn_error(dev->instance, VK_ERROR_DEVICE_LOST);
       }
    }