diff options
| author | vimene <vincent.menegaux@gmail.com> | 2025-12-18 20:49:50 +0100 |
|---|---|---|
| committer | vimene <vincent.menegaux@gmail.com> | 2025-12-18 20:49:50 +0100 |
| commit | c9d3b369a868dc54e4c5cc26a9354dddbe91db1b (patch) | |
| tree | 372f183cf75799afec66dc1d5c277f2a06ffd8b0 | |
| parent | 0639c2e9a3e1a1ecf36a66a5f2dd844b772856db (diff) | |
| download | engine-c9d3b369a868dc54e4c5cc26a9354dddbe91db1b.tar.gz | |
added command buffers and their records
| -rw-r--r-- | src/engine.cpp | 153 |
1 files changed, 141 insertions, 12 deletions
diff --git a/src/engine.cpp b/src/engine.cpp index 1c9f109..1ade915 100644 --- a/src/engine.cpp +++ b/src/engine.cpp @@ -426,6 +426,44 @@ static std::tuple<std::optional<uint32_t>, std::optional<uint32_t>> find_queue_f return { graphics_queue_family_index, presentation_queue_family_index }; } +static void transition_image_layout(VkCommandBuffer cmd_buf, VkImage img, + VkImageLayout old_layout, VkImageLayout new_layout, + VkAccessFlags2 src_access_mask, VkAccessFlags2 dst_access_mask, + VkPipelineStageFlags2 src_stage_mask, VkPipelineStageFlags2 dst_stage_mask) { + VkImageMemoryBarrier2 img_mem_barrier { + .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER_2, + .pNext = nullptr, + .srcStageMask = src_stage_mask, + .srcAccessMask = src_access_mask, + .dstStageMask = dst_stage_mask, + .dstAccessMask = dst_access_mask, + .oldLayout = old_layout, + .newLayout = new_layout, + .srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED, + .image = img, + .subresourceRange = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }, + }; + VkDependencyInfo dependency_info { + .sType = VK_STRUCTURE_TYPE_DEPENDENCY_INFO, + .pNext = nullptr, + .dependencyFlags = {}, + .memoryBarrierCount = 0, + .pMemoryBarriers = {}, + .bufferMemoryBarrierCount = 0, + .pBufferMemoryBarriers = {}, + .imageMemoryBarrierCount = 1, + .pImageMemoryBarriers = &img_mem_barrier, + }; + vkCmdPipelineBarrier2(cmd_buf, &dependency_info); +} + static int main_graphical() { // init window glfwInit(); @@ -983,18 +1021,6 @@ static int main_graphical() { .primitiveRestartEnable = VK_FALSE, }; - VkViewport viewport { - .x = 0.f, - .y = 0.f, - .width = static_cast<float>(swapchain_extent.width), - .height = static_cast<float>(swapchain_extent.height), - .minDepth = 0.f, - .maxDepth = 1.f, - }; - VkRect2D scissor { - .offset = { 0, 0 }, - .extent = swapchain_extent, - }; VkPipelineViewportStateCreateInfo pl_viewport_state_create_info { .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, .pNext = nullptr, @@ -1115,12 +1141,115 @@ static int main_graphical() { // destroy when pipeline creation is finished vkDestroyShaderModule(logical_device, shader_module, nullptr); + VkCommandPoolCreateInfo cmd_pool_ci { + .sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, + .pNext = nullptr, + .flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT, + .queueFamilyIndex = graphics_queue_family_index, + }; + VkCommandPool cmd_pool; + if (VkResult res = vkCreateCommandPool(logical_device, &cmd_pool_ci, nullptr, &cmd_pool); res != VK_SUCCESS) { + std::cerr << "failed to create command pool, error code: " << string_VkResult(res) << std::endl; + std::exit(EXIT_FAILURE); + } + + VkCommandBufferAllocateInfo cmd_buf_ai { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .pNext = nullptr, + .commandPool = cmd_pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = 1, + }; + VkCommandBuffer cmd_buf; + if (VkResult res = vkAllocateCommandBuffers(logical_device, &cmd_buf_ai, &cmd_buf); res != VK_SUCCESS) { + std::cerr << "failed to allocate command buffer, error code: " << string_VkResult(res) << std::endl; + std::exit(EXIT_FAILURE); + } + // main loop while (!glfwWindowShouldClose(window)) { glfwPollEvents(); + + // this shouldn't be a function, it has to be removed (but keep the inside) once it can run. + // Keeping it like this gives the opportunity to check for simple errors while it can't run + [&]() { + uint32_t img_idx {}; // TODO: define properly + VkCommandBufferBeginInfo cmd_buf_bi { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .pNext = nullptr, + .flags = {}, + .pInheritanceInfo = {}, + }; + if (VkResult res = vkBeginCommandBuffer(cmd_buf, &cmd_buf_bi); res != VK_SUCCESS) { + std::cerr << "failed to begin command buffer, error code: " << string_VkResult(res) << std::endl; + std::exit(EXIT_FAILURE); + } + transition_image_layout(cmd_buf, swapchain_imgs[img_idx], + VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + {}, VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT, + VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT); + VkClearValue clear_val { .color = { .float32 = { 0.f, 0.f, 0.f, 1.f } }, }; + VkRenderingAttachmentInfo attachment_info { + .sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO, + .pNext = nullptr, + .imageView = swapchain_img_views[img_idx], + .imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + .resolveMode = {}, + .resolveImageView = {}, + .resolveImageLayout = {}, + .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, + .storeOp = VK_ATTACHMENT_STORE_OP_STORE, + .clearValue = clear_val, + }; + VkRenderingInfo render_info { + .sType = VK_STRUCTURE_TYPE_RENDERING_INFO, + .pNext = nullptr, + .flags = {}, + .renderArea = { .offset { 0, 0 }, .extent = swapchain_extent }, + .layerCount = 1, + .viewMask = {}, + .colorAttachmentCount = 1, + .pColorAttachments = &attachment_info, + .pDepthAttachment = {}, + .pStencilAttachment = {}, + }; + vkCmdBeginRendering(cmd_buf, &render_info); + vkCmdBindPipeline(cmd_buf, VK_PIPELINE_BIND_POINT_GRAPHICS, graphics_pl); + + VkViewport viewport { + .x = 0.f, + .y = 0.f, + .width = static_cast<float>(swapchain_extent.width), + .height = static_cast<float>(swapchain_extent.height), + .minDepth = 0.f, + .maxDepth = 1.f, + }; + vkCmdSetViewport(cmd_buf, 0, 1, &viewport); + + VkRect2D scissor { + .offset = { 0, 0 }, + .extent = swapchain_extent, + }; + vkCmdSetScissor(cmd_buf, 0, 1, &scissor); + + vkCmdDraw(cmd_buf, 3, 1, 0, 0); + + vkCmdEndRendering(cmd_buf); + + transition_image_layout(cmd_buf, swapchain_imgs[img_idx], + VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, + VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT, {}, + VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_2_BOTTOM_OF_PIPE_BIT); + + if (VkResult res = vkEndCommandBuffer(cmd_buf); res != VK_SUCCESS) { + std::cerr << "failed to end command buffer, error code: " << string_VkResult(res) << std::endl; + std::exit(EXIT_FAILURE); + } + }; } // cleanup + vkDestroyCommandPool(logical_device, cmd_pool, nullptr); vkDestroyPipeline(logical_device, graphics_pl, nullptr); vkDestroyPipelineLayout(logical_device, pl_layout, nullptr); for (const auto img_view : swapchain_img_views) |
