在单个MTLRenderCommandEncoder中使用多个渲染管道:如何同步MTLBuffer?

问题描述 投票:1回答:1

主要问题我在一个渲染命令编码器中有两个渲染管道。第一管线写入第二管线中使用的缓冲器。这似乎不起作用,我希望它是一个同步问题。当我为每个渲染管道使用一个单独的渲染命令编码器时,我将获得所需的结果。可以使用一个单一的渲染命令编码器解决此问题,还是需要两个单独的编码器来同步缓冲区?

这里是更具体的情况:第一个管道是非光栅化管道,仅运行顶点着色器以输出到存储MTLBufferMTLDrawPrimitivesIndirectArguments,用于第二个管道的drawPrimitives调用,如下所示:

// renderCommandEncoder is MTLRenderCommandEncoder
// firstPipelineState and secondPipelineState are two different MTLRenderPipelineState
// indirectArgumentsBuffer if 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()

[当使用并需要indirectArgumentsBuffer的内容的第二个管道发出对drawPrimitives的调用时,如何确保第一个管道已写入indirectArgumentsBuffer

objective-c swift metal
1个回答
0
投票

我相信您需要使用单独的编码器。在此(有些过时)documentation about function writes中,仅原子操作针对绘制调用之间共享的缓冲区进行了同步。

© www.soinside.com 2019 - 2024. All rights reserved.