如何同步 vkCmdCopyBufferToImage()?

How to synchronize vkCmdCopyBufferToImage()?

我需要渲染图像并将其复制回主机。我在 vkCmdEndRenderPass() 之后立即将 vkCmdCopyImageToBuffer() 从渲染传递结果发送到主机可读缓冲区,它似乎有效,但我担心复制在渲染完成之前开始(或图像转换) ).

我是否需要执行某种同步,或者隐式保证图像将转换为所需的 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,这发生在渲染过程结束时,复制开始之前?在规范中,这个序列是在哪里定义的?

执行渲染通道后的图像布局由您在构建渲染通道时明确指定。这是由 VkAttachmentDescription::finalLayout 为附加图像指定的。

至于同步,这也是您在创建渲染通道时指定的。子通道可以具有外部依赖性,它们依赖于渲染通道之前发生的事情,或者它们导致渲染通道之后的事情依赖于它们。

也就是说,如果您没有指定目标子通道为 VK_SUBPASS_EXTERNAL 的子通道依赖性,则会创建隐式依赖性(Vulkan 为数不多的隐式同步之一)。这种隐含的依赖性将来自任何命令的颜色、深度和输入附件与管道底部同步。但是,因为它没有在其掩码中指定任何目标访问形式,所以这没有用,您应该提供一个显式的外部依赖。

此外,使用管道底部作为目标阶段几乎从来没有有用。