【发布时间】:2021-10-11 13:21:55
【问题描述】:
作为很多“初学者”,我认为使用 TOP_OF_PIPELINE 作为 dst 和 BOTTOM_OF_PIPELINE 作为 src 意味着两者都使用 ALL_COMMANDS。
HereNicol Bolas 写道:“由于管道的顶部/底部对于内存屏障没有意义,也许使用它们应该完全无效。因此仅对执行屏障有用。”
据我了解,由于 TOP 和 BOTTOM 不会对内存进行任何访问,因此在顶部或底部放置屏障无法使内存可见^^。
据我了解 Nicol Bolas 的含义以及我刚才所说的关于内存访问/可见性的内容,当您使用底部或顶部时,您必须将 accessMask 设置为 0。
如果我想展示图片,我可以这样做:
srcStage = COLOR_ATTACHMENT_OUTPUT_BIT
srcAccess = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
oldLayout = ATTACHMENT_OPTIMAL
dstStage = BOTTOM
dstAccess = 0; // Since memory read access will be "issued" by semaphore
newLayout = PRESENT_KHR;
我们在这里使用底部,因为我们不希望内存屏障使当前队列等待规范中的描述:
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT 可用于在下一次访问将在不同队列中或由表示引擎完成时完成内存屏障和布局转换;在这些情况下,同一队列中的后续命令不需要等待,但屏障或转换必须在与批处理信号关联的信号量之前完成。
所以现在,我可以说(我希望...)我了解何时使用每个阶段,但 TOP_OF_PIPE nop...
所以,有我的问题: 究竟什么是执行屏障(因此没有内存屏障)?为什么它们有用? (因为可以说一个操作一个接一个地发生,但最好说我们可以在第二个操作中消费第一个操作产生的数据)。 我应该什么时候在管道底部或顶部设置屏障?
谢谢!
【问题讨论】:
标签: vulkan