From: Yiwei Zhang Date: Fri, 3 Mar 2023 07:33:00 +0000 (-0800) Subject: venus: make vn_instance_wait_roundtrip asynchronous X-Git-Tag: upstream/23.3.3~11673 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1cb42a629fa6439e0c8eee6fd23d3ab3f172cc94;p=platform%2Fupstream%2Fmesa.git venus: make vn_instance_wait_roundtrip asynchronous 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 Part-of: --- diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index 3405321..354ccfc 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -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;