Lines Matching refs:submit

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);
80 ret = cnd_init(&queue->submit.push);
86 ret = cnd_init(&queue->submit.pop);
92 if (queue->submit.mode == VK_QUEUE_SUBMIT_MODE_THREADED) {
104 cnd_destroy(&queue->submit.pop);
106 cnd_destroy(&queue->submit.push);
108 mtx_destroy(&queue->submit.mutex);
154 VK_MULTIALLOC_DECL(&ma, struct vk_queue_submit, submit, 1);
183 submit->wait_count = wait_count;
184 submit->command_buffer_count = command_buffer_count;
185 submit->signal_count = signal_count;
186 submit->buffer_bind_count = buffer_bind_count;
187 submit->image_opaque_bind_count = image_opaque_bind_count;
188 submit->image_bind_count = image_bind_count;
190 submit->waits = waits;
191 submit->command_buffers = command_buffers;
192 submit->signals = signals;
193 submit->buffer_binds = buffer_binds;
194 submit->image_opaque_binds = image_opaque_binds;
195 submit->image_binds = image_binds;
196 submit->_wait_temps = wait_temps;
197 submit->_wait_points = wait_points;
198 submit->_signal_points = signal_points;
206 return submit;
211 struct vk_queue_submit *submit)
213 for (uint32_t i = 0; i < submit->wait_count; i++) {
214 if (submit->_wait_temps[i] != NULL)
215 vk_sync_destroy(queue->base.device, submit->_wait_temps[i]);
218 if (submit->_mem_signal_temp != NULL)
219 vk_sync_destroy(queue->base.device, submit->_mem_signal_temp);
221 if (submit->_wait_points != NULL) {
222 for (uint32_t i = 0; i < submit->wait_count; i++) {
223 if (unlikely(submit->_wait_points[i] != NULL)) {
225 submit->_wait_points[i]);
230 if (submit->_signal_points != NULL) {
231 for (uint32_t i = 0; i < submit->signal_count; i++) {
232 if (unlikely(submit->_signal_points[i] != NULL)) {
234 submit->_signal_points[i]);
242 struct vk_queue_submit *submit)
244 vk_free(&queue->base.device->alloc, submit);
249 struct vk_queue_submit *submit)
251 vk_queue_submit_cleanup(queue, submit);
252 vk_queue_submit_free(queue, submit);
257 struct vk_queue_submit *submit)
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);
270 mtx_lock(&queue->submit.mutex);
271 while (!list_is_empty(&queue->submit.submits)) {
277 int ret = cnd_wait(&queue->submit.pop, &queue->submit.mutex);
283 mtx_unlock(&queue->submit.mutex);
290 struct vk_queue_submit *submit)
299 for (uint32_t i = 0; i < submit->wait_count; i++) {
301 if ((submit->waits[i].sync->flags & VK_SYNC_IS_TIMELINE) &&
302 submit->waits[i].wait_value == 0)
306 if (vk_sync_type_is_dummy(submit->waits[i].sync->type)) {
310 if (submit->_wait_temps[i] != NULL) {
311 vk_sync_destroy(queue->base.device, submit->_wait_temps[i]);
312 submit->waits[i].sync = NULL;
321 vk_sync_as_timeline(submit->waits[i].sync);
326 submit->waits[i].wait_value,
327 &submit->_wait_points[i]);
331 submit->waits[i].wait_value);
335 if (submit->_wait_points[i] == NULL)
338 submit->waits[i].sync = &submit->_wait_points[i]->sync;
339 submit->waits[i].wait_value = 0;
343 vk_sync_as_binary(submit->waits[i].sync);
345 submit->waits[i].sync = &binary->timeline;
346 submit->waits[i].wait_value = binary->next_point;
349 assert((submit->waits[i].sync->flags & VK_SYNC_IS_TIMELINE) ||
350 submit->waits[i].wait_value == 0);
354 submit->waits[wait_count] = submit->waits[i];
355 submit->_wait_temps[wait_count] = submit->_wait_temps[i];
356 if (submit->_wait_points)
357 submit->_wait_points[wait_count] = submit->_wait_points[i];
362 assert(wait_count <= submit->wait_count);
363 submit->wait_count = wait_count;
365 for (uint32_t i = 0; i < submit->signal_count; i++) {
366 assert((submit->signals[i].sync->flags & VK_SYNC_IS_TIMELINE) ||
367 submit->signals[i].signal_value == 0);
370 vk_sync_as_binary(submit->signals[i].sync);
372 submit->signals[i].sync = &binary->timeline;
373 submit->signals[i].signal_value = ++binary->next_point;
377 result = queue->driver_submit(queue, submit);
381 if (submit->_signal_points) {
382 for (uint32_t i = 0; i < submit->signal_count; i++) {
383 if (submit->_signal_points[i] == NULL)
387 submit->_signal_points[i]);
388 submit->_signal_points[i] = NULL;
400 assert(queue->submit.mode == VK_QUEUE_SUBMIT_MODE_DEFERRED);
402 mtx_lock(&queue->submit.mutex);
405 while (!list_is_empty(&queue->submit.submits)) {
406 struct vk_queue_submit *submit =
407 list_first_entry(&queue->submit.submits,
410 for (uint32_t i = 0; i < submit->wait_count; i++) {
412 if (!vk_sync_type_is_vk_sync_timeline(submit->waits[i].sync->type)) {
413 assert(!(submit->waits[i].sync->flags & VK_SYNC_IS_TIMELINE));
418 submit->waits[i].sync,
419 submit->waits[i].wait_value,
431 result = vk_queue_submit_final(queue, submit);
439 list_del(&submit->link);
441 vk_queue_submit_destroy(queue, submit);
446 cnd_broadcast(&queue->submit.pop);
448 mtx_unlock(&queue->submit.mutex);
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);
475 struct vk_queue_submit *submit =
476 list_first_entry(&queue->submit.submits,
480 mtx_unlock(&queue->submit.mutex);
483 submit->wait_count, submit->waits,
490 result = vk_queue_submit_final(queue, submit);
500 vk_queue_submit_cleanup(queue, submit);
502 mtx_lock(&queue->submit.mutex);
504 /* Only remove the submit from from the list and free it after
505 * queue->submit() has completed. This ensures that, when
508 list_del(&submit->link);
509 vk_queue_submit_free(queue, submit);
511 cnd_broadcast(&queue->submit.pop);
514 mtx_unlock(&queue->submit.mutex);
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,
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;
558 if (queue->submit.mode == VK_QUEUE_SUBMIT_MODE_THREADED)
565 queue->submit.mode = VK_QUEUE_SUBMIT_MODE_THREADED;
620 struct vk_queue_submit *submit =
632 if (unlikely(submit == NULL))
642 submit->perf_pass_index = perf_info ? perf_info->counterPassIndex : 0;
670 sync = submit->_wait_temps[i] = semaphore->temporary;
685 submit->waits[i] = (struct vk_sync_wait) {
698 submit->command_buffers[i] = cmd_buffer;
705 typed_memcpy(submit->buffer_binds, info->buffer_binds, info->buffer_bind_count);
710 submit->buffer_binds[i].pBinds = binds;
718 typed_memcpy(submit->image_opaque_binds, info->image_opaque_binds,
724 submit->image_opaque_binds[i].pBinds = binds;
732 typed_memcpy(submit->image_binds, info->image_binds, info->image_bind_count);
737 submit->image_binds[i].pBinds = binds;
774 &submit->_signal_points[i]);
778 sync = &submit->_signal_points[i]->sync;
782 submit->signals[i] = (struct vk_sync_signal) {
798 submit->_mem_signal_temp = mem_sync;
800 assert(submit->signals[signal_count].sync == NULL);
801 submit->signals[signal_count++] = (struct vk_sync_signal) {
808 assert(submit->signals[signal_count].sync == NULL);
809 submit->signals[signal_count++] = (struct vk_sync_signal) {
815 assert(signal_count == submit->signal_count);
817 /* If this device supports threaded submit, we can't rely on the client
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);
829 submit->wait_count, submit->waits,
837 switch (queue->submit.mode) {
839 result = vk_queue_submit_final(queue, submit);
843 /* If threaded submit is possible on this device, we need to ensure that
846 * currently have a submit thread, we can directly reset that binary
856 for (uint32_t i = 0; i < submit->wait_count; i++) {
857 if ((submit->waits[i].sync->flags & VK_SYNC_IS_TIMELINE) ||
858 submit->_wait_temps[i] != NULL)
862 for (uint32_t j = 0; j < submit->signal_count; j++) {
863 if (submit->signals[j].sync == submit->waits[i].sync) {
871 submit->waits[i].sync);
878 vk_queue_submit_destroy(queue, submit);
882 vk_queue_push_submit(queue, submit);
906 * For threaded submit, we depend on tracking the unsignaled
908 * submit. The VK_SYNC_WAIT_PENDING check above as well as the
913 * actual submit which happens later in the thread.
923 * the only way to get a submit thread) AND mixing those with
928 if (submit->_wait_temps[i] != NULL)
931 assert(submit->waits[i].sync == &semaphore->permanent);
949 submit->waits[i].sync, 0,
958 &submit->_wait_temps[i]);
963 submit->_wait_temps[i],
968 submit->waits[i].sync = submit->_wait_temps[i];
972 vk_queue_push_submit(queue, submit);
992 unreachable("Invalid vk_queue::submit.mode");
994 unreachable("Invalid submit mode");
997 vk_queue_submit_destroy(queue, submit);
1067 struct vk_queue_submit *submit = vk_queue_submit_alloc(queue, 0, 0, 0, 0, 0,
1069 if (unlikely(submit == NULL))
1072 submit->signals[0] = (struct vk_sync_signal) {
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);
1090 vk_queue_push_submit(queue, submit);
1094 unreachable("Invalid vk_queue::submit.mode");
1102 if (queue->submit.mode == VK_QUEUE_SUBMIT_MODE_THREADED)
1105 while (!list_is_empty(&queue->submit.submits)) {
1108 struct vk_queue_submit *submit =
1109 list_first_entry(&queue->submit.submits,
1112 list_del(&submit->link);
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);