代码之家  ›  专栏  ›  技术社区  ›  lvella

如何同步VKCMDCopyBufferToImage()?

  •  2
  • lvella  · 技术社区  · 6 年前

    我需要渲染一个图像并复制回主机。我发布了 vkCmdCopyImageToBuffer() 从呈现传递结果到 vkCmdEndRenderPass() ,它似乎可以工作,但我担心复制会在渲染完成(或图像转换)之前开始。

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Nicol Bolas    6 年前

    执行renderpass之后的图像布局是由您在构造该renderpass时显式指定的。这是由 VkAttachmentDescription::finalLayout 对于附加的图像。

    至于同步,这也是在renderpass创建时由您指定的。子类可以有外部依赖项,它们依赖于在renderpass之前发生的事情,或者它们导致renderpass之后的事情依赖于它们。

    也就是说,如果您没有指定目标子类所针对的子类依赖项 VK_SUBPASS_EXTERNAL ,然后创建一个隐式依赖项(vulkan隐式执行同步的少数情况之一)。此隐式依赖项将来自任何命令的颜色、深度和输入附件与管道底部同步。但是,因为它没有在其掩码中指定任何目标访问表单,所以这是不有用的,您应该提供显式的外部依赖项。

    另外,使用管道底部作为目标阶段几乎是 从未 有用。