Vulkan子通道依赖同步逻辑及颜色输出阶段疑问
我正在学习Overvoorde的Vulkan教程,在等待获取图像时,需要在颜色输出阶段前等待,且不希望在图像可用前转换其布局,因此采用如下设置:
srcSubpass = VK_SUBPASS_EXTERNAL; dstSubpass = 0; srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT srcAccessMask = 0 dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
该设置可在Vulkan规范的同步章节中查阅。
问题1:子通道依赖的等待范围
这个子通道依赖只会等待操作当前图像的渲染通道完成颜色输出阶段,而非所有先前的渲染通道。
Vulkan的同步机制基于资源依赖追踪,驱动会记录每个资源(此处为当前获取的交换链图像)的使用状态。当你将VK_SUBPASS_EXTERNAL设为源子通道时,依赖的是所有对当前目标资源产生影响的外部操作——也就是上一轮使用该图像的渲染通道的颜色输出阶段。其他操作不同图像的渲染通道与当前资源无关,驱动不会为它们阻塞当前流程。
这完全契合交换链的使用逻辑:每个交换链图像的生命周期相互独立,你只需确保当前要使用的图像已完成上一轮的所有读写操作即可,其他正在运行的、操作其他图像的渲染通道不会干扰当前流程。
问题2:颜色输出阶段的范围与结束时机
颜色输出阶段(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT)不包含画面呈现。
这个阶段特指渲染通道内针对颜色附件执行的读写操作阶段:涵盖片段着色器向颜色附件输出像素、对颜色附件的混合操作等。当渲染通道中所有针对颜色附件的操作全部完成后,该阶段即结束。
而画面呈现(将交换链图像提交至显示设备)属于VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT之后的队列提交环节,更准确地说,是由颜色输出阶段之后的阶段(比如存在布局转换时的VK_PIPELINE_STAGE_TRANSFER_BIT)负责,最终由显示引擎完成画面输出。
内容的提问来源于stack exchange,提问作者Patrik T

