VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT VkAccessFlags 设置为 0?

问题描述

在 Vulkan 规范中,它定义了:

VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 等价于 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT VkAccessFlags 在第二个同步范围中指定时设置为 0,但指定 no 第一个范围的阶段。

类似:

VK_PIPELINE_STAGE_BottOM_OF_PIPE_BIT 等价于 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT VkAccessFlags 在第一个同步范围中指定时设置为 0,但未指定任何阶段 在第二个范围内。

我不清楚在这种情况下“VkAccessFlags 设置为 0”是什么意思?

从技术上讲,VkAccessFlags一个类型,而不是一个变量,所以它不能被设置为任何东西。

(它似乎正在调整 TOP/BottOM_OF_PIPE 的某些特殊属性VK_PIPELINE_STAGE_ALL_COMMANDS_BIT 的定义关于 VkAccessFlags,但我不太清楚那个特殊属性是什么或在哪里它被指定。)

有人知道它在说什么吗?

(或者,换句话说:如果我们从规范中删除“with VkAccessFlags set to 0”这两个语句,会破坏什么?)

解决方法

对于内存依赖而言,阶段标志的解释是不同的,这是一种迂回的说法。

对于 src 中的执行依赖项,它需要您提供的阶段位,并自动包含逻辑上较早的阶段。与 dst 类似,逻辑上较晚的阶段会自动包含在内。

但这仅适用于执行依赖项。对于内存依赖,只有您提供的阶段标志计数(不会自动添加)。

例如,假设您在 VK_PIPELINE_STAGE_ALL_COMMANDS_BIT 中有 VK_ACCESS_MEMORY_WRITE_BIT + src。这意味着所有先前命令的所有内存写入都将可用。但是,如果您在 VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT 中有 VK_ACCESS_MEMORY_WRITE_BIT + src,则意味着仅来自 BOTTOM_OF_PIPE 阶段的所有内存写入可用,因此没有内存写入可用(因为该特定阶段不提供任何)。

无论哪种方式,IMO,为了代码清晰起见,最好始终明确说明所有管道阶段。