我有一个vkImage
的{{1}}。我的目标很简单,只需在此图像中渲染一个三角形即可。因此,我创建了一个命令缓冲区并按以下顺序记录。
vkSwapchain
vkBeginCommandBuffer
(从vkCmdPipelineBarrier
到LAYOUT_UNDEFINED
)COLOR_ATTACHMENT_OPTIMAL
vkCmdBeginRenderPass
vkCmdEndRenderPass
(从vkCmdPipelineBarrier
到COLOR_ATTACHMENT_OPTIMAL
)PRESENT_SRC
最后我打电话给vkEndCommandBuffer
在屏幕上得到一个三角形。但是当执行 second vkQueueSubmit
时,验证层会显示:
VUID-VkImageMemoryBarrier-oldLayout-01197:对于图像0x4,当先前的已知布局为
vkCmdPipelineBarrier
时,您不能从VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
转换Aspect = 1 level = 0 layer = 0的布局。
和
UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout:提交的命令缓冲区期望图像0x4(子资源:aspectMask 0x1阵列层0,mip级别0)位于布局
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
中,而当前布局为{{1} }。
但是我确定当时的图像布局将为VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
。我不知道为什么验证层向我抱怨。
我已经搜索了API文档,但找不到VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
的任何限制。他们说,此命令执行队列所有权转移(如果需要)和布局转换。
下面是我的代码。
COLOR_ATTACHMENT_OPTIMAL
尽管有验证错误消息,但我还是得到了一个三角形。这是验证层的错误吗?
任何帮助将不胜感激。
答案 0 :(得分:2)
在命令缓冲区中可以记录多少个管道屏障没有限制(限制内存限制)
但是,不需要特定的障碍,因为可以通过renderpass隐式地完成相同的障碍。验证会抱怨图像的布局已经存在的事实意味着您已经以这种方式进行了设置。创建renderpass时,请检查附件的finalLayout。