在调用 vkQueueSubmit 之前,将颜色附件从其 finalLayout 过渡到另一个布局



>假设我有一个带有单色附件(对应于交换链图像)的渲染通道,其VkAttachmentDescription具有initialLayout = finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,并且(出于教育目的)我想在使用vkCmdPipelineBarrier调用vkQueueSubimt之前将布局转换为VK_IMAGE_LAYOUT_PRESENT_SRC_KHR

我到底需要怎么做?我想,在调用vkCmdPipelineBarrier之前,我需要调用vkCmdEndRenderPass,因为渲染通道会自动过渡到finalLayout,对吧?

现在,我究竟需要如何设置srcStageMaskdstStageMasksrcAccessMaskdstAccessMask以调用vkCmdEndRenderPass

这对我来说仍然很难弄清楚(有没有一个很好的参考资料可以为"常见"过渡提供解释?从 API 的文档来看,正确的值应该是

srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;

但是,在调用vkQueueSubmit时收到以下验证错误:

提交的命令缓冲区需要 VkImage 0xd76249000000000c[] (子资源:aspectMask 0x1阵列层 0,mip 级别 0)要位于 布局VK_IMAGE_LAYOUT_PRESENT_SRC_KHR - 相反,当前布局是 VK_IMAGE_LAYOUT_UNDEFINED

出了什么问题?

第 33 页及更远处的布局过渡。

在调用vkQueueSubimt之前立即使用vkCmdPipelineBarrier

vkCmd*函数不会立即执行操作。它们将命令记录缓冲区。然后,您将缓冲区推送到 GPU 队列vkQueueSubmit,以便它在有时间时在其中完成工作。

此外,您还必须使用VkImageMemoryBarrier,您可以在其中指定图像及其布局。

相关内容

  • 没有找到相关文章

最新更新