summaryrefslogtreecommitdiff
path: root/src/vulkan_swapchain.cpp
diff options
context:
space:
mode:
authorChuyan Zhang <me@zcy.moe>2024-09-14 22:38:51 -0700
committerChuyan Zhang <me@zcy.moe>2024-09-14 22:38:51 -0700
commite5eed5bdfa01cf549436c6001eaf334d266acc40 (patch)
tree0cef8c1c20aca8380d058c2676e0718040e3beda /src/vulkan_swapchain.cpp
parent7f14138e1baa2c40fb30d90ebcd45ad17b12e0a3 (diff)
downloadiris-e5eed5bdfa01cf549436c6001eaf334d266acc40.tar.gz
iris-e5eed5bdfa01cf549436c6001eaf334d266acc40.zip
fix lifetime problem
Diffstat (limited to 'src/vulkan_swapchain.cpp')
-rw-r--r--src/vulkan_swapchain.cpp33
1 files changed, 20 insertions, 13 deletions
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<int32_t>(width), static_cast<int32_t>(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);