Skip to content

Commit de1879c

Browse files
committed
Correctly handle vk::Result::eOutOfDate from vk::raii::SwapchainKHR::acquireNextImage and vk::raii::Queue::presentKHR
1 parent 0e3035d commit de1879c

File tree

1 file changed

+26
-31
lines changed

1 file changed

+26
-31
lines changed

attachments/17_swap_chain_recreation.cpp

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class HelloTriangleApplication
6767
std::vector<vk::raii::Semaphore> presentCompleteSemaphores;
6868
std::vector<vk::raii::Semaphore> renderFinishedSemaphores;
6969
std::vector<vk::raii::Fence> inFlightFences;
70-
uint32_t frameIndex = 0;
70+
uint32_t frameIndex = 0;
7171

7272
bool framebufferResized = false;
7373

@@ -340,7 +340,7 @@ class HelloTriangleApplication
340340
assert(swapChainImageViews.empty());
341341

342342
vk::ImageViewCreateInfo imageViewCreateInfo{.viewType = vk::ImageViewType::e2D, .format = swapChainSurfaceFormat.format, .subresourceRange = {vk::ImageAspectFlagBits::eColor, 0, 1, 0, 1}};
343-
for (auto& image : swapChainImages)
343+
for (auto &image : swapChainImages)
344344
{
345345
imageViewCreateInfo.image = image;
346346
swapChainImageViews.emplace_back(device, imageViewCreateInfo);
@@ -509,9 +509,13 @@ class HelloTriangleApplication
509509
;
510510
device.resetFences(*inFlightFences[frameIndex]);
511511

512-
auto [result, imageIndex] = swapChain.acquireNextImage(UINT64_MAX, *presentCompleteSemaphores[frameIndex], nullptr);
513-
514-
if (result == vk::Result::eErrorOutOfDateKHR)
512+
vk::Result result;
513+
uint32_t imageIndex;
514+
try
515+
{
516+
std::tie(result, imageIndex) = swapChain.acquireNextImage(UINT64_MAX, *presentCompleteSemaphores[frameIndex], nullptr);
517+
}
518+
catch (vk::OutOfDateKHRError const &error)
515519
{
516520
recreateSwapChain();
517521
return;
@@ -535,40 +539,31 @@ class HelloTriangleApplication
535539
.pSignalSemaphores = &*renderFinishedSemaphores[imageIndex]};
536540
queue.submit(submitInfo, *inFlightFences[frameIndex]);
537541

542+
const vk::PresentInfoKHR presentInfoKHR{.waitSemaphoreCount = 1,
543+
.pWaitSemaphores = &*renderFinishedSemaphores[imageIndex],
544+
.swapchainCount = 1,
545+
.pSwapchains = &*swapChain,
546+
.pImageIndices = &imageIndex};
538547
try
539548
{
540-
const vk::PresentInfoKHR presentInfoKHR{.waitSemaphoreCount = 1,
541-
.pWaitSemaphores = &*renderFinishedSemaphores[imageIndex],
542-
.swapchainCount = 1,
543-
.pSwapchains = &*swapChain,
544-
.pImageIndices = &imageIndex};
545549
result = queue.presentKHR(presentInfoKHR);
546-
if (result == vk::Result::eSuboptimalKHR || framebufferResized)
547-
{
548-
framebufferResized = false;
549-
recreateSwapChain();
550-
}
551-
else if (result != vk::Result::eSuccess)
552-
{
553-
throw std::runtime_error("failed to present swap chain image!");
554-
}
555550
}
556-
catch (const vk::SystemError &e)
551+
catch (vk::OutOfDateKHRError const &error)
557552
{
558-
if (e.code().value() == static_cast<int>(vk::Result::eErrorOutOfDateKHR))
559-
{
560-
recreateSwapChain();
561-
return;
562-
}
563-
else
564-
{
565-
throw;
566-
}
553+
recreateSwapChain();
554+
return;
555+
}
556+
assert(result == vk::Result::eSuccess || result == vk::Result::eSuboptimalKHR);
557+
if (result == vk::Result::eSuboptimalKHR || framebufferResized)
558+
{
559+
framebufferResized = false;
560+
recreateSwapChain();
567561
}
568-
frameIndex = (frameIndex + 1) % MAX_FRAMES_IN_FLIGHT;
562+
frameIndex = (frameIndex + 1) % MAX_FRAMES_IN_FLIGHT;
569563
}
570564

571-
[[nodiscard]] vk::raii::ShaderModule createShaderModule(const std::vector<char> &code) const
565+
[[nodiscard]] vk::raii::ShaderModule
566+
createShaderModule(const std::vector<char> &code) const
572567
{
573568
vk::ShaderModuleCreateInfo createInfo{.codeSize = code.size() * sizeof(char), .pCode = reinterpret_cast<const uint32_t *>(code.data())};
574569
vk::raii::ShaderModule shaderModule{device, createInfo};

0 commit comments

Comments
 (0)