2017-01-15 48 views
0

私は現在DirectX12用の独自のグラフィックスフレームワークを作成しています(私はすでにパーソナルゲームエンジン向けにいくつかのDirectX 11フレームワークを作成しています)、私は現在リソースバインディングのためにtrying to copy the methods used in the recent Hitman gameです。DirectX 12ディスクリプタヒープを更新する

SRV/CBV/UAVヒープのオブジェクトごとのリソースバインディングを処理する最善の方法については混乱しています。私はいくつかのGDCプレゼンテーションを見てきました。

一度に1つのSRV/CBV/UAVヒープのみをバインドすることができ、コマンドリストの途中で現在バインドされているヒープを切り替えることは、フラッシュを強制することによって一部のハードウェアでパフォーマンスが低下することがあります。このため、新しいディスクリプタでヒープの更新を処理する最善の方法は何ですか?私には、各コマンドリストは次のようになります:

  1. SRV/CBV/UAVヒープ自体を保持します。
  2. オブジェクトのサブセット内のオブジェクトごとに、個別のアップロードヒープに配置されたオブジェクトごとのデータを指す記述子をヒープ上に作成します。
  3. この後、別のコマンドリストは、この埋め込まれた記述子ヒープを取り込み、バインドします。次に、現在の記述子ヒープを移動するために、描画呼び出しをSetGraphicsRootDescriptorTableと混ぜて発行します。

これは言われている、いくつかの供給源オンライン(including another SO post)はCPU可視ヒープを使用して、そこに一つの大きなSRV/CBV/UAVヒープコピーを使用して示唆しています。私は彼らが非同期CopyDescriptorsを使用しようとしていないと仮定していますが、むしろCopyBufferRegionです。私はCopyBufferRegionを使用してオブジェクトごとのデータを更新しようとしましたが、私にはこれは多くの遷移がD3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFERD3D12_RESOURCE_STATE_COPY_DESTの間で不足しているようです。私は何かを誤解していますか?どんな透明性も認められるでしょう。

+1

[MiniEngine](https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/MiniEngine)と[DirectX 12用DirectXツールキット](https:///github.com/Microsoft/DirectXTK12)を参照してください。 –

答えて

1

CopyDescriptorsは非同期ではなく、CPU上で即座に実行されるCPU操作です。揮発性記述子のコマンドリスト操作(コマンドリスト操作が記録された後)が実行される前、または静的記述子(ルート署名1.1)の使用準備が必要な場合は、いつでも実行できます。

一般的なアプローチは、大きなディスクリプタヒープを持ち、静的ディスクリプタの部分を保持し、残りをリングバッファとして使用し、必要に応じてディスクリプタテーブルオフセットを割り当てて、描画/計算操作に必要なディスクリプタをコピーして使用します。

CopyBufferRegionここでは何もしません。マッピングバッファも即時の操作であることを覚えておいてください。オブジェクトバッファごとに大きなバッファリングをリングバッファに入れてください。唯一のことは、メモリやディスクリプタがまだ使用中の場合は上書きしないようにする必要があるため、ケースを防ぐためにフェンスを張らなければなりません。

+0

それで 'CopyDescriptors'を使うと、いつGPU側でヒープを更新しますか? 'SetGraphicsRootDescriptorTable'を呼び出すとどうなりますか? – cehnehdeh

+0

いいえ、CopyDescriptorsは即時です。戻ったらコピーが完了します。厄介なのは、ルート署名1.0と1.1の違いです。 1.0とvolatileテーブルは、ディスクリプタがCPU上で使用されるときに準備ができているとはみなさず、コマンドリストを閉じるときにディスクリプタがここに来ると仮定します。静的テーブルを持つ1.1では、描画をトリガするように設定したときにディスクリプタが準備完了であり、その後は変更されないと仮定します。 – galop1n

+0

したがって、それぞれが一意のcbufferデータを持つ複数のオブジェクトをレンダリングしている場合、オブジェクトごとに異なるオフセットで記述子ヒープを更新するために 'CopyDescriptors'を呼び出しますか? – cehnehdeh

関連する問題