シェーダーのスカラー呼び出し
S_SWAPPC_B64 と S_CALL_B64 は完全な戻りアドレスを保存し、ENDPGM の後ろにある呼び出し先を含め、範囲付きのローカルなサブルーチンを実行します。検証済みの AGC のフェッチシェーダーも同じ方法でリンクできます。
2026年10月10日 までのリポジトリノート
呼び出しと戻り
SOP1 のオペコード 0x21 は S_SWAPPC_B64 です。SOPK のオペコード 0x16 は S_CALL_B64 で、呼び出し先は PC + 4 + sign_extend(SIMM16) * 4 となり、後方への呼び出しも含みます。どちらも次の命令のアドレスを書き込み先の SGPR のペアに書き込みます。対応する S_SETPC_B64 でそこに戻ります。CALL は SCC と EXEC に触れません。
書き込み先が null の SWAPPC は、既存の S_SETPC_B64 の続きのままです。ローカルな SWAPPC の呼び出し先は、GETPC と全幅の即値の加算または減算から解決できます。命令がリンクレジスターにも書き込む場合でも、呼び出し先は取得されます。ENDPGM の後ろにある呼び出し先は、割り当てと命令の範囲内で、対応する戻りまでデコードされます。通常のハードウェアの続きは、それでも末尾のメタデータの手前で止まります。
呼び出しの変換方法
制御フローグラフに、明示的な呼び出しと戻りの辺が加わります。呼び出し先は呼び出し側のレジスターの状態を共有し、範囲付きの SPIR-V のディスパッチャーを使います。未対応の呼び出しが線形の制御フローの経路に落ちることはありません。ホスト側のリソース探索は呼び出しと戻りをたどるため、呼び出し先の中で初期化されたディスクリプターも見えます。
対応する呼び出しはそれぞれ、s0:s1 から s104:s105 までの偶数アラインの別々の SGPR のペアをひとつ持ち、対応する戻りはちょうどひとつです。呼び出し先は、チェッカーが許す形で入れ子または順番に並びます。呼び出し先が任意の実行時の値になる一般的な動的な呼び出し先は、未対応のままです。
フェッチシェーダーとプローブ
呼び出しの変更されていないユーザーデータのペアが AGC の登録したアドレスと一致する場合、外部のフェッチシェーダーをリンクします。フェッチの本体は戻りの SETPC までデコードされ、その SETPC は呼び出し側のリンクのペアを読まなければなりません。解析のキャッシュは通常のプログラムとフェッチの本体を区別するため、古いフェッチの挿入がローカルなサブルーチンの戻りを上書きすることはありません。
42 回のディスパッチの GPU のプローブで 21,504 ワードを確認します。10 月 9 日のレポートは、呼び出しだけから新しいゲームの到達点や新しいフレームレートを主張していません。
実装済みのこと
- 完全な戻りアドレスと対応する S_SETPC_B64 を伴う S_SWAPPC_B64 と S_CALL_B64。
- 既存の範囲内での、入れ子の呼び出し先と ENDPGM の後ろに置かれた呼び出し先。
- 戻りが呼び出し側のリンクを読む、検証済みの AGC のフェッチシェーダーのリンク。
- 21,504 ワードをカバーする 42 回のディスパッチのプローブ。
まだ足りないこと
- 一般的な動的な呼び出し先は未対応です。
- 呼び出しには、偶数アラインのリンクのペアひとつと、対応する戻りひとつが必要です。
- プローブはフレーム毎秒の結果ではありません。
関連するしくみ
これらのページについて