aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine.cpp153
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)