From adb51eeba52db86fb836580dfab937eef22190a8 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Sun, 26 Feb 2023 17:29:09 -0800 Subject: [PATCH] venus: propagate vn_ring to vn_relax This is to prepare for vn_relax to check ring status as well as pinging renderer. Signed-off-by: Yiwei Zhang Part-of: --- src/virtio/vulkan/vn_common.c | 4 +++- src/virtio/vulkan/vn_common.h | 3 ++- src/virtio/vulkan/vn_instance.c | 2 +- src/virtio/vulkan/vn_queue.c | 15 +++++++++------ src/virtio/vulkan/vn_ring.c | 4 ++-- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/virtio/vulkan/vn_common.c b/src/virtio/vulkan/vn_common.c index 5034cfa5711..15f851b4a41 100644 --- a/src/virtio/vulkan/vn_common.c +++ b/src/virtio/vulkan/vn_common.c @@ -18,6 +18,8 @@ #include "venus-protocol/vn_protocol_driver_info.h" #include "vk_enum_to_str.h" +#include "vn_ring.h" + #define VN_RELAX_MIN_BASE_SLEEP_US (160) static const struct debug_control vn_debug_options[] = { @@ -122,7 +124,7 @@ vn_extension_get_spec_version(const char *name) } void -vn_relax(uint32_t *iter, const char *reason) +vn_relax(const struct vn_ring *ring, uint32_t *iter, const char *reason) { /* Yield for the first 2^busy_wait_order times and then sleep for * base_sleep_us microseconds for the same number of times. After that, diff --git a/src/virtio/vulkan/vn_common.h b/src/virtio/vulkan/vn_common.h index e3287a54347..59331b7772a 100644 --- a/src/virtio/vulkan/vn_common.h +++ b/src/virtio/vulkan/vn_common.h @@ -89,6 +89,7 @@ struct vn_command_buffer; struct vn_cs_encoder; struct vn_cs_decoder; +struct vn_ring; struct vn_renderer; struct vn_renderer_shmem; @@ -223,7 +224,7 @@ uint32_t vn_extension_get_spec_version(const char *name); void -vn_relax(uint32_t *iter, const char *reason); +vn_relax(const struct vn_ring *ring, uint32_t *iter, const char *reason); static_assert(sizeof(vn_object_id) >= sizeof(uintptr_t), ""); diff --git a/src/virtio/vulkan/vn_instance.c b/src/virtio/vulkan/vn_instance.c index fdf22bd1abe..3f03eac1cca 100644 --- a/src/virtio/vulkan/vn_instance.c +++ b/src/virtio/vulkan/vn_instance.c @@ -315,7 +315,7 @@ vn_instance_wait_roundtrip(struct vn_instance *instance, const uint32_t cur = atomic_load_explicit(ptr, memory_order_acquire); if (roundtrip_seqno_ge(cur, roundtrip_seqno)) break; - vn_relax(&iter, "roundtrip"); + vn_relax(ring, &iter, "roundtrip"); } while (true); } diff --git a/src/virtio/vulkan/vn_queue.c b/src/virtio/vulkan/vn_queue.c index 204ae3e0778..9d3b6d19cfb 100644 --- a/src/virtio/vulkan/vn_queue.c +++ b/src/virtio/vulkan/vn_queue.c @@ -1257,7 +1257,10 @@ vn_remove_signaled_fences(VkDevice device, VkFence *fences, uint32_t *count) } static VkResult -vn_update_sync_result(VkResult result, int64_t abs_timeout, uint32_t *iter) +vn_update_sync_result(struct vn_device *dev, + VkResult result, + int64_t abs_timeout, + uint32_t *iter) { switch (result) { case VK_NOT_READY: @@ -1265,7 +1268,7 @@ vn_update_sync_result(VkResult result, int64_t abs_timeout, uint32_t *iter) os_time_get_nano() >= abs_timeout) result = VK_TIMEOUT; else - vn_relax(iter, "client"); + vn_relax(&dev->instance->ring.ring, iter, "client"); break; default: assert(result == VK_SUCCESS || result < 0); @@ -1303,7 +1306,7 @@ vn_WaitForFences(VkDevice device, while (result == VK_NOT_READY) { result = vn_remove_signaled_fences(device, fences, &fenceCount); - result = vn_update_sync_result(result, abs_timeout, &iter); + result = vn_update_sync_result(dev, result, abs_timeout, &iter); } if (fences != local_fences) @@ -1311,7 +1314,7 @@ vn_WaitForFences(VkDevice device, } else { while (result == VK_NOT_READY) { result = vn_find_first_signaled_fence(device, pFences, fenceCount); - result = vn_update_sync_result(result, abs_timeout, &iter); + result = vn_update_sync_result(dev, result, abs_timeout, &iter); } } @@ -1794,7 +1797,7 @@ vn_WaitSemaphores(VkDevice device, while (result == VK_NOT_READY) { result = vn_remove_signaled_semaphores(device, semaphores, values, &semaphore_count); - result = vn_update_sync_result(result, abs_timeout, &iter); + result = vn_update_sync_result(dev, result, abs_timeout, &iter); } if (semaphores != local_semaphores) @@ -1804,7 +1807,7 @@ vn_WaitSemaphores(VkDevice device, result = vn_find_first_signaled_semaphore( device, pWaitInfo->pSemaphores, pWaitInfo->pValues, pWaitInfo->semaphoreCount); - result = vn_update_sync_result(result, abs_timeout, &iter); + result = vn_update_sync_result(dev, result, abs_timeout, &iter); } } diff --git a/src/virtio/vulkan/vn_ring.c b/src/virtio/vulkan/vn_ring.c index 7186033c52f..805f97cc343 100644 --- a/src/virtio/vulkan/vn_ring.c +++ b/src/virtio/vulkan/vn_ring.c @@ -93,7 +93,7 @@ vn_ring_wait_seqno(const struct vn_ring *ring, uint32_t seqno) const uint32_t head = vn_ring_load_head(ring); if (vn_ring_ge_seqno(ring, head, seqno)) return head; - vn_relax(&iter, "ring seqno"); + vn_relax(ring, &iter, "ring seqno"); } while (true); } @@ -126,7 +126,7 @@ vn_ring_wait_space(const struct vn_ring *ring, uint32_t size) /* see the reasoning in vn_ring_wait_seqno */ uint32_t iter = 0; do { - vn_relax(&iter, "ring space"); + vn_relax(ring, &iter, "ring space"); if (vn_ring_has_space(ring, size, &head)) return head; } while (true);