假设我在金属中调度两个计算着色器A和B.在A完成之后,我不希望B跑。目前,我正在使用自己的命令缓冲区对每个着色器进行编码并提交,如下所示:
commandBufferA.commit()
commandBufferA.waitUntilCompleted()
commandBufferB.commit()
这是正确的技术吗?
答案 0 :(得分:3)
如果您需要在CPU上使用内核的结果,则在命令缓冲区上调用waitUntilCompleted()
很有用,但如果您的意图只是使用计算命令的结果,那么这是不必要且低效的(调度)在随后的计算命令中。如果计算命令之间存在数据依赖性,则前者写入的结果保证对后者可见,即使在单个命令缓冲区内也是如此。所以,你可以用它来构造它:
let commandBuffer = commandQueue.makeCommandBuffer()
let commandEncoder = commandBuffer.makeComputeCommandEncoder()
commandEncoder.setComputePipelineState(pipelineStateA)
commandEncoder.setTexture(inputTexture, at: 0)
commandEncoder.setTexture(intermediateTexture, at: 1)
commandEncoder.dispatchThreadgroups(threadgroupCount,
threadsPerThreadgroup: threadgroupSize)
commandEncoder.setComputePipelineState(pipelineStateB)
commandEncoder.setTexture(intermediateTexture, at: 0)
commandEncoder.setTexture(outputTexture, at: 1)
commandEncoder.dispatchThreadgroups(threadgroupCount,
threadsPerThreadgroup: threadgroupSize)
commandEncoder.endEncoding()
commandBuffer.commit()
commandBuffer.waitUntilCompleted() // optional; only if you need to read the result on the CPU