2017-02-16 8 views
0

に均一なバッファの更新を同期させます。このためのメカニズムがあるバルカンでのは、私は、次のコード(簡体字)を持っていると仮定しましょうメタル

id<MTLBuffer> uniforms = ...; 
MTLRenderCommandEncoder encoder = ...; 

[uniforms contents] = some_data; 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingWithShader("myshader"); 

[uniforms contents] = some_other_data; // WRONG! overwrites previous draw call's uniforms 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingElseWithShader("myshader"); 

vkCmdPipelineBarrier()と呼ばれます。しかし、私は金属の中で何か類似したものを見つけることができませんでした(MTLFenceが候補ですが、他の種類のものに使用されているようです)。

私の質問は、どのようにこのバッファの更新を同期するのですか?

(PS私の現在の考えは、バッファへの変更を追跡し、別の場所に「第​​二の均一なデータを」コピーすることであるが、堅牢な方法で実装するのではなく、複雑になり.:)

答えて

1

あなたはエンコーディングを終了するまででなく、コマンドバッファ自体が完了するまで、コマンドバッファにエンコードされたすべての描画呼び出しの統一データにアクセスできるようにする必要があります。

これは、バッファの内容ポインタにオフセットを追加し、バッファの連続する部分に連続した描画呼び出しの一様なデータを書き込むことを意味します。完了するまで、このフレームに対応するバッファの領域に書き込まないでください。

エンコーディングが完了する前に次のフレームを描画するコールバックが発生する可能性があるので、バッファのプールを使用してそれらの間を循環し、カウントセマフォによるアクセスを制御する必要があります。この推奨事項はMetal Best Practices Guideに詳しく記載されています。

+0

これは私が恐れていたことです...とにかくありがとう。 (ps:質問を数日間開いたままにしておきます) – Asylum