屏障和图像过渡

Barrier and image transition

我想知道为什么我们通常(来自 Vulkan 教程和 Sascha Willems 示例)管道顶部的屏障。

如果我像生产者和消费者一样推理(例如创建 mipmap),我在 src 和 dst 阶段都有 "flag" "TRANSFER_BIT"。 所以,如果我对 src 和 dst 使用相同的阶段,障碍应该立即发生,如果我使用 TOP_OF_PIPE flag?

也是一样的情况

我说得对吗?

我不确定我是否理解这个问题,但希望我能解释障碍。

src=TOP_OF_PIPEdst=BOTTOM_OF_PIPE 构成非阻塞屏障(实际上只是内存依赖的一半,没有执行依赖)。这就是你所说的 "immediatelly happening" 障碍吗?

dst=TOP_OF_PIPEsrc=BOTTOM_OF_PIPE 应该是全阻塞屏障(至少我经常在示例和教程中看到它)。我不太清楚规范中的这一点(特别是如果内存依赖性也需要存在的话)并且 ALL_COMMANDS (或 |ing 特定阶段)似乎是更好的替代品。

(顺便说一句,我已经用 API 设计写了关于 my peeve 的文章。)

一般来说,对于执行依赖性,障碍所做的是:它们确保在障碍完成之前记录的所有命令 srcStage 在障碍开始后记录的任何命令的 dstStage 之前.
(以上特殊情况也应该和那个描述一致。)

因此,话虽这么说,TOP_OF_PIPE 似乎并不是 TRANSFER 的合适替代品。它要么根本无法执行其预期功能,要么效率低下(根据上述描述)。

srcStage==dstStage 没有特殊意义。在这种情况下使用 TRANSFER 意味着 TRANSFER 之前记录的命令阶段在屏障之后记录的 TRANSFER 阶段命令之前完成。