为何`pWaitDstStageMask`与`srcStageMask`需设为`COLOR_ATTACHMENT_OUTPUT`
Vulkan获取-渲染-呈现同步中管线阶段选择的困惑
我通过krOoze的解答理解了Vulkan中获取-渲染-呈现的同步机制,但仍有一处困惑:
为什么几乎所有示例(包括Vulkan规范推荐)都将pWaitDstStageMask和srcStageMask设为COLOR_ATTACHMENT_OUTPUT?这个选择看起来有些随意。
我的分析逻辑
- 若将两者都设为
VERTEX_SHADER,逻辑上差异不大:依赖链能保证布局转换和加载操作在信号量触发后执行,而绘制操作的COLOR_ATTACHMENT_OUTPUT阶段又会晚于转换与加载,执行顺序依然能得到保证。 - 更进一步,
pWaitDstStageMask可以是任意管线阶段,srcStageMask只要是晚于它的阶段(比如pWaitDstStageMask = VERTEX_SHADER、srcStageMask = EARLY_FRAGMENTS_TESTS),同步效果也不会有差异——因为执行依赖的第一个同步范围包含所有逻辑上更早的管线阶段。
前一帧同步流程验证
- 帧1对图像索引i执行
vkCmdDraw(无需等待) - 信号量触发(不早于第0帧的
COLOR_ATTACHMENT_OUTPUT阶段) - 呈现操作(不早于信号量触发)
- 信号量等待(不早于呈现操作)
- 布局转换与加载操作(不早于信号量等待,无论使用哪个管线阶段,只要晚于
pWaitDstStageMask即可) - 帧n对图像索引i执行
vkCmdDraw(COLOR_ATTACHMENT_OUTPUT阶段不早于转换与加载操作)
从这个流程来看,所有操作均按预期顺序执行,不存在同步问题。
那为什么大家都统一使用COLOR_ATTACHMENT_OUTPUT?只是示例的惯用写法吗?如果是这样,使用TOP_OF_PIPE这类“中性”阶段不是更合适?
内容的提问来源于Stack Exchange,提问作者Jim Morrison
相关产品推荐
相关产品推荐

