Implement libresoc_DeviceWaitIdle() libresoc_QueueWaitIdle().
authorVivek Pandya <vivekvpandya@gmail.com>
Sun, 30 Aug 2020 15:48:06 +0000 (21:18 +0530)
committerVivek Pandya <vivekvpandya@gmail.com>
Sat, 5 Sep 2020 11:50:32 +0000 (17:20 +0530)
src/libre-soc/vulkan/libresoc_device.c
src/libre-soc/vulkan/libresoc_private.h

index a9da9d96eb19eaefc2c308fda156d6bb4cc9a72b..229fd172a0d7819579ec68af934c2c0bd5e165b2 100644 (file)
@@ -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;
+}
index 1b3424f5a4b56a6a5acbcdddfcf2784ded80f17e..60f12937448a0dc5dbfb7a0887d65c8b962d7eaa 100644 (file)
@@ -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 */
 };