假设金属顶点着色器A更新缓冲区buf。另外,假设我有第二个顶点着色器B,它是在A之后编码的。B可以在buf中使用结果吗?或者B是否有可能在A完成之前开始执行,这意味着缓冲区的内容还没有准备好?
发布于 2016-10-18 22:06:15
第二个顶点着色器B可以在顶点着色器A之前自由执行,如果它们编码在相同的MTLRenderCommandEncoder中。如果您想用B读取B的输出,那么它们必须由单独的MTLRenderCommandEncoder编码。
但是,注意,对于一个中的计算调度,不是 true,这也是相同的。医生的相关部分指出:
执行计算命令 要对执行计算函数的命令进行编码,请调用dispatchThreadgroups: MTLComputeCommandEncoder的线程:threadsPerThreadgroup:方法,并指定线程组的维度和线程组的数量。您可以查询threadExecutionWidth和maxTotalThreadsPerThreadgroup属性MTLComputePipelineState,以优化该设备上计算函数的执行。 为了最有效地执行计算函数,将threadsPerThreadgroup参数指定的线程总数设置为dispatchThreadgroups: threadExecutionWidth的一个倍数。线程组中的线程总数是threadsPerThreadgroup的组件threadsPerThreadgroup.width * threadsPerThreadgroup.height * threadsPerThreadgroup.depth的产物。maxTotalThreadsPerThreadgroup属性指定单个线程组中可在设备上执行此计算函数的最大线程数。 计算命令按照它们被编码到命令缓冲区的顺序执行。当与命令执行相关的所有线程组都被写入内存时,计算命令就会完成执行。由于这种排序,计算命令的结果可以用于在命令缓冲区中编码的任何命令。 若要结束计算命令编码器的编码命令,请调用MTLComputeCommandEncoder的MTLComputeCommandEncoder方法。在结束之前的命令编码器之后,您可以创建一个任意类型的新命令编码器,以便将其他命令编码到命令缓冲区中。
https://stackoverflow.com/questions/39842086
复制相似问题