コマンド キューおよびコマンド リストの設計指針

レンダリング作業およびマルチスレッド スケーリングを再利用できるようにするために、Direct3D アプリがレンダリング作業を GPU に送信する方法を根本的に変更する必要があります。 Direct3D 12 のレンダリング作業を送信するプロセスは、次の 3 つの重要な点で以前のバージョンとは異なります。

  1. イミディエイト コンテキストの削除。 これにより、マルチスレッドが可能になります。
  2. レンダリング呼び出しをグラフィックス処理装置 (GPU) の作業項目にグループ化する方法をアプリが所有するようになりました。 これにより、再利用が可能になります。
  3. アプリは、作業が GPU に送信されるタイミングを明示的に制御するようになりました。 これにより、項目 1 と 2 が可能になります。

イミディエイト コンテキストの削除

Microsoft Direct3D 11 から Microsoft Direct3D 12 への最大の変更は、デバイスに関連する単一のイミディエイト コンテキストがなくなったことです。 代わりに、レンダリングを行うために、アプリでコマンド リストを作成します。これにより、従来のレンダリング API を呼び出すことができます。 コマンド リストは、プリミティブを描画する呼び出し、またはレンダリング状態を変更する呼び出しが含まれるという点で、イミディエイト コンテキストを使用していた Direct3D 11 アプリのレンダー方式と類似しています。 イミディエイト コンテキストと同様に、各コマンド リストはフリー スレッドではありません。ただし、複数のコマンド リストを同時に記録でき、それにより、最新のマルチコア プロセッサを活用できます。

コマンド リストは、通常、1 回実行されます。 ただし、アプリケーションで、新しい実行を送信する前に前の実行を完了させれば、コマンド リストは複数回実行できます。 コマンド リストの同期について詳しくは、「コマンド リストの実行と同期」を参照してください。

GPU 作業項目のグループ化

Direct3D 12 では、コマンド リストに加えて、"バンドル" と呼ばれる第 2 レベルのコマンド リストを追加することで、現在のすべてのハードウェアで提供されている機能を利用できます。 これらの 2 つの種類を区別するために、第 1 レベルのコマンド リストを "直接コマンド リスト" と呼ぶ場合があります。 バンドルの目的は、後で直接コマンド リスト内から API コマンドを繰り返し実行できるようにするために、アプリでそれらの少数の API コマンドをグループ化できるようにすることです。 バンドルの作成時に、ドライバーは、後の実行を効率的にするために、できるだけ多くの前処理を実行します。 その後、複数のコマンド リスト内からバンドルを実行でき、また同じコマンド リスト内からバンドルを複数回実行できます。

バンドルの再利用は、単一の CPU スレッドで効率を向上させるための大きな要因となります。 バンドルは前処理され、複数回送信できるため、バンドル内でどの操作を実行できるかに関して特定の制限があります。 詳細については、「コマンド リストおよびバンドルの作成と記録」を参照してください。

GPU 作業の送信

GPU で作業を実行するには、Direct3D デバイスに関連付けられているコマンド キューにコマンド リストをアプリで明示的に送信する必要があります。 直接コマンド リストを実行用に複数回送信できますが、再送信する前に、その直接コマンド リストの GPU での実行が終了していることをアプリで確実にする必要があります。 バンドルには同時使用の制限はなく、複数のコマンド リストで複数回実行できますが、バンドルを実行用にコマンド キューに直接送信することはできません。

任意のスレッドで任意のコマンド キューにコマンド リストをいつでも送信できます。ランタイムにより、送信順序が保持されると同時に、コマンド キュー内のコマンド リストの送信が自動的にシリアル化されます。