2016-08-09 1 views
2

vkMapMemory状態:`vkMapMemory`をどのように同期させますか?

vkMapMemoryは、デバイスメモリは、ホストがアクセス可能なポインタを返す前に、現在使用中であるかどうかをチェックしません。アプリケーションは、ホストがその範囲の読み取りまたは書き込みを行う前に、この範囲に書き込む以前に発行されたコマンドが完了し、その範囲から読み込んだコマンドが完了したことを保証する必要があります。

悲しいことに、まだ存在していないと思われるthis siteにリンクしています。どのように私はこれを同期するだろうと思っていますか?

基本的に私は約2物事

  • のみ1スレッドが
  • 同時に同じ範囲をアクセスするGPUは、現在の範囲を読み取ろうとされていない

心配する必要があります私がこれを同期させるのが実際に見えるのはスレッドセーフリストだけです。そのバッファに書き込み/読み込みを行うたびに、そのスレッドセーフリストに現在読み書きしようとしているメモリ範囲を追加する必要があります。

つまり、そのバッファにアクセスするときは、そのリストをロックし、アクセスしようとしている範囲を検索する必要があります。

これはどうすればvkMapMemoryと同期するのですか、それとも他の方法がありますか?

答えて

3

gpuがマップされたメモリにアクセスしようとするのは、そのメモリにアクセスするコマンドバッファがサブミットされたときだけです。そのメモリは、関連するvkFenceが通知されるまで使用されます。

完全に一般的な解決方法は、gpuによるすべてのメモリアクセスを追跡し、適切なフェンスで待機し、必要に応じてフラッシュ/無効化を呼び出す開始/終了ペアで各CPUマップメモリ​​アクセスを囲むことです。これは、多くの状態追跡と潜在的にブロッキングコールの過多です。

ただし、永続的なメッシュ/テクスチャデータの場合は、ステージングバッファにメモリに書き込んだ後、ホストに見えないデバイスローカルバッファにコピーするだけで済みます。これはしばしば必要なものではありません。そのため、1枚のフェンスからそのコピーが飛行中であるかどうかを追跡することができます。または、単一のフレーム(オブジェクト変換あたり)でのみ生存する必要のあるデータの場合は、リングバッファを使用できます。 GPUのオクルージョンテストのリードバックや結果の計算には、リングバッファを使用することができます。

パターンが浮かび上がってくれることを願っています。マッピングされたリングバッファをいくつか使用し、それらがgpuによっていつ使用されているかを十分に意識して、データハザードが発生しないようにリングバッファあたりvkFence + offset +サイズの小さな配列を保持する必要があります。

関連する問題