在金属中,在下一个顶点着色器执行之前,一个顶点着色器是否完成?

时间:2016-10-03 23:41:45

标签: vertex-shader metal vertex-buffer

假设Metal顶点着色器A更新缓冲区buf。还假设我有一个在B之后编码的第二个顶点着色器A。可以B使用buf中的结果,还是B可能在A完成之前开始执行,这意味着缓冲区的内容尚未就绪?

1 个答案:

答案 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方法。   结束上一个命令编码器后,您可以创建一个新的   任何类型的命令编码器将附加命令编码到   命令缓冲区。