fcall (sm5 - asm)
インターフェイス関数の呼び出し。
fcall fp#[arrayIndex][callSite] |
---|
項目 | 説明 |
---|---|
Fp# |
[入力]関数ポインター。 |
arrayIndex |
[in] オプション。 関数ポインター配列へのオフセットを指定します。 fp# がインデックス可能として宣言されていない場合、このパラメーターはリテラル符号なし整数である必要があります。 それ以外の場合、arrayIndex は、シェーダー レジスタからのリテラル ベース + オフセットの形式になります。 たとえば、fcall fp1[r1.w + 0][0] などです。 |
callSite |
[in] オプション。 実行する関数本体 fb# を選択する、選択した関数テーブルへのリテラル符号なし整数オフセット。 |
解説
fp#[arrayIndex][] は、 fp# の宣言に記載されている関数テーブルの選択肢からシェーダーの外部にある API から選択された特定の関数テーブルに解決されます。
fp# と arrayIndex の # の合計で、関数テーブルを選択します。 たとえば、インターフェイスが fp4[4][3] (配列サイズ 4) として宣言されている場合、 fcall は fcallfp4[2][3] と fp5[1][3] に相当します。これは、4+2 = 5+1 であるためです。
制限
arrayIndex が動的インデックス作成を使用する場合、隣接するシェーダー呼び出しで arrayIndex が分岐した場合の動作は未定義になります。これは、ロックステップで実行される可能性があります。 HLSL コンパイラは、このケースを禁止しようとします。
隣接する呼び出しは、ロックステップの実行を中断しないため、フロー制御のために非アクティブになる可能性があります。
fp# + arrayIndex で範囲外のインデックスが指定されている場合、動作は未定義です。
ここで説明する未定義のケースでは、デバイスが失われる可能性を含め、現在の D3D デバイスの動作が未定義になることを意味します。 ただし、現在の D3D デバイスの外部にあるメモリは、コードとしてアクセスまたは実行されません。
この命令は、次のシェーダー ステージに適用されます。
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 |