我可以在命令缓冲区中多次记录vkCmdPipelineBarrier吗?

时间:2019-05-10 14:15:52

标签: c++ vulkan

我有一个vkImage的{​​{1}}。我的目标很简单,只需在此图像中渲染一个三角形即可。因此,我创建了一个命令缓冲区并按以下顺序记录。

  1. vkSwapchain
  2. vkBeginCommandBuffer(从vkCmdPipelineBarrierLAYOUT_UNDEFINED
  3. COLOR_ATTACHMENT_OPTIMAL
  4. 画我的三角形。
  5. vkCmdBeginRenderPass
  6. vkCmdEndRenderPass(从vkCmdPipelineBarrierCOLOR_ATTACHMENT_OPTIMAL
  7. 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

尽管有验证错误消息,但我还是得到了一个三角形。这是验证层的错误吗?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

在命令缓冲区中可以记录多少个管道屏障没有限制(限制内存限制)

但是,不需要特定的障碍,因为可以通过renderpass隐式地完成相同的障碍。验证会抱怨图像的布局已经存在的事实意味着您已经以这种方式进行了设置。创建renderpass时,请检查附件的finalLayout。