Skip to content
Snippets Groups Projects
Commit b35c7883 authored by Lava Block's avatar Lava Block
Browse files

add one_time_command_buffer

parent 7ddf3f36
No related branches found
No related tags found
No related merge requests found
......@@ -243,3 +243,41 @@ VkShaderModule lava::create_shader_module(device_ptr device, data const& data) {
return result;
}
bool lava::one_time_command_buffer(lava::device_ptr device, VkCommandPool pool, lava::queue::ref queue, one_time_command_func callback) {
if (!callback)
return false;
VkCommandBuffer cmd_buf = nullptr;
if (!device->vkAllocateCommandBuffers(pool, 1, &cmd_buf, VK_COMMAND_BUFFER_LEVEL_PRIMARY))
return false;
VkCommandBufferBeginInfo const begin_info = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT };
if (!check(device->call().vkBeginCommandBuffer(cmd_buf, &begin_info)))
return false;
callback(cmd_buf);
device->call().vkEndCommandBuffer(cmd_buf);
VkFence fence = VK_NULL_HANDLE;
VkFenceCreateInfo const fence_info = { .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO };
if (!device->vkCreateFence(&fence_info, &fence))
return false;
VkSubmitInfo const submit_info = { .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.commandBufferCount = 1,
.pCommandBuffers = &cmd_buf };
if (!device->vkQueueSubmit(queue.vk_queue, 1, &submit_info, fence)) {
device->vkDestroyFence(fence);
return false;
}
device->vkWaitForFences(1, &fence, VK_TRUE, ~0);
device->vkDestroyFence(fence);
device->vkFreeCommandBuffers(pool, 1, &cmd_buf);
return true;
}
\ No newline at end of file
......@@ -175,4 +175,7 @@ namespace lava {
VkShaderModule create_shader_module(device_ptr device, data const& data);
using one_time_command_func = std::function<void(VkCommandBuffer)>;
bool one_time_command_buffer(device_ptr device, VkCommandPool pool, queue::ref queue, one_time_command_func callback);
} // namespace lava
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment