Vulkan-在vkQueuePresentKHR处,验证层会引发有关图像布局的错误消息

时间:2018-10-21 13:39:20

标签: image runtime-error vulkan

我已经完成了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规范指出:pImageIndices的每个元素必须是从pSwapchains数组的相应元素指定的交换链中获取的可显示图像的索引,并且在执行操作时,所显示的图像子资源必须位于VK_IMAGE_LAYOUT_PRESENT_SRC_KHR布局中VkDevice(https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkPresentInfoKHR-pImageIndices-01296

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

为什么交换链的图像会在短时间内处于错误的布局,而在经过最多两次循环之后又回到正确的布局?

编辑:
这是生成此错误的代码: 2DVkEngine - GitHub
错误位置:2DVkEngine \ VkRendererAttempt1 \ JF \ Source \ VkRenderer.cpp \-> jf::VkRenderer::draw()-> jf::vkQueuePresentKHR()
(我怀疑该错误是由于VkCommandBuffer引起的,因为我是第一次使用辅助命令缓冲区)

1 个答案:

答案 0 :(得分:0)

我知道这个问题很旧,但是我一直在努力解决完全相同的问题,要弄清楚这个问题很痛苦,所以我想把这个答案留给其他人:

在我的情况下,发生的事情是在交换链重新创建后,我丢失了帧缓冲区和各个交换链图像之间的同步。 这导致使用错误的帧缓冲区,从而渲染到与交换链所请求的图像不同的图像。

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

当然,您的程序将继续显示错误的图像,但是如果场景是静态的,则无法观察到。