iOS Metal:命令缓冲区执行顺序

4
假设我提交了两个命令缓冲区,修改了同一纹理,这些命令缓冲区由同一个队列生成:
var a: MTLCommandBuffer
var b: MTLCommandBuffer
...
a.commit()
b.commit()

那么,假设我等待第二个完成:

b.waitUntilCompleted()

ba 之前完成是否有可能?根据 commit() 的文档,

命令缓冲区会在与其相同的命令队列上排在它之前的任何命令缓冲区之后执行。

这是否意味着 b 将在 a 执行完成后再执行,还是只是在 a 开始执行后才开始执行?


这并不是对你问题的真正回答,但是你使用两个命令缓冲区有充分的理由吗?你不能将所有工作都编码到同一个命令缓冲区中吗? - Matthijs Hollemans
1个回答

1

commit的文档中可以得知,假设这里的缓冲区在同一个队列中:

命令缓冲区会在与它在同一命令队列上排队的任何命令缓冲区之后执行。

这是合乎逻辑的,因为一个MTLCommandQueue一次只能执行一个缓冲区。所以b将在a执行后开始执行,等待它意味着当它完成时,两者都已经完成。


a 开始在 b 之前并不保证 a 必须在 b 之前结束。因此,这个答案是不完整的。 - Jimmy Chen
@JimmyChen 在这种情况下,你的说法是完全无效的,因为问题涉及到一个已经有良好记录的特定案例。事实上,队列是有序的,并且完全线程安全,可以保证预期执行顺序。值得一读:https://developer.apple.com/library/archive/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Cmd-Submiss/Cmd-Submiss.html#//apple_ref/doc/uid/TP40014221-CH3-SW1。 - Mateusz Grzejek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接