次の方法で共有


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 に対するこの命令をサポートします。

シェーダー モデル 5 アセンブリ (DirectX HLSL)