summaryrefslogtreecommitdiff
path: root/src/virtio
diff options
context:
space:
mode:
authorYiwei Zhang <zzyiwei@chromium.org>2023-02-26 17:29:09 -0800
committerMarge Bot <emma+marge@anholt.net>2023-03-07 00:25:07 +0000
commitadb51eeba52db86fb836580dfab937eef22190a8 (patch)
tree88a38c8d6d783c99fe7cd7db887c42eb0e36d128 /src/virtio
parent15a55198ecfdcfc6ee44458d007a478ed88147a7 (diff)
downloadmesa-adb51eeba52db86fb836580dfab937eef22190a8.tar.gz
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 <zzyiwei@chromium.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21542>
Diffstat (limited to 'src/virtio')
-rw-r--r--src/virtio/vulkan/vn_common.c4
-rw-r--r--src/virtio/vulkan/vn_common.h3
-rw-r--r--src/virtio/vulkan/vn_instance.c2
-rw-r--r--src/virtio/vulkan/vn_queue.c15
-rw-r--r--src/virtio/vulkan/vn_ring.c4
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);