>假设我有一个带有单色附件(对应于交换链图像)的渲染通道,其VkAttachmentDescription
具有initialLayout = finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
,并且(出于教育目的)我想在使用vkCmdPipelineBarrier
调用vkQueueSubimt
之前将布局转换为VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
。
我到底需要怎么做?我想,在调用vkCmdPipelineBarrier
之前,我需要调用vkCmdEndRenderPass
,因为渲染通道会自动过渡到finalLayout
,对吧?
现在,我究竟需要如何设置srcStageMask
、dstStageMask
、srcAccessMask
和dstAccessMask
以调用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
,您可以在其中指定图像及其布局。