ste_presentation_surface::acquire_next_image_return_t ste_presentation_surface::acquire_swapchain_image_impl( std::uint64_t timeout_ns, semaphore &presentation_image_ready_semaphore, const vk::vk_fence<> *presentation_image_ready_fence) const { acquire_next_image_return_t ret; vk::vk_result res = vkAcquireNextImageKHR(*presentation_device, *swap_chain, timeout_ns, presentation_image_ready_semaphore ? static_cast<VkSemaphore>(*presentation_image_ready_semaphore) : vk::vk_null_handle, presentation_image_ready_fence ? static_cast<VkFence>(*presentation_image_ready_fence) : vk::vk_null_handle, &ret.image_index); // Host signal semaphore presentation_image_ready_semaphore.signal_host(); switch (res.get()) { case VK_SUBOPTIMAL_KHR: ret.sub_optimal = true; case VK_SUCCESS: ret.image = &swap_chain_images[ret.image_index]; break; case VK_ERROR_OUT_OF_DATE_KHR: ret.sub_optimal = true; break; default: throw vk::vk_exception(res); } // Furthermore raise flag to recreate swap-chain if (res != VK_SUCCESS) shared_data.swap_chain_optimal_flag.clear(std::memory_order_release); return ret; }