Lines Matching refs:queue
47 vk_queue_start_submit_thread(struct vk_queue *queue);
50 vk_queue_init(struct vk_queue *queue, struct vk_device *device, in vk_queue_init() argument
57 memset(queue, 0, sizeof(*queue)); in vk_queue_init()
58 vk_object_base_init(device, &queue->base, VK_OBJECT_TYPE_QUEUE); in vk_queue_init()
60 list_addtail(&queue->link, &device->queues); in vk_queue_init()
62 queue->flags = pCreateInfo->flags; in vk_queue_init()
63 queue->queue_family_index = pCreateInfo->queueFamilyIndex; in vk_queue_init()
66 queue->index_in_family = index_in_family; in vk_queue_init()
68 queue->submit.mode = device->submit_mode; in vk_queue_init()
69 if (queue->submit.mode == VK_QUEUE_SUBMIT_MODE_THREADED_ON_DEMAND) in vk_queue_init()
70 queue->submit.mode = VK_QUEUE_SUBMIT_MODE_IMMEDIATE; in vk_queue_init()
72 list_inithead(&queue->submit.submits); in vk_queue_init()
74 ret = mtx_init(&queue->submit.mutex, mtx_plain); in vk_queue_init()
76 result = vk_errorf(queue, VK_ERROR_UNKNOWN, "mtx_init failed"); in vk_queue_init()
80 ret = cnd_init(&queue->submit.push); in vk_queue_init()
82 result = vk_errorf(queue, VK_ERROR_UNKNOWN, "cnd_init failed"); in vk_queue_init()
86 ret = cnd_init(&queue->submit.pop); in vk_queue_init()
88 result = vk_errorf(queue, VK_ERROR_UNKNOWN, "cnd_init failed"); in vk_queue_init()
92 if (queue->submit.mode == VK_QUEUE_SUBMIT_MODE_THREADED) { in vk_queue_init()
93 result = vk_queue_start_submit_thread(queue); in vk_queue_init()
98 util_dynarray_init(&queue->labels, NULL); in vk_queue_init()
99 queue->region_begin = true; in vk_queue_init()
104 cnd_destroy(&queue->submit.pop); in vk_queue_init()
106 cnd_destroy(&queue->submit.push); in vk_queue_init()
108 mtx_destroy(&queue->submit.mutex); in vk_queue_init()
114 _vk_queue_set_lost(struct vk_queue *queue, in _vk_queue_set_lost() argument
118 if (queue->_lost.lost) in _vk_queue_set_lost()
121 queue->_lost.lost = true; in _vk_queue_set_lost()
122 queue->_lost.error_file = file; in _vk_queue_set_lost()
123 queue->_lost.error_line = line; in _vk_queue_set_lost()
127 vsnprintf(queue->_lost.error_msg, sizeof(queue->_lost.error_msg), msg, ap); in _vk_queue_set_lost()
130 p_atomic_inc(&queue->base.device->_lost.lost); in _vk_queue_set_lost()
133 _vk_device_report_lost(queue->base.device); in _vk_queue_set_lost()
141 vk_queue_submit_alloc(struct vk_queue *queue, in vk_queue_submit_alloc() argument
172 if (queue->base.device->timeline_mode == VK_DEVICE_TIMELINE_MODE_EMULATED) { in vk_queue_submit_alloc()
179 if (!vk_multialloc_zalloc(&ma, &queue->base.device->alloc, in vk_queue_submit_alloc()
210 vk_queue_submit_cleanup(struct vk_queue *queue, in vk_queue_submit_cleanup() argument
215 vk_sync_destroy(queue->base.device, submit->_wait_temps[i]); in vk_queue_submit_cleanup()
219 vk_sync_destroy(queue->base.device, submit->_mem_signal_temp); in vk_queue_submit_cleanup()
224 vk_sync_timeline_point_release(queue->base.device, in vk_queue_submit_cleanup()
233 vk_sync_timeline_point_free(queue->base.device, in vk_queue_submit_cleanup()
241 vk_queue_submit_free(struct vk_queue *queue, in vk_queue_submit_free() argument
244 vk_free(&queue->base.device->alloc, submit); in vk_queue_submit_free()
248 vk_queue_submit_destroy(struct vk_queue *queue, in vk_queue_submit_destroy() argument
251 vk_queue_submit_cleanup(queue, submit); in vk_queue_submit_destroy()
252 vk_queue_submit_free(queue, submit); in vk_queue_submit_destroy()
256 vk_queue_push_submit(struct vk_queue *queue, in vk_queue_push_submit() argument
259 mtx_lock(&queue->submit.mutex); in vk_queue_push_submit()
260 list_addtail(&submit->link, &queue->submit.submits); in vk_queue_push_submit()
261 cnd_signal(&queue->submit.push); in vk_queue_push_submit()
262 mtx_unlock(&queue->submit.mutex); in vk_queue_push_submit()
266 vk_queue_drain(struct vk_queue *queue) in vk_queue_drain() argument
270 mtx_lock(&queue->submit.mutex); in vk_queue_drain()
271 while (!list_is_empty(&queue->submit.submits)) { in vk_queue_drain()
272 if (vk_device_is_lost(queue->base.device)) { in vk_queue_drain()
277 int ret = cnd_wait(&queue->submit.pop, &queue->submit.mutex); in vk_queue_drain()
279 result = vk_queue_set_lost(queue, "cnd_wait failed"); in vk_queue_drain()
283 mtx_unlock(&queue->submit.mutex); in vk_queue_drain()
289 vk_queue_submit_final(struct vk_queue *queue, in vk_queue_submit_final() argument
311 vk_sync_destroy(queue->base.device, submit->_wait_temps[i]); in vk_queue_submit_final()
323 assert(queue->base.device->timeline_mode == in vk_queue_submit_final()
325 result = vk_sync_timeline_get_point(queue->base.device, timeline, in vk_queue_submit_final()
329 result = vk_queue_set_lost(queue, in vk_queue_submit_final()
377 result = queue->driver_submit(queue, submit); in vk_queue_submit_final()
386 vk_sync_timeline_point_install(queue->base.device, in vk_queue_submit_final()
396 vk_queue_flush(struct vk_queue *queue, uint32_t *submit_count_out) in vk_queue_flush() argument
400 assert(queue->submit.mode == VK_QUEUE_SUBMIT_MODE_DEFERRED); in vk_queue_flush()
402 mtx_lock(&queue->submit.mutex); in vk_queue_flush()
405 while (!list_is_empty(&queue->submit.submits)) { in vk_queue_flush()
407 list_first_entry(&queue->submit.submits, in vk_queue_flush()
417 result = vk_sync_wait(queue->base.device, in vk_queue_flush()
426 result = vk_queue_set_lost(queue, "Wait for time points failed"); in vk_queue_flush()
431 result = vk_queue_submit_final(queue, submit); in vk_queue_flush()
433 result = vk_queue_set_lost(queue, "queue::driver_submit failed"); in vk_queue_flush()
441 vk_queue_submit_destroy(queue, submit); in vk_queue_flush()
446 cnd_broadcast(&queue->submit.pop); in vk_queue_flush()
448 mtx_unlock(&queue->submit.mutex); in vk_queue_flush()
459 struct vk_queue *queue = _data; in vk_queue_submit_thread_func() local
462 mtx_lock(&queue->submit.mutex); in vk_queue_submit_thread_func()
464 while (queue->submit.thread_run) { in vk_queue_submit_thread_func()
465 if (list_is_empty(&queue->submit.submits)) { in vk_queue_submit_thread_func()
466 int ret = cnd_wait(&queue->submit.push, &queue->submit.mutex); in vk_queue_submit_thread_func()
468 mtx_unlock(&queue->submit.mutex); in vk_queue_submit_thread_func()
469 vk_queue_set_lost(queue, "cnd_wait failed"); in vk_queue_submit_thread_func()
476 list_first_entry(&queue->submit.submits, in vk_queue_submit_thread_func()
480 mtx_unlock(&queue->submit.mutex); in vk_queue_submit_thread_func()
482 result = vk_sync_wait_many(queue->base.device, in vk_queue_submit_thread_func()
486 vk_queue_set_lost(queue, "Wait for time points failed"); in vk_queue_submit_thread_func()
490 result = vk_queue_submit_final(queue, submit); in vk_queue_submit_thread_func()
492 vk_queue_set_lost(queue, "queue::driver_submit failed"); in vk_queue_submit_thread_func()
500 vk_queue_submit_cleanup(queue, submit); in vk_queue_submit_thread_func()
502 mtx_lock(&queue->submit.mutex); in vk_queue_submit_thread_func()
509 vk_queue_submit_free(queue, submit); in vk_queue_submit_thread_func()
511 cnd_broadcast(&queue->submit.pop); in vk_queue_submit_thread_func()
514 mtx_unlock(&queue->submit.mutex); in vk_queue_submit_thread_func()
519 vk_queue_start_submit_thread(struct vk_queue *queue) in vk_queue_start_submit_thread() argument
523 mtx_lock(&queue->submit.mutex); in vk_queue_start_submit_thread()
524 queue->submit.thread_run = true; in vk_queue_start_submit_thread()
525 mtx_unlock(&queue->submit.mutex); in vk_queue_start_submit_thread()
527 ret = thrd_create(&queue->submit.thread, in vk_queue_start_submit_thread()
529 queue); in vk_queue_start_submit_thread()
531 return vk_errorf(queue, VK_ERROR_UNKNOWN, "thrd_create failed"); in vk_queue_start_submit_thread()
537 vk_queue_stop_submit_thread(struct vk_queue *queue) in vk_queue_stop_submit_thread() argument
539 vk_queue_drain(queue); in vk_queue_stop_submit_thread()
542 mtx_lock(&queue->submit.mutex); in vk_queue_stop_submit_thread()
543 queue->submit.thread_run = false; in vk_queue_stop_submit_thread()
544 cnd_signal(&queue->submit.push); in vk_queue_stop_submit_thread()
545 mtx_unlock(&queue->submit.mutex); in vk_queue_stop_submit_thread()
547 thrd_join(queue->submit.thread, NULL); in vk_queue_stop_submit_thread()
549 assert(list_is_empty(&queue->submit.submits)); in vk_queue_stop_submit_thread()
550 queue->submit.mode = VK_QUEUE_SUBMIT_MODE_IMMEDIATE; in vk_queue_stop_submit_thread()
554 vk_queue_enable_submit_thread(struct vk_queue *queue) in vk_queue_enable_submit_thread() argument
556 assert(vk_device_supports_threaded_submit(queue->base.device)); in vk_queue_enable_submit_thread()
558 if (queue->submit.mode == VK_QUEUE_SUBMIT_MODE_THREADED) in vk_queue_enable_submit_thread()
561 VkResult result = vk_queue_start_submit_thread(queue); in vk_queue_enable_submit_thread()
565 queue->submit.mode = VK_QUEUE_SUBMIT_MODE_THREADED; in vk_queue_enable_submit_thread()
595 vk_queue_submit(struct vk_queue *queue, in vk_queue_submit() argument
598 struct vk_device *device = queue->base.device; in vk_queue_submit()
618 queue->base.device->create_sync_for_memory != NULL; in vk_queue_submit()
621 vk_queue_submit_alloc(queue, info->wait_count, in vk_queue_submit()
633 return vk_error(queue, VK_ERROR_OUT_OF_HOST_MEMORY); in vk_queue_submit()
697 assert(cmd_buffer->pool->queue_family_index == queue->queue_family_index); in vk_queue_submit()
752 result = vk_queue_set_lost(queue, in vk_queue_submit()
770 assert(queue->base.device->timeline_mode == in vk_queue_submit()
772 result = vk_sync_timeline_alloc_point(queue->base.device, timeline, in vk_queue_submit()
792 result = queue->base.device->create_sync_for_memory(queue->base.device, in vk_queue_submit()
825 queue->submit.mode != VK_QUEUE_SUBMIT_MODE_THREADED) { in vk_queue_submit()
826 assert(queue->submit.mode == VK_QUEUE_SUBMIT_MODE_IMMEDIATE); in vk_queue_submit()
828 result = vk_sync_wait_many(queue->base.device, in vk_queue_submit()
832 result = vk_queue_enable_submit_thread(queue); in vk_queue_submit()
837 switch (queue->submit.mode) { in vk_queue_submit()
839 result = vk_queue_submit_final(queue, submit); in vk_queue_submit()
870 result = vk_sync_reset(queue->base.device, in vk_queue_submit()
878 vk_queue_submit_destroy(queue, submit); in vk_queue_submit()
882 vk_queue_push_submit(queue, submit); in vk_queue_submit()
883 return vk_device_flush(queue->base.device); in vk_queue_submit()
948 result = vk_sync_wait(queue->base.device, in vk_queue_submit()
954 result = vk_sync_create(queue->base.device, in vk_queue_submit()
962 result = vk_sync_move(queue->base.device, in vk_queue_submit()
972 vk_queue_push_submit(queue, submit); in vk_queue_submit()
984 result = vk_queue_drain(queue); in vk_queue_submit()
997 vk_queue_submit_destroy(queue, submit); in vk_queue_submit()
1002 vk_queue_wait_before_present(struct vk_queue *queue, in vk_queue_wait_before_present() argument
1005 if (vk_device_is_lost(queue->base.device)) in vk_queue_wait_before_present()
1025 if (!vk_device_supports_threaded_submit(queue->base.device)) in vk_queue_wait_before_present()
1050 VkResult result = vk_sync_wait_many(queue->base.device, wait_count, waits, in vk_queue_wait_before_present()
1056 if (vk_device_is_lost(queue->base.device)) in vk_queue_wait_before_present()
1063 vk_queue_signal_sync(struct vk_queue *queue, in vk_queue_signal_sync() argument
1067 struct vk_queue_submit *submit = vk_queue_submit_alloc(queue, 0, 0, 0, 0, 0, in vk_queue_signal_sync()
1070 return vk_error(queue, VK_ERROR_OUT_OF_HOST_MEMORY); in vk_queue_signal_sync()
1079 switch (queue->submit.mode) { in vk_queue_signal_sync()
1081 result = vk_queue_submit_final(queue, submit); in vk_queue_signal_sync()
1082 vk_queue_submit_destroy(queue, submit); in vk_queue_signal_sync()
1086 vk_queue_push_submit(queue, submit); in vk_queue_signal_sync()
1087 return vk_device_flush(queue->base.device); in vk_queue_signal_sync()
1090 vk_queue_push_submit(queue, submit); in vk_queue_signal_sync()
1100 vk_queue_finish(struct vk_queue *queue) in vk_queue_finish() argument
1102 if (queue->submit.mode == VK_QUEUE_SUBMIT_MODE_THREADED) in vk_queue_finish()
1103 vk_queue_stop_submit_thread(queue); in vk_queue_finish()
1105 while (!list_is_empty(&queue->submit.submits)) { in vk_queue_finish()
1106 assert(vk_device_is_lost_no_report(queue->base.device)); in vk_queue_finish()
1109 list_first_entry(&queue->submit.submits, in vk_queue_finish()
1113 vk_queue_submit_destroy(queue, submit); in vk_queue_finish()
1116 cnd_destroy(&queue->submit.pop); in vk_queue_finish()
1117 cnd_destroy(&queue->submit.push); in vk_queue_finish()
1118 mtx_destroy(&queue->submit.mutex); in vk_queue_finish()
1120 util_dynarray_fini(&queue->labels); in vk_queue_finish()
1121 list_del(&queue->link); in vk_queue_finish()
1122 vk_object_base_finish(&queue->base); in vk_queue_finish()
1131 VK_FROM_HANDLE(vk_queue, queue, _queue); in vk_common_QueueSubmit2KHR()
1134 if (vk_device_is_lost(queue->base.device)) in vk_common_QueueSubmit2KHR()
1141 return vk_queue_signal_sync(queue, vk_fence_get_active_sync(fence), 0); in vk_common_QueueSubmit2KHR()
1156 VkResult result = vk_queue_submit(queue, &info); in vk_common_QueueSubmit2KHR()
1170 VK_FROM_HANDLE(vk_queue, queue, _queue); in vk_common_QueueBindSparse()
1173 if (vk_device_is_lost(queue->base.device)) in vk_common_QueueBindSparse()
1180 return vk_queue_signal_sync(queue, vk_fence_get_active_sync(fence), 0); in vk_common_QueueBindSparse()
1226 return vk_error(queue, VK_ERROR_OUT_OF_HOST_MEMORY); in vk_common_QueueBindSparse()
1258 VkResult result = vk_queue_submit(queue, &info); in vk_common_QueueBindSparse()
1286 VK_FROM_HANDLE(vk_queue, queue, _queue); in vk_common_QueueWaitIdle()
1289 if (vk_device_is_lost(queue->base.device)) in vk_common_QueueWaitIdle()
1293 get_cpu_wait_type(queue->base.device->physical); in vk_common_QueueWaitIdle()
1296 result = vk_sync_create(queue->base.device, sync_type, 0, 0, &sync); in vk_common_QueueWaitIdle()
1300 result = vk_queue_signal_sync(queue, sync, 0); in vk_common_QueueWaitIdle()
1304 result = vk_sync_wait(queue->base.device, sync, 0, in vk_common_QueueWaitIdle()
1307 vk_sync_destroy(queue->base.device, sync); in vk_common_QueueWaitIdle()
1309 VkResult device_status = vk_device_check_status(queue->base.device); in vk_common_QueueWaitIdle()