【发布时间】:2020-02-04 18:29:56
【问题描述】:
核心问题
我在一个渲染命令编码器中有两个渲染管道。第一个管道写入第二个管道中使用的缓冲区。这似乎不起作用,我希望它是一个同步问题。当我为每个渲染管道使用一个单独的渲染命令编码器时,我得到了想要的结果。这可以通过一个渲染命令编码器来解决,还是我需要两个单独的编码器来同步缓冲区?
以下是更具体的情况:
第一个管道是一个非光栅化管道,仅运行一个顶点着色器以输出到 MTLBuffer,存储 MTLDrawPrimitivesIndirectArguments 以用于第二个管道的 drawPrimitives 调用,如下所示:
// renderCommandEncoder is MTLRenderCommandEncoder
// firstPipelineState and secondPipelineState are two different MTLRenderPipelineState
// indirectArgumentsBuffer is a MTLBuffer containing MTLDrawPrimitivesIndirectArguments
// numberOfVertices is number of vertices suited for first pipeline
// first pipeline
renderCommandEncoder.setRenderPipelineState(firstPipelineState)
renderCommandEncoder.setVertexBuffer(indirectArgumentsBuffer, offset: 0, index: 0)
renderCommandEncoder.drawPrimitives(type: .point, vertexStart: 0, vertexCount: numberOfVertices)
// second pipeline
renderCommandEncoder.setRenderPipelineState(secondPipelineState)
renderCommandEncoder.setVertexBuffer(secondPipelineBuffer, offset: 0, index: 0)
renderCommandEncoder.drawPrimitives(type: .point, indirectBuffer: indirectArgumentsBuffer, indirectBufferOffset: 0)
renderCommandEncoder.endEncoding()
当第二个管道调用drawPrimitives 时,如何确保indirectArgumentsBuffer 已被第一个管道写入,第二个管道使用并需要indirectArgumentsBuffer 的内容?
【问题讨论】:
-
如果您将工作拆分到两个命令缓冲区,您的程序是否按预期运行?如果不是,问题不是同步,而是算法本身的问题。
-
@warrenm:如果我将工作拆分到两个不同的渲染命令编码器(第一个 renderPipeline 在第一个编码器中工作,第二个 renderPipeline 在第二个编码器中工作),它确实可以按预期工作。
标签: objective-c swift metal