From e5eed5bdfa01cf549436c6001eaf334d266acc40 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Sat, 14 Sep 2024 22:38:51 -0700 Subject: fix lifetime problem --- src/vulkan_swapchain.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'src/vulkan_swapchain.cpp') diff --git a/src/vulkan_swapchain.cpp b/src/vulkan_swapchain.cpp index 41d27a5..7916a3b 100644 --- a/src/vulkan_swapchain.cpp +++ b/src/vulkan_swapchain.cpp @@ -152,7 +152,7 @@ Swapchain::Swapchain(GLFWwindow *window, , window(window) , width(width) , height(height) - , cmd_buf(device.create_command_buffer()) + , cmd_buf(device.create_async_command_buffer()) { if (!glfwVulkanSupported()) { std::cerr << "GLFW failed to find Vulkan support" << std::endl; @@ -160,7 +160,6 @@ Swapchain::Swapchain(GLFWwindow *window, abort(); } - std::cerr << "Creating surface" << std::endl; // Create the surface CHECK_VULKAN(glfwCreateWindowSurface( device.instance, @@ -326,7 +325,6 @@ void Swapchain::start_frame() { } void Swapchain::display(Texture2D& texture) { - std::cerr << "Displaying" << std::endl; VkResult present_result = vkAcquireNextImageKHR( device.device, swapchain, @@ -345,14 +343,13 @@ void Swapchain::display(Texture2D& texture) { CHECK_VULKAN(present_result); } - std::cerr << "starting image layout transition" << std::endl; // Command buffer begins at the very start of the frame // Blit the texture to the swapchain image { // swapchain image layout, undefined -> transfer dst VkImageMemoryBarrier swapchain_image_barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .srcAccessMask = 0, + .srcAccessMask = VK_ACCESS_MEMORY_WRITE_BIT, .dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT, .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, .newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, @@ -368,7 +365,7 @@ void Swapchain::display(Texture2D& texture) { // src image layout, whatever -> transfer src VkImageMemoryBarrier src_image_barrier = { .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, - .srcAccessMask = 0, + .srcAccessMask = VK_ACCESS_MEMORY_READ_BIT, .dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT, .oldLayout = texture->layout, .newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, @@ -381,8 +378,9 @@ void Swapchain::display(Texture2D& texture) { .layerCount = 1, }, }; - VkImageMemoryBarrier barriers[2] = {swapchain_image_barrier, src_image_barrier}; - std::cerr << "starting image layout transition of 2" << std::endl; + VkImageMemoryBarrier barriers[] = {src_image_barrier, swapchain_image_barrier}; + uint32_t barrier_count = sizeof(barriers) / sizeof(VkImageMemoryBarrier); + vkCmdPipelineBarrier( cmd_buf.buffer, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, @@ -390,7 +388,7 @@ void Swapchain::display(Texture2D& texture) { 0, 0, nullptr, 0, nullptr, - 2, barriers); + barrier_count, barriers); // Blit the texture to the swapchain image VkImageBlit blit = { @@ -415,7 +413,6 @@ void Swapchain::display(Texture2D& texture) { {static_cast(width), static_cast(height), 1}, }, }; - std::cerr << "Starting blit" << std::endl; vkCmdBlitImage( cmd_buf.buffer, texture->image, @@ -435,15 +432,26 @@ void Swapchain::display(Texture2D& texture) { VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; vkCmdPipelineBarrier( cmd_buf.buffer, - VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, nullptr, 0, nullptr, 1, &swapchain_image_barrier); + src_image_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + src_image_barrier.newLayout = texture->layout; + src_image_barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + src_image_barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT; + vkCmdPipelineBarrier( + cmd_buf.buffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, + 0, nullptr, + 0, nullptr, + 1, &src_image_barrier); } - std::cerr << "starting render pass" << std::endl; // Render VkRenderPassBeginInfo render_pass_begin_info = { .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, @@ -459,7 +467,6 @@ void Swapchain::display(Texture2D& texture) { cmd_buf.buffer, &render_pass_begin_info, VK_SUBPASS_CONTENTS_INLINE); - std::cerr << "rendering imgui" << std::endl; ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), cmd_buf.buffer); vkCmdEndRenderPass(cmd_buf.buffer); -- cgit v1.2.3-70-g09d2