【问题标题】:Vulkan: Why do we need to check for window resize after VkQueuePresentKHRVulkan:为什么我们需要在 VkQueuePresentKHR 之后检查窗口调整大小
【发布时间】:2020-01-20 14:55:18
【问题描述】:

我正在关注 vulkan 教程,目前是交换链娱乐的一部分。

https://vulkan-tutorial.com/Drawing_a_triangle/Swap_chain_recreation

我们应该通过将布尔变量 framebufferResized 设置为 true 来显式处理调整大小,无论是否调用窗口调整大小回调方法。然后,如果窗口已调整大小,我们会在每帧调用的 drawFrame 方法中重新创建交换链。像下面的东西。

VkResult result = vkAcquireNextImageKHR(device, swapChain, UINT64_MAX, imageAvailableSemaphores[currentFrame], VK_NULL_HANDLE, &imageIndex);
...
result = vkQueuePresentKHR(presentQueue, &presentInfo);
if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || framebufferResized) {
    framebufferResized = false;
    recreateSwapChain();
}

这是我在教程中感到困惑的语句:“重要的是在 vkQueuePresentKHR 之后执行此操作,以确保信号量处于一致状态,否则可能永远无法正确等待带信号的信号量。”我假设的“this”是检查 boolean framebufferResized 和随后的 recreateSwapChain()。信号量只是确保我们在绘制到图像之前成功获取图像,然后在呈现之前成功绘制到它的信号量。因此,作者在说什么对我来说毫无意义。

【问题讨论】:

    标签: vulkan


    【解决方案1】:

    据推测,“信号”指的是vkAcquire,而交换链再造受到vkDeviceWaitIdle 之类的保护。并且推测作者是担心VK_SUBOPTIMAL,并想在这种情况下重新创建交换链。

    vkDeviceWaitIdle 不涵盖来自vkAcquire 的待处理信号量,此处已确认:https://github.com/KhronosGroup/Vulkan-Docs/issues/1059

    这意味着信号量必须首先由vkQueueSubmit 等待。只有这样,信号量才能被vk*WaitIdle 命令捕获,并且只有在以有效方式销毁之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 2012-10-18
      相关资源
      最近更新 更多