mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 00:58:05 +02:00
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:
parent
9b7a78cac6
commit
1cb42a629f
1 changed files with 23 additions and 11 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue