dcl_interface_dynamicindexed (sm5 - asm)
関数テーブル ポインター (インターフェイス) を宣言します。
dcl_interface_dynamicindexed fp#[arraySize][numCallSites] = {ft#, ft#, ...} |
---|
項目 | 説明 |
---|---|
Fp# |
[入力]関数テーブルポインター。 |
解説
シェーダーを使用できるようにするには、各インターフェイスを API からバインドする必要があります。 バインディングは、メソッド スロットを入力できるように、いずれかの関数テーブルへの参照を提供します。 コンパイラは、参照されていないオブジェクトのポインターを生成しません。
関数テーブル ポインターには、C++ ポインター対 vtable 表現で必要となる余分なレベルの間接参照を避けるために、メソッド スロットの完全なセットがあります。 また、このポインターは 5 タプルである必要もあります。 HLSL 仮想インライン化モデルでは、ルート オブジェクトごとにテーブルを設定できるように、呼び出しに使用されるグローバル変数/入力が常にわかっています。
関数ポインター宣言は、使用できる関数テーブルを示します。 これにより、メソッドの関連付け情報の派生も可能になります。
インターフェイス宣言の最初の [] は配列サイズです。 動的インデックス作成が使用されている場合、宣言は示すように を示します。 インターフェイス ポインターの配列は静的にインデックスを作成することもできます。また、インターフェイス ポインターの配列が動的インデックス作成を意味する必要はありません。
インターフェイス ポインターの番号付けは、最初の宣言では 0 から始まり、その後は配列サイズが考慮されるため、4 つのエントリ配列 fp0[4][1] の後の最初のポインターは fp4[][][]になります。
インターフェイス宣言の 2 番目の [] は、呼び出しサイトの数であり、宣言で参照されている各テーブルの本体の数と一致する必要があります。
インターフェイス宣言に一覧表示できる関数テーブル (ft#) の選択肢の数に関する境界はありません。
特定の関数テーブル (ft#) は、1 つ以上のインターフェイス宣言に複数回出現できます。
制限
シェーダー内のオブジェクト サイトの数 (つまり、その [arraySize] 宣言のすべての fp# 宣言の合計) は、253 以下である必要があります。 この数値は、 この ポインターが存在できる数に対応します。 ランタイムは、このポインター データを通信するために DDI のサイズにバインドを保持するために、この 253 の制限を適用します。
シェーダー内の呼び出しサイトの数 (潜在的なブランチ ターゲットの数のすべての fcall ステートメントの合計) は、4096 以下である必要があります。
たとえば、最初の fp[][] ディメンションに静的インデックスを使用する fcall は、次のようにカウントされます。
fcall fp0[0][0] // +1
動的インデックスを使用する fcall は、配列内の要素の数としてカウントされます ( dcl_interfaceの最初の [])。
dcl_interface_dynamicindexed fp1[2][1] = {ft2, ft3, ft4} ...
fcall fp1[r0.z + 0][1] // +2
この制限は、一部の実装で、定数バッファーのようなストレージ内の関数本体の選択のテーブルを簡単に収めるのに役立ちます。
この命令は、次のシェーダー ステージに適用されます。
Vertex | Hull | Domain | ジオメトリ | ピクセル | Compute |
---|---|---|---|---|---|
X | X | X | X | X | X |
最小シェーダー モデル
この命令は、次のシェーダー モデルでサポートされています。
シェーダー モデル | サポートされています |
---|---|
シェーダー モデル 5 | はい |
シェーダー モデル 4.1 | no |
シェーダー モデル 4 | no |
シェーダー モデル 3 (DirectX HLSL) | no |
シェーダー モデル 2 (DirectX HLSL) | no |
シェーダー モデル 1 (DirectX HLSL) | no |
cs_4_0とcs_4_1は、UAV と SRV に対するこの命令をサポートします。