问题描述
在 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,为了代码清晰起见,最好始终明确说明所有管道阶段。