渲染通道创建API
VkSubpassDependency 结构定义如下:// Provided by VK_VERSION_1_0
typedef struct VkSubpassDependency {
uint32_t srcSubpass;
uint32_t dstSubpass;
VkPipelineStageFlags srcStageMask;
VkPipelineStageFlags dstStageMask;
VkAccessFlags srcAccessMask;
VkAccessFlags dstAccessMask;
VkDependencyFlags dependencyFlags;
} VkSubpassDependency;
- srcSubpass 是依赖关系中第一个子通道的子通道索引,或 VK_SUBPASS_EXTERNAL。
- dstSubpass 是依赖关系中第二个子通道的子通道索引,或 VK_SUBPASS_EXTERNAL。
- srcStageMask 是 VkPipelineStageFlagBits 的位掩码,指定源阶段掩码。
- dstStageMask 是 VkPipelineStageFlagBits 的位掩码,指定目标阶段掩码。
- srcAccessMask 是 VkAccessFlagBits 的位掩码,指定源访问掩码。
- dstAccessMask 是 VkAccessFlagBits 的位掩码,指定目标访问掩码。
- dependencyFlags 是 VkDependencyFlagBits 的位掩码。
如果 srcSubpass 等于 dstSubpass,那么 VkSubpassDependency 并不直接定义依赖关系。相反,它使管道屏障可以在已识别的子通道内的渲染通道实例中使用,其中一个管道屏障的作用域必须是一个子通道依赖关系所描述的作用域的子集。 以这种方式指定的子通道依赖如果在 srcStageMask 中包含帧缓冲空间阶段,则必须只在 dstStageMask 中包含帧缓冲空间阶段,并且必须包含 VK_DEPENDENCY_BY_REGION_BIT。如果以这种方式为视图掩码中包含多个视图的子通道指定子通道依赖关系,则其 dependencyFlags 必须包括 VK_DEPENDENCY_VIEW_LOCAL_BIT。
如果 srcSubpass 和 dstSubpass 不相等,当包含子通道依赖关系的渲染通道实例提交到队列时,它将定义由 srcSubpass 和 dstSubpass 标识的子通道之间的依赖关系。
如果 srcSubpass 等于 VK_SUBPASS_EXTERNAL,则第一同步范围包括在提交顺序中比 vkCmdBeginRenderPass 更早出现的命令。否则,第一组命令包括作为由 srcSubpass 标识的子通道实例的一部分提交的所有命令,以及在 srcSubpass 中使用的附件的任何加载、存储或多样本解析操作。无论是哪种情况,第一同步范围都仅限于对由 srcStageMask 指定的源阶段掩码决定的流水线阶段进行的操作。
如果 dstSubpass 等于 VK_SUBPASS_EXTERNAL,则第二同步范围包括在提交顺序中比 vkCmdEndRenderPass 出现得更晚的命令。否则,第二组命令包括作为由 dstSubpass 标识的子通道实例的一部分提交的所有命令,以及在 dstSubpass 中使用的附件的任何加载、存储和多样本解析操作。无论是哪种情况,第二同步范围都仅限于对由 dstStageMask 指定的目标阶段掩码决定的流水线阶段进行操作。
第一访问域仅限于由 srcStageMask 指定的源阶段掩码决定的流水线阶段中的访问。它也仅限于由 srcAccessMask 指定的源访问屏蔽中的访问类型。
第二访问域仅限于由 dstStageMask 指定的目标阶段屏蔽决定的流水线阶段中的访问。它也仅限于 dstAccessMask 指定的目标访问屏蔽中的访问类型。
子通道依赖关系定义的可用性和可见性操作会影响渲染通道内图像布局转换的执行。
[!note] 对于非附着(non-attachment)资源,子通道依赖性所表示的内存依赖性与作为 vkCmdPipelineBarrier(具有匹配的 srcStageMask 和 dstStageMask 参数)的一部分提交的 VkMemoryBarrier(具有匹配的 srcAccessMask 和 dstAccessMask 参数)的内存依赖性几乎相同。唯一不同的是,它的作用域仅限于已识别的子通道,而不是可能影响前后的所有内容。
不过,对于附件而言,子通道依赖关系的工作原理更类似于 VkImageMemoryBarrier,其定义与上述 VkMemoryBarrier 相似,队列族索引设置为 VK_QUEUE_FAMILY_IIGNORED,布局如下:
- 与 oldLayout 相对应的是根据 srcSubpass 的子通道描述的附件布局。
- 与 newLayout 相对应的是根据 dstSubpass 的子通道描述确定的附件布局。