シェーダーに認識される記述子ヒープ
シェーダーに認識される記述子ヒープは、シェーダーが記述子テーブルを通じて参照できる記述子ヒープです。
概要
記述子テーブルを介してシェーダーによって参照できる記述子ヒープには、いくつかの種類があります。1 つのヒープの種類、D3D12_SRV_UAV_CBV_DESCRIPTOR_HEAPは、シェーダー リソース ビュー、順序なしアクセス ビュー、定数バッファー ビューをすべて混在させて保持できます。 ヒープの任意の場所に、ここに挙げた種類の記述子をどれでも配置できます。 もう 1 つのヒープの種類D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER、サンプラーのみが格納されます。これは、ほとんどのハードウェアでは、サンプラーが SRV、UAV、CBV とは別に管理されているという事実を反映しています。
これらの種類の記述子ヒープには、作成時に、シェーダーに認識されるかどうかを指定できます (シェーダーに認識されないようにすると、CPU で記述子をステージングする場合に便利です)。 シェーダーに認識されるように指定した場合は、上記のそれぞれのヒープの種類に対し、個々の記述子ヒープの割り当てにハードウェア サイズの制限を設定できます。
アプリケーションでは記述子ヒープをいくつでも作成でき、シェーダーに認識されない記述子ヒープにはサイズの制限がありません。 シェーダーに認識される記述子ヒープがアプリケーションで作成された場合、そのサイズがハードウェア サイズの制限を下回るときは、ドライバーが、基になる大きな記述子ヒープから記述子ヒープをサブ割り当てして、複数の API 記述子ヒープを 1 つのハードウェア記述子ヒープ内に収めることができます。 これが行われる理由は、一部のハードウェアで、実行中にハードウェア記述子ヒープ間を切り替えたときに GPU のアイドル状態待ちが必要になるためです (これによって GPU が前の記述子ヒープへの参照を終了したことを確認します)。 アプリケーションが作成するすべての記述子ヒープが適切なハードウェア ヒープの最大容量に収まる場合は、レンダリング中に API 記述子ヒープを切り替えてもこの待機は発生しません。 ただし、現在の記述子ヒープを切り替えるとアイドル状態待ちが発生する可能性があることを、アプリケーションで考慮する必要があります。
記述子ヒープの切り替え時に発生するこのアイドル状態待ちの影響を受けないようにするために、アプリケーションでは、記述子ヒープ切り替え時に別の理由で GPU をアイドル状態にするレンダリングの中断を利用できます。いずれにしてもアイドル状態待ちが発生するからです。
コマンド リスト/バンドルの記録中にシェーダーが記述子ヒープを識別するためのメカニズムとセマンティクスは、API リファレンスで説明されています。
使用例
次の図では、大きな既定のヒープの 2 つのスロットに格納されている 2 つの 2D テクスチャを、2 つの記述子ヒープが参照しています。 シェーダーに認識される記述子ヒープには、グラフィックス パイプラインから (シェーダーも含めて) アクセスできるため、この 2D テクスチャはパイプラインで利用できます。
Note
多くの場合、CPU が記述子ヒープ用に書き込むことができる GPU ローカル メモリ (書き込み結合メモリ) の量は、GPU ハードウェアで制限されています。 通常、この制限はどのプロセスでも約 96 MB です。 たとえば、100 万メンバーの記述子ヒープで記述子が 32 バイトである場合は、最大 32 MB が使用されます。 ドライバーは必要に応じてシステム メモリにフォールバックしますが、大きな記述子ヒープを大量に作成しないことをお勧めします。
関連トピック