我想知道为什么我们通常(来自Vulkan教程和Sascha Willems示例)管道顶部的障碍。
如果我推理像生产者和消费者(例如创建mipmap),我在src和dst阶段都有"标记" " TRANSFER_BIT&#34 ;. 所以,如果我对src和dst使用相同的阶段,屏障应该立即发生,如果我使用TOP_OF_PIPE标志就是这种情况?
我是对的吗?
答案 0 :(得分:2)
我不确定我是否理解这个问题,但希望我能用它来解释障碍。
src=TOP_OF_PIPE
或dst=BOTTOM_OF_PIPE
构成一个非阻塞屏障(有效只是内存依赖性的一半而没有执行依赖性)。这是你的意思"立即发生"屏障?
dst=TOP_OF_PIPE
或src=BOTTOM_OF_PIPE
应该是全阻挡障碍(至少我经常在示例和教程中看到它)。我从规范中不太清楚这一点(特别是如果内存依赖性也需要存在)并且ALL_COMMANDS
(或|
具体阶段)似乎是更好的替代品。
(顺便说一下,我已经用{API}设计了my peeve。
一般来说,执行依赖关系的障碍是:它们确保在障碍完成之前记录的所有命令srcStage
在障碍开始后记录的任何命令dstStage
之前完成。<登记/>
(上述特殊情况也应与该描述一致。)
所以,正如所说,TOP_OF_PIPE
似乎不适合TRANSFER
。它根本不会执行其预期的功能或效率低下(基于上面的描述)。
srcStage==dstStage
没有特殊意义。在这种情况下使用TRANSFER
意味着先前记录的命令的TRANSFER
阶段在屏障后记录的TRANSFER
阶段命令之前完成。