假设Metal顶点着色器A
更新缓冲区buf
。还假设我有一个在B
之后编码的第二个顶点着色器A
。可以B
使用buf
中的结果,还是B
可能在A
完成之前开始执行,这意味着缓冲区的内容尚未就绪?
答案 0 :(得分:0)
如果第二个顶点着色器B
在相同的A
中编码,则可以在顶点着色器MTLRenderCommandEncoder
之前自由执行。如果您想在A
中阅读B
的输出,那么它们必须由单独的MTLRenderCommandEncoder
进行编码。
但请注意,MTLComputeCommandEncoder
内的计算调度的不为真。 relevant part of the doc州:
执行计算命令
编码执行计算的命令 函数,调用dispatchThreadgroups:threadsPerThreadgroup:方法 MTLComputeCommandEncoder并指定线程组维度和 线程组的数量。您可以查询threadExecutionWidth和 MTLComputePipelineState的maxTotalThreadsPerThreadgroup属性 优化此设备上计算功能的执行。
为了最有效地执行计算功能,请设置总数 由threadsPerThreadgroup参数指定的线程数 dispatchThreadgroups:threadsPerThreadgroup:方法为多个 threadExecutionWidth。线程组中的线程总数是 threadsPerThreadgroup组件的产品: threadsPerThreadgroup.width * threadsPerThreadgroup.height * threadsPerThreadgroup.depth。 maxTotalThreadsPerThreadgroup property指定可以在a中的最大线程数 单线程组在设备上执行此计算功能。
计算命令按编码顺序执行 进入命令缓冲区。计算命令完成后执行 与命令关联的线程组完成执行和所有 结果写入内存。因为这个排序,结果 计算命令的命令可用于其后编码的任何命令 命令缓冲区。
要结束计算命令编码器的编码命令,请调用MTLComputeCommandEncoder的endEncoding方法。 结束上一个命令编码器后,您可以创建一个新的 任何类型的命令编码器将附加命令编码到 命令缓冲区。