@@ -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