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