AGC et le flux de commandes PM4
Un titre PS5 construit des paquets GPU dans sa propre mémoire et soumet le tampon. PS5PCEM décode ce flux PM4, conserve l'état des registres, et exécute les draws et les dispatches dans l'ordre.
Notes du dépôt jusqu’au 10 octobre 2026
Le flux est l'API graphique
Le titre n'a pas à appeler une fonction de tracé de haut niveau pour chaque triangle. Il écrit des paquets : mises à jour de registres, draws, dispatches, fences et flips. Quelle que soit la couche qui a produit le tampon, le GPU voit le même flux. Le décodeur nomme les paquets dont les opcodes ont une signification documentée et laisse les autres sous forme de nombres. Un nom inventé dans une trace serait pire qu'un opcode.
La longueur du corps du paquet est stockée avec un biais de un, de sorte qu'un corps vide ne peut pas être encodé. Chaque pas vérifie ses bornes. Un corps qui ne tient pas est signalé. Il n'est pas rogné, parce qu'un corps rogné décalerait chaque paquet suivant et la trace mentirait.
État, attentes et tampons indirects
L'état des registres survit d'une soumission à l'autre, y compris les écritures de zéro. L'exécuteur applique les listes de registres directes, les listes indirectes natives et héritées, acquire et release, les attentes 32 bits et 64 bits, les écritures, les événements et SetFlip. Une attente non satisfaite renvoie l'état bloqué et le mot exact d'où reprendre. La mémoire invitée n'est pas modifiée pour fabriquer un progrès.
Les tampons indirects sont suivis récursivement, à la fois la forme ordinaire de 4 dwords et la forme conditionnelle de 14 dwords. Les paquets de chaînage terminent le parent. L'imbrication s'arrête à seize cadres. Un enfant bloqué renvoie un chemin fixe de la racine jusqu'à la feuille, de sorte que la reprise ne rejoue pas des draws déjà effectués. L'ordonnanceur copie chaque tampon de commandes racine et les tampons indirects qu'il peut atteindre, pour que le titre puisse recycler l'arène pendant qu'une attente est encore bloquée.
Des registres à un draw
À un draw ou à un dispatch, l'instantané des registres devient des ressources typées : descripteurs de tampon et d'échantillonneur de 128 bits, descripteurs d'image de 256 bits, huit cibles couleur, profondeur et stencil, viewports, scissor, cull, blend, et les champs de swizzle et de MSAA de la PS5. Les écritures manquantes de contrôle de couleur et de contrôle de découpe héritent des valeurs par défaut d'AGC. Une désactivation explicite reste une désactivation. Deux workers CPU préparent les commandes graphiques et de calcul. Un seul propriétaire Vulkan les soumet, pour que l'exécution et l'achèvement restent ordonnés.
Les métadonnées de shader fournissent les tables de ressources et les registres de données utilisateur. La provenance scalaire parcourt un préfixe borné du shader, ne charge que la mémoire invitée que ce préfixe touche réellement, et s'arrête sur une branche inconnue au lieu d'inventer un descripteur. Le résultat est ce que le traducteur et le backend Vulkan consomment.
Ce qui est en place
- Décodage PM4 avec des longueurs de corps biaisées et des bornes strictes sur chaque paquet.
- Banques de registres persistantes, attentes bloquées, et tampons indirects récursifs jusqu'à seize cadres.
- Tampons typés, images, cibles couleur, profondeur, viewport, blend et état MSAA au moment du draw.
- Deux workers de préparation et un seul propriétaire de soumission Vulkan ordonnée.
Ce qui manque encore
- Un opcode sans signification documentée reste sans nom.
- Une attente bloquée n'est jamais levée en écrivant une valeur de fence factice.
- Les couches, les métadonnées et quelques opérations d'image sont encore incomplètes. Elles ont leurs propres pages.
Mécanismes liés
Ce que ces pages décrivent