kiba-engine
command_buffer.c
1 #include <kiba/renderer/vulkan/command_buffer.h>
2 
3 b8 vulkan_command_buffer_record(vulkan_context *context, VkCommandBuffer command_buffer, u32 image_index) {
4  VkCommandBufferBeginInfo cb_begin_info = {
5  .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
6  .flags = 0,
7  .pInheritanceInfo = NULL,
8  };
9  VK_CALL_B8(vkBeginCommandBuffer(command_buffer, &cb_begin_info));
10 
11  VkFramebuffer fb = context->swap_chain.framebuffers[image_index];
12  VkClearValue clear_colors[] = {
13  {.color = {.float32 = {0.0f, 0.0f, 0.0f, 1.0f}}},
14  {.depthStencil = {.depth = 1.f, .stencil = 0}},
15  };
16  VkRenderPassBeginInfo rp_begin_info = {
17  .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
18  .renderPass = context->pipeline.renderpass,
19  .framebuffer = fb,
20  .renderArea = {.offset = {0, 0}, .extent = context->swap_chain.extent},
21  .clearValueCount = sizeof(clear_colors) / sizeof(clear_colors[0]),
22  .pClearValues = clear_colors,
23  };
24  vkCmdBeginRenderPass(command_buffer, &rp_begin_info, VK_SUBPASS_CONTENTS_INLINE);
25 
26  vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, context->pipeline.graphics_pipeline);
27 
28  VkViewport viewport = {
29  .x = 0.0f,
30  .y = 0.0f,
31  .width = (f32) context->swap_chain.extent.width,
32  .height = (f32) context->swap_chain.extent.height,
33  .minDepth = 0.0f,
34  .maxDepth = 1.0f,
35  };
36  vkCmdSetViewport(command_buffer, 0, 1, &viewport);
37 
38  VkRect2D scissor = {
39  .offset = {0, 0},
40  .extent = context->swap_chain.extent,
41  };
42  vkCmdSetScissor(command_buffer, 0, 1, &scissor);
43 
44  // vertex data
45  VkDeviceSize offset = 0;
46  vkCmdBindVertexBuffers(command_buffer, 0, 1, &context->vertex_data.buffer, &offset);
47 
48  // index data
49  vkCmdBindIndexBuffer(command_buffer, context->index_data.buffer, offset, VK_INDEX_TYPE_UINT32);
50 
51  // descriptor sets
52  vkCmdBindDescriptorSets(command_buffer,
53  VK_PIPELINE_BIND_POINT_GRAPHICS,
54  context->pipeline.layout,
55  0,
56  1,
57  &context->pipeline.descriptor_sets[image_index],
58  0,
59  KB_NULL);
60 
61  vkCmdDrawIndexed(command_buffer, context->index_count, 1, 0, 0, 0);
62 
63  vkCmdEndRenderPass(command_buffer);
64 
65  VK_CALL_B8(vkEndCommandBuffer(command_buffer));
66  return true;
67 }
68 
69 b8 vulkan_command_buffer_start_single_time_command(vulkan_context *context, VkCommandBuffer *command_buffer) {
70  VkCommandBufferAllocateInfo alloc_info = {
71  .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
72  .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
73  .commandPool = context->device.graphics_queue.command_pool,
74  .commandBufferCount = 1,
75  };
76  VK_CALL_B8(vkAllocateCommandBuffers(context->device.logical, &alloc_info, command_buffer));
77 
78  VkCommandBufferBeginInfo begin_info = {
79  .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
80  .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
81  };
82  VK_CALL_B8(vkBeginCommandBuffer(*command_buffer, &begin_info));
83  return true;
84 }
85 
86 b8 vulkan_command_buffer_end_single_time_command(vulkan_context *context, VkCommandBuffer *command_buffer) {
87  VK_CALL_B8(vkEndCommandBuffer(*command_buffer));
88 
89  VkSubmitInfo submit_info = {
90  .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
91  .commandBufferCount = 1,
92  .pCommandBuffers = command_buffer,
93  };
94  VK_CALL_B8(vkQueueSubmit(context->device.graphics_queue.queue, 1, &submit_info, VK_NULL_HANDLE));
95  VK_CALL_B8(vkQueueWaitIdle(context->device.graphics_queue.queue));
96 
97  vkFreeCommandBuffers(context->device.logical, context->device.graphics_queue.command_pool, 1, command_buffer);
98 
99  return true;
100 }
#define KB_NULL
Value of an invalid ptr (nullptr).
Definition: defines.h:18