Использование нескольких конвейеров рендеринга в одном MTLRenderCommandEncoder: Как синхронизировать MTLBuffer? - PullRequest
5 голосов
/ 04 февраля 2020

Центральная проблема
У меня есть два конвейера рендеринга в одном кодере команд рендеринга. Первый конвейер записывает данные в буфер, который используется во втором конвейере. Это не похоже на работу, и я ожидаю, что это проблема синхронизации. Когда я использую один отдельный кодировщик команд рендеринга для каждого конвейера рендеринга, я получаю желаемый результат. Можно ли решить эту проблему с помощью одного кодировщика команд рендеринга или мне нужно два отдельных кодировщика для синхронизации буфера?

Вот более конкретный c case:
Первый конвейер является не растеризованным конвейером, в котором работает только вершинный шейдер для вывода в 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()

Как могу ли я убедиться, что indirectArgumentsBuffer был записан первым конвейером при вызове drawPrimitives для второго конвейера, который использует и нуждается в содержимом indirectArgumentsBuffer?

1 Ответ

3 голосов
/ 15 февраля 2020

Я считаю, что вам нужно использовать отдельные кодировщики. В этой (несколько устаревшей) документации о записи функций только операции atomi c синхронизируются для буферов, совместно используемых вызовами отрисовки.

...