From: Yiwei Zhang Date: Fri, 3 Mar 2023 01:13:55 +0000 (-0800) Subject: venus: let vn_instance_submit_command track ring seqno X-Git-Tag: upstream/23.3.3~11672 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a3f612ab3e4b3e32f2127df0747116a0aeb636d;p=platform%2Fupstream%2Fmesa.git venus: let vn_instance_submit_command track ring seqno Signed-off-by: Yiwei Zhang Part-of: --- diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index 354ccfc..aded646 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -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; diff --git a/src/virtio/vulkan/vn_instance.h b/src/virtio/vulkan/vn_instance.h index a72a2fa..c4f3419 100644 --- a/src/virtio/vulkan/vn_instance.h +++ b/src/virtio/vulkan/vn_instance.h @@ -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 * diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c index 9d3b6d1..a248ed8 100644 --- a/src/virtio/vulkan/vn_queue.c +++ b/src/virtio/vulkan/vn_queue.c @@ -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); } }