image - Vulkan - 在 vkQueuePresentKHR,验证层抛出关于图像布局的错误消息
问题描述
我已经完成了 vulkan-tutorial.com 教程并尝试使用 Vulkan 编写一个小程序,但我遇到了以下问题:
该程序简单地显示一个图像并且运行没有错误,但是在窗口的大小改变之后,交换链等被重新创建,一个验证层在vkQueuePresentKHR
函数中抛出一个错误消息:
验证层:[VUID-VkPresentInfoKHR-pImageIndices-01296] 对象:0x4e3b5f0 (Type = 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
当交换链和依赖于窗口大小的所有其他对象已重新创建并已被调用时,不会出现此错误消息一次或两次。
为什么交换链的图像可以在短时间内处于错误的布局,并且在最多两次循环后又回到正确的布局?
解决方案
我知道这个问题很老了,但我一直在为同样的问题而苦苦挣扎,弄明白它很痛苦,所以我想把这个答案留给其他人:
在我的情况下发生的事情是,在交换链重新创建之后,我失去了帧缓冲区和相应交换链图像之间的同步。这导致使用错误的帧缓冲区,从而渲染到与交换链请求不同的图像。
在交换链重新创建之后,所有图像都在 VK_IMAGE_LAYOUT_UNDEFINED 中,导致验证层发现问题。但是,一旦您(错误地)渲染到所有这些图像,它们的布局就不再是未定义的,并且不再报告错误。
当然你的程序会一直显示错误的图像,但如果场景是静态的,这是不可能观察到的。
推荐阅读
- c# - 如何在运行时读取我的 log4net 日志
- python - Python 中用于图像增强的图像增强管道中的错误
- php - PHP SMTP 邮件脚本不起作用
- java - 如何对 ArrayList 进行排序
使用比较器? - gradle - 使用电报 api gradle 同步失败:ndk bundle
- javascript - 在 ReactJS 中使用 Fetch
- css - 引导按钮轮廓
- c# - 将 XAML 元素公开给 ViewModel 以运行方法 Xamarin Forms
- opencv - opencv 3.1 + opencv_contrib cmake 配置错误
- functional-programming - Kotlin 不同类型的 reduce() 函数