vulkan - 可以在没有信号量或栅栏的情况下同步获取和写入交换链图像吗?
问题描述
通常,使用交换链映像的 a在执行之前VkRenderPass
等待信号量。同样还定义了一个子通道依赖项,以在同一管道阶段的开头转换图像:vkAcquireNextImageKHR
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
VkRenderPass
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 上,即使没有这两种同步方法,渲染也会成功。
解决方案
执行依赖关系在两个范围之间建立依赖关系:源范围和目标范围。源外部子通道依赖项定义如下:
如果
srcSubpass
等于VK_SUBPASS_EXTERNAL
,则第一个同步范围包括在提交顺序中出现的命令早于vkCmdBeginRenderPass
用于开始渲染过程实例的命令。
请注意关键字“在提交顺序之前”。提交顺序是根据提交到队列的命令定义的。
您可能已经注意到,vkAcquireNextImageKHR
不将队列作为参数。它的名字也不以“Cmd”开头。这些是操作没有提交到任何队列的线索;这是一个设备级别的操作。
由于获取图像不是任何队列“提交顺序”的一部分,它不能(除非采用其他同步)成为外部子通道依赖项的“第一同步范围”的一部分。因此,这种依赖对获取操作没有影响。
因此,如果您需要使用已获取的图像的执行依赖,则必须通过信号量或栅栏。
推荐阅读
- java - 在 Java 中使用 Itext 创建多页可点击索引
- html - 为什么由于垂直滑块而自定义 CSS 样式不适用?
- python - python中的硒:NoSuchElementException:消息:没有这样的元素:无法按名称定位元素
- javascript - 如何将javascript变量发送到python脚本文件
- android - 如何在颤动的pdf中制作电子签名
- reactjs - 世博会图像选择器:世博会更新后无法正常工作
- android - android.view.InflateException:二进制 XML 文件行 #55
- java - 使用 Chrome 驱动程序下载文件时是否有任何用于自动弹出窗口的脚本
- react-native - 当我点击 TouchableWithoutFeedback 时如何专注于文本输入?
- python - 通过询问输入是否为列表,将字典附加到字典中的列表