From 9de982122e5d87e3ad3f0b52681d5e0363e2fe57 Mon Sep 17 00:00:00 2001 From: Vivek Pandya Date: Sun, 30 Aug 2020 21:18:06 +0530 Subject: [PATCH] Implement libresoc_DeviceWaitIdle() libresoc_QueueWaitIdle(). --- src/libre-soc/vulkan/libresoc_device.c | 31 +++++++++++++++++++++++++ src/libre-soc/vulkan/libresoc_private.h | 5 ++++ 2 files changed, 36 insertions(+) diff --git a/src/libre-soc/vulkan/libresoc_device.c b/src/libre-soc/vulkan/libresoc_device.c index a9da9d96eb1..229fd172a0d 100644 --- a/src/libre-soc/vulkan/libresoc_device.c +++ b/src/libre-soc/vulkan/libresoc_device.c @@ -1002,3 +1002,34 @@ void libresoc_GetDeviceQueue( queue = &device->queues[queueFamilyIndex][queueIndex]; *pQueue = libresoc_queue_to_handle(queue); } + +VkResult libresoc_QueueWaitIdle( + VkQueue _queue) +{ + LIBRESOC_FROM_HANDLE(libresoc_queue, queue, _queue); + + pthread_mutex_lock(&queue->pending_mutex); + while (!list_is_empty(&queue->pending_submissions)) { + pthread_cond_wait(&queue->device->timeline_cond, &queue->pending_mutex); + } + pthread_mutex_unlock(&queue->pending_mutex); + + return VK_SUCCESS; +} + +VkResult libresoc_DeviceWaitIdle( + VkDevice _device) +{ + LIBRESOC_FROM_HANDLE(libresoc_device, device, _device); + + for (unsigned i = 0; i < LIBRESOC_MAX_QUEUE_FAMILIES; i++) { + for (unsigned q = 0; q < device->queue_count[i]; q++) { + VkResult result = + libresoc_QueueWaitIdle(libresoc_queue_to_handle(&device->queues[i][q])); + + if (result != VK_SUCCESS) + return result; + } + } + return VK_SUCCESS; +} diff --git a/src/libre-soc/vulkan/libresoc_private.h b/src/libre-soc/vulkan/libresoc_private.h index 1b3424f5a4b..60f12937448 100644 --- a/src/libre-soc/vulkan/libresoc_private.h +++ b/src/libre-soc/vulkan/libresoc_private.h @@ -109,6 +109,9 @@ struct libresoc_device { /* Backup in-memory cache to be used if the app doesn't provide one */ struct libresoc_pipeline_cache * mem_cache; + /* Condition variable for legacy timelines, to notify waiters when a + * new point gets submitted. */ + pthread_cond_t timeline_cond; /* FIXME: stub */ }; @@ -169,6 +172,8 @@ struct libresoc_queue { int queue_idx; VkDeviceQueueCreateFlags flags; + struct list_head pending_submissions; + pthread_mutex_t pending_mutex; /* FIXME: stub */ }; -- 2.30.2