"\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;
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;
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;