Skip to content

Commit bb25ff8

Browse files
committed
[Vulkan] Use multiple command buffers to avoid waits
1 parent 0b45026 commit bb25ff8

4 files changed

Lines changed: 76 additions & 64 deletions

File tree

backends/gpu/vulkan/includes/kore3/vulkan/commandlist_structs.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,18 @@ typedef enum kore_vulkan_render_pass_status {
2424
KORE_VULKAN_RENDER_PASS_STATUS_NONE,
2525
} kore_vulkan_render_pass_status;
2626

27+
#define KORE_VULKAN_INTERNAL_COMMAND_BUFFER_COUNT 3
28+
2729
typedef struct kore_vulkan_command_list {
28-
VkDevice device;
29-
VkCommandPool command_pool;
30-
VkCommandBuffer command_buffer;
31-
VkFence fence;
32-
bool presenting;
30+
VkDevice device;
31+
VkCommandPool command_pool;
32+
33+
// use multiple command buffers to avoid waits in kore_vulkan_device_execute_command_list
34+
VkCommandBuffer command_buffers[KORE_VULKAN_INTERNAL_COMMAND_BUFFER_COUNT];
35+
VkFence fences[KORE_VULKAN_INTERNAL_COMMAND_BUFFER_COUNT];
36+
uint32_t active_command_buffer;
37+
38+
bool presenting;
3339

3440
kore_vulkan_render_pass_status render_pass_status;
3541
kore_gpu_render_pass_parameters current_render_pass;

backends/gpu/vulkan/sources/commandlist.c

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include <assert.h>
1515

1616
void kore_vulkan_command_list_destroy(kore_gpu_command_list *list) {
17-
vkFreeCommandBuffers(list->vulkan.device, list->vulkan.command_pool, 1, &list->vulkan.command_buffer);
17+
vkFreeCommandBuffers(list->vulkan.device, list->vulkan.command_pool, KORE_VULKAN_INTERNAL_COMMAND_BUFFER_COUNT, list->vulkan.command_buffers);
1818
}
1919

2020
VkAttachmentLoadOp convert_load_op(kore_gpu_load_op op) {
@@ -77,10 +77,10 @@ VkClearValue convert_depth_clear_value(float value) {
7777
static void pause_render_pass(kore_gpu_command_list *list) {
7878
if (list->vulkan.render_pass_status == KORE_VULKAN_RENDER_PASS_STATUS_ACTIVE) {
7979
if (list->vulkan.has_dynamic_rendering) {
80-
vulkanCmdEndRendering(list->vulkan.command_buffer);
80+
vulkanCmdEndRendering(list->vulkan.command_buffers[list->vulkan.active_command_buffer]);
8181
}
8282
else {
83-
vkCmdEndRenderPass(list->vulkan.command_buffer);
83+
vkCmdEndRenderPass(list->vulkan.command_buffers[list->vulkan.active_command_buffer]);
8484
}
8585
list->vulkan.render_pass_status = KORE_VULKAN_RENDER_PASS_STATUS_PAUSED;
8686
}
@@ -215,7 +215,7 @@ static void resume_render_pass(kore_gpu_command_list *list) {
215215
.pStencilAttachment = VK_NULL_HANDLE,
216216
};
217217

218-
vulkanCmdBeginRendering(list->vulkan.command_buffer, &rendering_info);
218+
vulkanCmdBeginRendering(list->vulkan.command_buffers[list->vulkan.active_command_buffer], &rendering_info);
219219
}
220220
else {
221221
VkClearValue clear_values[9];
@@ -265,7 +265,7 @@ static void resume_render_pass(kore_gpu_command_list *list) {
265265
.framebuffer = framebuffer,
266266
};
267267

268-
vkCmdBeginRenderPass(list->vulkan.command_buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
268+
vkCmdBeginRenderPass(list->vulkan.command_buffers[list->vulkan.active_command_buffer], &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE);
269269
}
270270

271271
kore_vulkan_command_list_set_viewport(list, 0, 0, (float)render_area.extent.width, (float)render_area.extent.height, 0.0f, 1.0f);
@@ -283,10 +283,10 @@ void kore_vulkan_command_list_begin_render_pass(kore_gpu_command_list *list, con
283283
void kore_vulkan_command_list_end_render_pass(kore_gpu_command_list *list) {
284284
if (list->vulkan.render_pass_status == KORE_VULKAN_RENDER_PASS_STATUS_ACTIVE) {
285285
if (list->vulkan.has_dynamic_rendering) {
286-
vulkanCmdEndRendering(list->vulkan.command_buffer);
286+
vulkanCmdEndRendering(list->vulkan.command_buffers[list->vulkan.active_command_buffer]);
287287
}
288288
else {
289-
vkCmdEndRenderPass(list->vulkan.command_buffer);
289+
vkCmdEndRenderPass(list->vulkan.command_buffers[list->vulkan.active_command_buffer]);
290290
}
291291
}
292292
list->vulkan.render_pass_status = KORE_VULKAN_RENDER_PASS_STATUS_NONE;
@@ -297,20 +297,20 @@ void kore_vulkan_command_list_present(kore_gpu_command_list *list) {
297297
}
298298

299299
void kore_vulkan_command_list_set_index_buffer(kore_gpu_command_list *list, kore_gpu_buffer *buffer, kore_gpu_index_format index_format, uint64_t offset) {
300-
vkCmdBindIndexBuffer(list->vulkan.command_buffer, buffer->vulkan.buffer, offset,
300+
vkCmdBindIndexBuffer(list->vulkan.command_buffers[list->vulkan.active_command_buffer], buffer->vulkan.buffer, offset,
301301
index_format == KORE_GPU_INDEX_FORMAT_UINT16 ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32);
302302
}
303303

304304
void kore_vulkan_command_list_set_vertex_buffer(kore_gpu_command_list *list, uint32_t slot, kore_vulkan_buffer *buffer, uint64_t offset, uint64_t size,
305305
uint64_t stride) {
306-
vkCmdBindVertexBuffers(list->vulkan.command_buffer, slot, 1, &buffer->buffer, &offset);
306+
vkCmdBindVertexBuffers(list->vulkan.command_buffers[list->vulkan.active_command_buffer], slot, 1, &buffer->buffer, &offset);
307307
}
308308

309309
static kore_vulkan_render_pipeline *current_render_pipeline = NULL;
310310
static kore_vulkan_compute_pipeline *current_compute_pipeline = NULL;
311311

312312
void kore_vulkan_command_list_set_render_pipeline(kore_gpu_command_list *list, kore_vulkan_render_pipeline *pipeline) {
313-
vkCmdBindPipeline(list->vulkan.command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->pipeline);
313+
vkCmdBindPipeline(list->vulkan.command_buffers[list->vulkan.active_command_buffer], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->pipeline);
314314
current_render_pipeline = pipeline;
315315
current_compute_pipeline = NULL;
316316
}
@@ -321,20 +321,20 @@ void kore_vulkan_command_list_draw(kore_gpu_command_list *list, uint32_t vertex_
321321
void kore_vulkan_command_list_draw_indexed(kore_gpu_command_list *list, uint32_t index_count, uint32_t instance_count, uint32_t first_index,
322322
int32_t base_vertex, uint32_t first_instance) {
323323
resume_render_pass(list);
324-
vkCmdDrawIndexed(list->vulkan.command_buffer, index_count, instance_count, first_index, base_vertex, first_instance);
324+
vkCmdDrawIndexed(list->vulkan.command_buffers[list->vulkan.active_command_buffer], index_count, instance_count, first_index, base_vertex, first_instance);
325325
}
326326

327327
void kore_vulkan_command_list_set_descriptor_set(kore_gpu_command_list *list, uint32_t set_index, kore_vulkan_descriptor_set *set,
328328
uint32_t dynamic_offsets_count, uint32_t *dynamic_offsets) {
329329
pause_render_pass(list);
330330

331331
if (current_render_pipeline != NULL) {
332-
vkCmdBindDescriptorSets(list->vulkan.command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, current_render_pipeline->pipeline_layout, set_index, 1,
333-
&set->descriptor_set, dynamic_offsets_count, dynamic_offsets);
332+
vkCmdBindDescriptorSets(list->vulkan.command_buffers[list->vulkan.active_command_buffer], VK_PIPELINE_BIND_POINT_GRAPHICS,
333+
current_render_pipeline->pipeline_layout, set_index, 1, &set->descriptor_set, dynamic_offsets_count, dynamic_offsets);
334334
}
335335
else if (current_compute_pipeline != NULL) {
336-
vkCmdBindDescriptorSets(list->vulkan.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, current_compute_pipeline->pipeline_layout, set_index, 1,
337-
&set->descriptor_set, dynamic_offsets_count, dynamic_offsets);
336+
vkCmdBindDescriptorSets(list->vulkan.command_buffers[list->vulkan.active_command_buffer], VK_PIPELINE_BIND_POINT_COMPUTE,
337+
current_compute_pipeline->pipeline_layout, set_index, 1, &set->descriptor_set, dynamic_offsets_count, dynamic_offsets);
338338
}
339339
else {
340340
assert(false);
@@ -343,11 +343,12 @@ void kore_vulkan_command_list_set_descriptor_set(kore_gpu_command_list *list, ui
343343

344344
void kore_vulkan_command_list_set_root_constants(kore_gpu_command_list *list, const void *data, size_t data_size) {
345345
if (current_render_pipeline != NULL) {
346-
vkCmdPushConstants(list->vulkan.command_buffer, current_render_pipeline->pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0,
347-
(uint32_t)data_size, data);
346+
vkCmdPushConstants(list->vulkan.command_buffers[list->vulkan.active_command_buffer], current_render_pipeline->pipeline_layout,
347+
VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, (uint32_t)data_size, data);
348348
}
349349
else if (current_compute_pipeline != NULL) {
350-
vkCmdPushConstants(list->vulkan.command_buffer, current_compute_pipeline->pipeline_layout, VK_SHADER_STAGE_COMPUTE_BIT, 0, (uint32_t)data_size, data);
350+
vkCmdPushConstants(list->vulkan.command_buffers[list->vulkan.active_command_buffer], current_compute_pipeline->pipeline_layout,
351+
VK_SHADER_STAGE_COMPUTE_BIT, 0, (uint32_t)data_size, data);
351352
}
352353
else {
353354
assert(false);
@@ -361,7 +362,7 @@ void kore_vulkan_command_list_copy_buffer_to_buffer(kore_gpu_command_list *list,
361362
.dstOffset = destination_offset,
362363
.size = size,
363364
};
364-
vkCmdCopyBuffer(list->vulkan.command_buffer, source->vulkan.buffer, destination->vulkan.buffer, 1, &region);
365+
vkCmdCopyBuffer(list->vulkan.command_buffers[list->vulkan.active_command_buffer], source->vulkan.buffer, destination->vulkan.buffer, 1, &region);
365366
}
366367

367368
void kore_vulkan_command_list_copy_buffer_to_texture(kore_gpu_command_list *list, const kore_gpu_image_copy_buffer *source,
@@ -397,8 +398,8 @@ void kore_vulkan_command_list_copy_buffer_to_texture(kore_gpu_command_list *list
397398
.imageOffset = {destination->origin_x, destination->origin_y, 0},
398399
.imageExtent = {width, height, 1},
399400
};
400-
vkCmdCopyBufferToImage(list->vulkan.command_buffer, source->buffer->vulkan.buffer, destination->texture->vulkan.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
401-
1, &region);
401+
vkCmdCopyBufferToImage(list->vulkan.command_buffers[list->vulkan.active_command_buffer], source->buffer->vulkan.buffer, destination->texture->vulkan.image,
402+
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
402403
}
403404

404405
void kore_vulkan_command_list_copy_texture_to_buffer(kore_gpu_command_list *list, const kore_gpu_image_copy_texture *source,
@@ -433,8 +434,8 @@ void kore_vulkan_command_list_copy_texture_to_buffer(kore_gpu_command_list *list
433434
.imageOffset = {source->origin_x, source->origin_y, 0},
434435
.imageExtent = {width, height, 1},
435436
};
436-
vkCmdCopyImageToBuffer(list->vulkan.command_buffer, source->texture->vulkan.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destination->buffer->vulkan.buffer,
437-
1, &region);
437+
vkCmdCopyImageToBuffer(list->vulkan.command_buffers[list->vulkan.active_command_buffer], source->texture->vulkan.image,
438+
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destination->buffer->vulkan.buffer, 1, &region);
438439
}
439440

440441
void kore_vulkan_command_list_copy_texture_to_texture(kore_gpu_command_list *list, const kore_gpu_image_copy_texture *source,
@@ -490,20 +491,20 @@ void kore_vulkan_command_list_copy_texture_to_texture(kore_gpu_command_list *lis
490491
.extent = {width, height, 1},
491492
};
492493

493-
vkCmdCopyImage(list->vulkan.command_buffer, source->texture->vulkan.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destination->texture->vulkan.image,
494-
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
494+
vkCmdCopyImage(list->vulkan.command_buffers[list->vulkan.active_command_buffer], source->texture->vulkan.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
495+
destination->texture->vulkan.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
495496
}
496497

497498
void kore_vulkan_command_list_clear_buffer(kore_gpu_command_list *list, kore_gpu_buffer *buffer, size_t offset, uint64_t size) {}
498499

499500
void kore_vulkan_command_list_set_compute_pipeline(kore_gpu_command_list *list, kore_vulkan_compute_pipeline *pipeline) {
500-
vkCmdBindPipeline(list->vulkan.command_buffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline->pipeline);
501+
vkCmdBindPipeline(list->vulkan.command_buffers[list->vulkan.active_command_buffer], VK_PIPELINE_BIND_POINT_COMPUTE, pipeline->pipeline);
501502
current_compute_pipeline = pipeline;
502503
current_render_pipeline = NULL;
503504
}
504505

505506
void kore_vulkan_command_list_compute(kore_gpu_command_list *list, uint32_t workgroup_count_x, uint32_t workgroup_count_y, uint32_t workgroup_count_z) {
506-
vkCmdDispatch(list->vulkan.command_buffer, workgroup_count_x, workgroup_count_y, workgroup_count_z);
507+
vkCmdDispatch(list->vulkan.command_buffers[list->vulkan.active_command_buffer], workgroup_count_x, workgroup_count_y, workgroup_count_z);
507508
}
508509

509510
void kore_vulkan_command_list_prepare_raytracing_volume(kore_gpu_command_list *list, kore_gpu_raytracing_volume *volume) {}
@@ -527,15 +528,15 @@ void kore_vulkan_command_list_set_viewport(kore_gpu_command_list *list, float x,
527528
.minDepth = min_depth,
528529
.maxDepth = max_depth,
529530
};
530-
vkCmdSetViewport(list->vulkan.command_buffer, 0, 1, &viewport);
531+
vkCmdSetViewport(list->vulkan.command_buffers[list->vulkan.active_command_buffer], 0, 1, &viewport);
531532
}
532533

533534
void kore_vulkan_command_list_set_scissor_rect(kore_gpu_command_list *list, uint32_t x, uint32_t y, uint32_t width, uint32_t height) {
534535
VkRect2D scissor = {
535536
.offset = {x, y},
536537
.extent = {width, height},
537538
};
538-
vkCmdSetScissor(list->vulkan.command_buffer, 0, 1, &scissor);
539+
vkCmdSetScissor(list->vulkan.command_buffers[list->vulkan.active_command_buffer], 0, 1, &scissor);
539540
}
540541

541542
void kore_vulkan_command_list_set_blend_constant(kore_gpu_command_list *list, kore_gpu_color color) {}
@@ -546,7 +547,7 @@ void kore_vulkan_command_list_set_name(kore_gpu_command_list *list, const char *
546547
const VkDebugUtilsObjectNameInfoEXT name_info = {
547548
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
548549
.objectType = VK_OBJECT_TYPE_COMMAND_BUFFER,
549-
.objectHandle = (uint64_t)list->vulkan.command_buffer,
550+
.objectHandle = (uint64_t)list->vulkan.command_buffers[list->vulkan.active_command_buffer],
550551
.pObjectName = name,
551552
};
552553
vulkanSetDebugUtilsObjectName(list->vulkan.device, &name_info);
@@ -559,11 +560,11 @@ void kore_vulkan_command_list_push_debug_group(kore_gpu_command_list *list, cons
559560
.pLabelName = name,
560561
.color = {0.0f, 0.0f, 1.0f, 1.0f},
561562
};
562-
vulkanCmdBeginDebugUtilsLabel(list->vulkan.command_buffer, &label_info);
563+
vulkanCmdBeginDebugUtilsLabel(list->vulkan.command_buffers[list->vulkan.active_command_buffer], &label_info);
563564
}
564565

565566
void kore_vulkan_command_list_pop_debug_group(kore_gpu_command_list *list) {
566-
vulkanCmdEndDebugUtilsLabel(list->vulkan.command_buffer);
567+
vulkanCmdEndDebugUtilsLabel(list->vulkan.command_buffers[list->vulkan.active_command_buffer]);
567568
}
568569

569570
void kore_vulkan_command_list_insert_debug_marker(kore_gpu_command_list *list, const char *name) {
@@ -573,7 +574,7 @@ void kore_vulkan_command_list_insert_debug_marker(kore_gpu_command_list *list, c
573574
.pLabelName = name,
574575
.color = {0.0f, 0.0f, 1.0f, 1.0f},
575576
};
576-
vulkanCmdInsertDebugUtilsLabel(list->vulkan.command_buffer, &label_info);
577+
vulkanCmdInsertDebugUtilsLabel(list->vulkan.command_buffers[list->vulkan.active_command_buffer], &label_info);
577578
}
578579

579580
void kore_vulkan_command_list_begin_occlusion_query(kore_gpu_command_list *list, uint32_t query_index) {}

backends/gpu/vulkan/sources/device.c

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -934,24 +934,28 @@ void kore_vulkan_device_create_command_list(kore_gpu_device *device, kore_gpu_co
934934
list->vulkan.presenting = false;
935935
list->vulkan.render_pass_status = KORE_VULKAN_RENDER_PASS_STATUS_NONE;
936936

937-
const VkFenceCreateInfo fence_create_info = {
938-
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
939-
.pNext = NULL,
940-
.flags = 0,
941-
};
937+
for (uint32_t command_buffer_index = 0; command_buffer_index < KORE_VULKAN_INTERNAL_COMMAND_BUFFER_COUNT; ++command_buffer_index) {
938+
const VkFenceCreateInfo fence_create_info = {
939+
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
940+
.pNext = NULL,
941+
.flags = VK_FENCE_CREATE_SIGNALED_BIT,
942+
};
942943

943-
vkCreateFence(device->vulkan.device, &fence_create_info, NULL, &list->vulkan.fence);
944+
vkCreateFence(device->vulkan.device, &fence_create_info, NULL, &list->vulkan.fences[command_buffer_index]);
944945

945-
const VkCommandBufferAllocateInfo allocate_info = {
946-
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
947-
.pNext = NULL,
948-
.commandPool = device->vulkan.command_pool,
949-
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
950-
.commandBufferCount = 1,
951-
};
946+
const VkCommandBufferAllocateInfo allocate_info = {
947+
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
948+
.pNext = NULL,
949+
.commandPool = device->vulkan.command_pool,
950+
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
951+
.commandBufferCount = 1,
952+
};
952953

953-
VkResult result = vkAllocateCommandBuffers(device->vulkan.device, &allocate_info, &list->vulkan.command_buffer);
954-
assert(result == VK_SUCCESS);
954+
VkResult result = vkAllocateCommandBuffers(device->vulkan.device, &allocate_info, &list->vulkan.command_buffers[command_buffer_index]);
955+
assert(result == VK_SUCCESS);
956+
}
957+
958+
list->vulkan.active_command_buffer = 0;
955959

956960
const VkCommandBufferBeginInfo begin_info = {
957961
.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
@@ -960,7 +964,7 @@ void kore_vulkan_device_create_command_list(kore_gpu_device *device, kore_gpu_co
960964
.pInheritanceInfo = NULL,
961965
};
962966

963-
vkBeginCommandBuffer(list->vulkan.command_buffer, &begin_info);
967+
vkBeginCommandBuffer(list->vulkan.command_buffers[list->vulkan.active_command_buffer], &begin_info);
964968
}
965969

966970
void kore_vulkan_device_create_texture(kore_gpu_device *device, const kore_gpu_texture_parameters *parameters, kore_gpu_texture *texture) {
@@ -1076,7 +1080,7 @@ kore_gpu_texture_format kore_vulkan_device_framebuffer_format(kore_gpu_device *d
10761080
void kore_vulkan_device_execute_command_list(kore_gpu_device *device, kore_gpu_command_list *list) {
10771081
kore_vulkan_texture_transition(list, &framebuffers[framebuffer_index], VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, 0, 1, 0, 1);
10781082

1079-
vkEndCommandBuffer(list->vulkan.command_buffer);
1083+
vkEndCommandBuffer(list->vulkan.command_buffers[list->vulkan.active_command_buffer]);
10801084

10811085
VkPipelineStageFlags stage_mask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
10821086

@@ -1087,7 +1091,7 @@ void kore_vulkan_device_execute_command_list(kore_gpu_device *device, kore_gpu_c
10871091
.pWaitSemaphores = NULL,
10881092
.pWaitDstStageMask = &stage_mask,
10891093
.commandBufferCount = 1,
1090-
.pCommandBuffers = &list->vulkan.command_buffer,
1094+
.pCommandBuffers = &list->vulkan.command_buffers[list->vulkan.active_command_buffer],
10911095
.signalSemaphoreCount = 0,
10921096
.pSignalSemaphores = NULL,
10931097
};
@@ -1097,7 +1101,10 @@ void kore_vulkan_device_execute_command_list(kore_gpu_device *device, kore_gpu_c
10971101
submit_info.pWaitSemaphores = get_framebuffer_available_semaphore();
10981102
}
10991103

1100-
VkResult result = vkQueueSubmit(device->vulkan.queue, 1, &submit_info, list->vulkan.fence);
1104+
VkResult result = vkResetFences(device->vulkan.device, 1, &list->vulkan.fences[list->vulkan.active_command_buffer]);
1105+
assert(result == VK_SUCCESS);
1106+
1107+
result = vkQueueSubmit(device->vulkan.queue, 1, &submit_info, list->vulkan.fences[list->vulkan.active_command_buffer]);
11011108
assert(result == VK_SUCCESS);
11021109

11031110
if (list->vulkan.presenting) {
@@ -1134,11 +1141,9 @@ void kore_vulkan_device_execute_command_list(kore_gpu_device *device, kore_gpu_c
11341141

11351142
list->vulkan.presenting = false;
11361143

1137-
// TODO: Use multiple command buffers to avoid waits
1138-
result = vkWaitForFences(device->vulkan.device, 1, &list->vulkan.fence, VK_TRUE, UINT64_MAX);
1139-
assert(result == VK_SUCCESS);
1144+
list->vulkan.active_command_buffer = (list->vulkan.active_command_buffer + 1) % KORE_VULKAN_INTERNAL_COMMAND_BUFFER_COUNT;
11401145

1141-
result = vkResetFences(device->vulkan.device, 1, &list->vulkan.fence);
1146+
result = vkWaitForFences(device->vulkan.device, 1, &list->vulkan.fences[list->vulkan.active_command_buffer], VK_TRUE, UINT64_MAX);
11421147
assert(result == VK_SUCCESS);
11431148

11441149
const VkCommandBufferBeginInfo begin_info = {
@@ -1148,7 +1153,7 @@ void kore_vulkan_device_execute_command_list(kore_gpu_device *device, kore_gpu_c
11481153
.pInheritanceInfo = NULL,
11491154
};
11501155

1151-
vkBeginCommandBuffer(list->vulkan.command_buffer, &begin_info);
1156+
vkBeginCommandBuffer(list->vulkan.command_buffers[list->vulkan.active_command_buffer], &begin_info);
11521157
}
11531158

11541159
void kore_vulkan_device_wait_until_idle(kore_gpu_device *device) {

0 commit comments

Comments
 (0)