シェーダーに表示される記述子ヒープは、記述子テーブルを介してシェーダーによって参照できる記述子ヒープです。
概要
記述子テーブルを介してシェーダーによって参照できる記述子ヒープには、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 テクスチャをパイプラインで使用できます。
手記
多くの場合、記述子ヒープの CPU (書き込み結合メモリと呼ばれます) によって書き込み可能な GPU ローカル メモリの量の GPU ハードウェアには制限があります。 通常、この制限はすべてのプロセスで約 96 MB です。 たとえば、32 バイトの記述子を持つ 100 万のメンバー記述子ヒープでは、最大 32 MB が使用されます。 ドライバーは、必要に応じてシステム メモリにフォールバックしますが、大量の大きな記述子ヒープを作成しないことをお勧めします。
関連トピック
-
記述子ヒープ の