Vulkan - 在 vkQueuePresentKHR 上,验证层会抛出有关图像布局的错误消息



我已经完成了 vulkan-tutorial.com 教程并尝试使用 Vulkan 编写一个小程序,但我遇到了以下问题:

该程序只是显示一个图像并运行而没有错误,但是在窗口的大小更改后,从而重新创建了交换链等,验证层会在vkQueuePresentKHR函数中抛出错误消息:

验证层: [ VUID-VkPresentInfoKHR-pImageIndices-01296 ] 对象: 0x4e3b5f0 (类型 = 4( |传递到演示文稿的图像必须位于布局VK_IMAGE_LAYOUT_PRESENT_SRC_KHR或VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR中,但处于VK_IMAGE_LAYOUT_UNDEFINED中。Vulkan规范指出:pImageIndex的每个元素必须是从pSwapchain数组的相应元素指定的交换链中获取的可呈现图像的索引,并且在VkDevice(https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pImageIndices-01296(上执行操作时,呈现的图像子资源必须位于VK_IMAGE_LAYOUT_PRESENT_SRC_KHR布局中

。当交换链和依赖于窗口大小的所有其他对象已重新创建并调用vkQueuePresentKHR时,不会发生此错误消息一次或两次。

为什么交换链的图像可以在短时间内处于错误的布局中,并在最多两次循环传递后恢复到正确的布局?

我知道这个问题很老,但我一直在为完全相同的问题而苦苦挣扎,弄清楚它很痛苦,所以我想把这个答案留给其他人:

在我的案例中,在交换链重新创建之后,我失去了帧缓冲区和相应的交换链图像之间的同步。 这导致使用了错误的帧缓冲区,从而渲染到与交换链请求的不同图像。

在交换链重新创建之后,所有图像都处于VK_IMAGE_LAYOUT_UNDEFINED状态,导致验证层捕获问题。 但是,一旦您(错误地(渲染到所有这些图像,它们的布局将不再未定义,并且不再报告错误。

当然,你的程序会继续显示错误的图像,但如果场景是静态的,这是不可能观察到的。

我知道这个问题现在已经很老了,可能已经回答了,但是我也遇到了类似的问题,结果证明是由Vulkan验证层中的错误引起的。可能这也是由该错误引起的。https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/4422

您可以尝试关闭验证层并逐帧逐步浏览代码,以检查图像是否呈现。

最新更新