AGC と PM4 のコマンドストリーム
PS5 のタイトルは自分のメモリで GPU のパケットを組み立て、そのバッファを送信します。PS5PCEM はその PM4 ストリームをデコードし、レジスターの状態を保持し、描画とディスパッチを順番に実行します。
2026年10月10日 までのリポジトリノート
ストリームがグラフィックス API そのもの
タイトルは三角形ごとに高レベルの描画関数を呼ぶ必要はありません。パケットを書き込みます。レジスターの更新、描画、ディスパッチ、フェンス、フリップです。どの層がバッファを作ったとしても、GPU から見えるのは同じストリームです。デコーダーは、オペコードに文書化された意味があるパケットには名前を付け、それ以外は数値のままにします。トレースにでっち上げた名前があるのは、オペコードのままよりも悪いからです。
パケット本体の長さは 1 を引いた値で格納されるため、空の本体はエンコードできません。すべての手順で範囲を確認します。収まらない本体は報告され、切り詰めることはしません。切り詰めた本体は後続のパケットをすべてずらし、トレースが嘘をつくことになるからです。
状態、待機、間接バッファ
レジスターの状態は、ゼロの書き込みも含めて送信をまたいで残ります。実行部は、直接のレジスターリスト、ネイティブとレガシーの間接リスト、acquire と release、32 ビットと 64 ビットの待機、書き込み、イベント、SetFlip を適用します。満たされない待機はブロックされたことと、再開すべき正確なワードを返します。進んだように見せかけるためにゲストのメモリを書き換えることはありません。
間接バッファは、通常の 4 dword の形と条件付きの 14 dword の形の両方を再帰的にたどります。チェーンのパケットは親を終了させます。入れ子は 16 段で止まります。ブロックされた子はルートから葉までの固定の経路を返すため、再開してもすでに行った描画をやり直すことはありません。スケジューラーは各ルートのコマンドバッファと、そこからたどれる間接バッファをコピーするので、待機がまだブロックされている間にタイトルがその領域を再利用しても構いません。
レジスターから描画へ
描画やディスパッチの時点で、レジスターのスナップショットは型付きのリソースになります。128 ビットのバッファとサンプラーのディスクリプター、256 ビットのイメージのディスクリプター、8 つのカラーターゲット、深度とステンシル、ビューポート、シザー、カリング、ブレンド、PS5 のスウィズルと MSAA のフィールドです。カラー制御とクリップ制御の書き込みがない場合は AGC の既定値を引き継ぎます。明示的な無効化は無効のままです。2 つの CPU ワーカーがグラフィックスとコンピュートのコマンドを準備し、実行と完了の順序が保たれるよう、ひとつの Vulkan の所有者がそれらを送信します。
シェーダーのメタデータが、リソーステーブルとユーザーデータのレジスターを提供します。スカラーの由来の解析は、シェーダーの範囲を限った先頭部分をたどり、その先頭部分が実際に触れるゲストのメモリだけを読み込み、不明な分岐ではディスクリプターをでっち上げずに止まります。その結果を、トランスレーターと Vulkan のバックエンドが使います。
実装済みのこと
- 1 を引いた本体の長さと、すべてのパケットに対する厳密な範囲を伴う PM4 のデコード。
- 永続するレジスターバンク、ブロックされた待機、16 段までの再帰的な間接バッファ。
- 描画時の型付きのバッファ、イメージ、カラーターゲット、深度、ビューポート、ブレンド、MSAA の状態。
- 2 つの準備ワーカーと、順序を守るひとつの Vulkan の送信担当。
まだ足りないこと
- 文書化された意味がないオペコードは名前のないままです。
- ブロックされた待機を、偽のフェンス値を書き込んで解除することは決してありません。
- レイヤー、メタデータ、いくつかのイメージ操作はまだ不完全です。それぞれ専用のページがあります。
関連するしくみ
これらのページについて