VkAttachmentReference::layout 的目的是什么?

nik*_*ack 4 graphics rendering vulkan

我试图理解为什么我们需要VkAttachmentReference::layout?文档说:

layoutVkImageLayout指定附件在子通道期间使用的布局的值。

换句话说,它告诉在子通道开始之前附件将转换到哪个布局。

但是这些信息已经可以通过VkAttachmentDescription::initialLayout. 这是文档中的引用:

initialLayout 是渲染过程实例开始时附件图像子资源将处于的布局。

是不是VkAttachmentReference::layout冗余,因为它完全重复VkAttachmentDescription::initialLayout

Ekz*_*uzy 6

不,通过initialLayout您指定图像在渲染过程之前的布局。它可以是任何东西,例如finalLayout来自先前渲染通道的。或者undefined新创建的图像的布局。或者present_src从交换链获取的图像布局。

然后图像会自动从 过渡initialLayout到为给定子通道指定的布局。如果您有更多子通道,那么在每个子通道中您可以以不同的方式使用图像,而不必担心手动转换。

驱动程序需要这两个布局参数才能知道它应该执行什么转换。Vulkan 是一个显式 API,驱动程序不跟踪任何信息(或跟踪尽可能少)。没有initialLayout布局自动过渡是不可能的。

  • @nikitablack:不,`initialLayout` 表示图像在渲染过程开始之前*之前的布局。这允许渲染通道系统将图像从该布局过渡到它在各种子通道中使用的布局(布局过渡需要源和目标。第一个过渡的源是“initialLayout”)。这使渲染通道实现可以自由地以他们想要的任何顺序(在依赖性限制内)执行子通道。并且`finalLayout` 表示图像将在渲染过程中*之后* 转换成什么样的布局。 (4认同)
  • 我编辑了答案。这定义了驱动程序需要执行的转换。没有它,驱动程序将不知道应该执行什么转换,因为他们不知道在给定时刻有什么布局图像。不同布局的转换可能会以不同的方式执行,因此这些知识对驾驶员来说可能至关重要。 (2认同)