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 <zzyiwei@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21716>
This commit is contained in:
Yiwei Zhang 2023-03-02 23:33:00 -08:00 committed by Marge Bot
parent 9b7a78cac6
commit 1cb42a629f

View 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;