Implement libresoc_DeviceWaitIdle() libresoc_QueueWaitIdle().
[mesa.git] / src / libre-soc / vulkan / libresoc_device.c
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;
+}