記述子ヒープの入力と設定

コマンド リストで設定できる記述子ヒープの種類は、記述子テーブルを使用できる記述子を格納するものです (一度に最大で 1 つずつ)。

記述子ヒープの設定

コマンド リストで設定できる記述子ヒープの種類は次のとおりです。

D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV
D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER

コマンド リストで設定されるヒープは、シェーダーが認識する対象として作成されている必要もあります。 コマンド リストには、DIRECT、BUNDLE、COMPUTE の 3 種類があります。

コマンド リストで記述子ヒープが設定されると、記述子テーブルを定義する後続の呼び出しは、現在の記述子ヒープを参照します。 コマンド リストの開始およびコマンド リストで記述子ヒープが変更された後の記述子テーブルの状態は未定義です。 同じ記述子ヒープを重複して設定しても、記述子テーブルの設定は未定義になりません。

これに対しバンドルでは、記述子ヒープを 1 回しか設定できません (重複する呼び出しで同じヒープを 2 回設定してもエラーにはなりません)。それ以外の場合の動作は未定義です。 設定された記述子ヒープは、コマンド リストがバンドルを呼び出すときの状態と一致していなければなりません。それ以外の場合の動作は未定義です。 これにより、バンドルはコマンド リストの記述子テーブルの設定を継承して編集できるようになります。 記述子テーブルを変更しない (それらを継承するのみの) バンドルでは、記述子ヒープを設定する必要がなく、呼び出し元のコマンド リストからの継承のみを行います。

記述子ヒープを設定すると (ID3D12GraphicsCommandList::SetDescriptorHeaps を使用)、使用されるすべてのヒープが 1 回の呼び出しで設定されます (以前に設定されたすべてのヒープはこの呼び出しで設定解除されます)。 呼び出しでは、上記の各種類のヒープを最大 1 つ設定できます。

記述子ヒープへの入力

アプリケーションが記述子ヒープを作成した後、デバイス上のメソッドを使用して記述子をヒープに直接生成するか、記述子をある場所から別の場所にコピーすることができます。

記述子ヒープ メモリの初期の内容は未定義であるため、レンダリングのために GPU またはドライバーに初期化されていないメモリの参照を指示すると、デバイス リセットなどの未定義の結果が生じることがあります。

アプリケーションが記述子ヒープを CPU に認識される対象として構成した場合、CPU はフリースレッドで即時にメソッドを呼び出して記述子をヒープに作成したり、ある場所から別の場所にコピー (ヒープ間も含む) したりすることができます。 ヒープがSHADER_VISIBLEとして構成されている場合、CPU による読み取りは許可されません。

記述子ヒープ