Vulkan:为什么我们需要在 VkQueuePresentKHR 之后检查 window resize
Vulkan: Why do we need to check for window resize after VkQueuePresentKHR
我正在学习 vulkan 教程,目前在交换链娱乐部分。
https://vulkan-tutorial.com/Drawing_a_triangle/Swap_chain_recreation
我们应该通过将布尔变量 framebufferResized 设置为 true 来显式处理调整大小,无论 window 调整大小回调方法是否被调用。然后,如果 window 已调整大小,我们将在每帧调用的 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();
}
这是我在教程中感到困惑的声明:"It is important to do this after vkQueuePresentKHR to ensure that the semaphores are in a consistent state, otherwise a signalled semaphore may never be properly waited upon." 我假设的 "this" 是对布尔 framebufferResized 和后续 recreateSwapChain() 的检查。信号量只是确保我们在绘制之前成功获取图像,然后在呈现之前成功绘制到它的信号量。因此,作者在说什么对我来说毫无意义。
据推测,"signal" 指的是 vkAcquire
并且交换链娱乐受到 vkDeviceWaitIdle
之类的保护。据推测,作者担心 VK_SUBOPTIMAL
,并希望在这种情况下重新创建交换链。
但是 vkDeviceWaitIdle
不包括来自 vkAcquire
的待定信号量,正如这里确认的:https://github.com/KhronosGroup/Vulkan-Docs/issues/1059.
这意味着信号量必须首先被 vkQueueSubmit
等待。只有这样,信号量才能被 vk*WaitIdle
命令捕获,并且只有在以有效方式销毁之后。
我正在学习 vulkan 教程,目前在交换链娱乐部分。
https://vulkan-tutorial.com/Drawing_a_triangle/Swap_chain_recreation
我们应该通过将布尔变量 framebufferResized 设置为 true 来显式处理调整大小,无论 window 调整大小回调方法是否被调用。然后,如果 window 已调整大小,我们将在每帧调用的 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();
}
这是我在教程中感到困惑的声明:"It is important to do this after vkQueuePresentKHR to ensure that the semaphores are in a consistent state, otherwise a signalled semaphore may never be properly waited upon." 我假设的 "this" 是对布尔 framebufferResized 和后续 recreateSwapChain() 的检查。信号量只是确保我们在绘制之前成功获取图像,然后在呈现之前成功绘制到它的信号量。因此,作者在说什么对我来说毫无意义。
据推测,"signal" 指的是 vkAcquire
并且交换链娱乐受到 vkDeviceWaitIdle
之类的保护。据推测,作者担心 VK_SUBOPTIMAL
,并希望在这种情况下重新创建交换链。
但是 vkDeviceWaitIdle
不包括来自 vkAcquire
的待定信号量,正如这里确认的:https://github.com/KhronosGroup/Vulkan-Docs/issues/1059.
这意味着信号量必须首先被 vkQueueSubmit
等待。只有这样,信号量才能被 vk*WaitIdle
命令捕获,并且只有在以有效方式销毁之后。