首页 > 解决方案 > 可以在没有信号量或栅栏的情况下同步获取和写入交换链图像吗?

问题描述

通常,使用交换链映像的 a在执行之前VkRenderPass等待信号量。同样还定义了一个子通道依赖项,以在同一管道阶段的开头转换图像:vkAcquireNextImageKHRVK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BITVkRenderPass

    VkSubpassDependency dependency = {
    .srcSubpass = VK_SUBPASS_EXTERNAL,
    .dstSubpass = 0,
    // .srcStageMask needs to be a part of pWaitDstStageMask in the WSI semaphore.
    .srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
    .dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
    .srcAccessMask = 0,
    .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
    .dependencyFlags = 0};

//source: https://github.com/KhronosGroup/Vulkan-Docs/wiki/Synchronization-Examples#combined-graphicspresent-queue

根据 Vulkan 标准:

7:子通道依赖关系描述子通道之间的执行和内存依赖关系。

那么这个子通道依赖是否单独强制VkRenderPass颜色输出发生在表示引擎之后VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT?信号量来自等待什么vkAcquireNextImageKHR,而依赖项没有?

我无法有效地测试信号量的缺失。在我的 Mesa Linux 上,即使没有这两种同步方法,渲染也会成功。

标签: vulkan

解决方案


执行依赖关系在两个范围之间建立依赖关系:源范围和目标范围。源外部子通道依赖项定义如下:

如果srcSubpass等于VK_SUBPASS_EXTERNAL,则第一个同步范围包括在提交顺序中出现的命令早于vkCmdBeginRenderPass用于开始渲染过程实例的命令。

请注意关键字“在提交顺序之前”。提交顺序是根据提交到队列的命令定义的。

您可能已经注意到,vkAcquireNextImageKHR不将队列作为参数。它的名字也不以“Cmd”开头。这些是操作没有提交到任何队列的线索;这是一个设备级别的操作。

由于获取图像不是任何队列“提交顺序”的一部分,它不能(除非采用其他同步)成为外部子通道依赖项的“第一同步范围”的一部分。因此,这种依赖对获取操作没有影响。

因此,如果您需要使用已获取的图像的执行依赖,则必须通过信号量或栅栏。


推荐阅读