Saltar al contenido
PS5PCEM
ParcialGráficos

AGC y el flujo de comandos PM4

Un título de PS5 construye paquetes de GPU en su propia memoria y envía el búfer. PS5PCEM descodifica ese flujo PM4, conserva el estado de los registros y ejecuta dibujos y despachos en orden.

Notas del repositorio hasta el 10 de octubre de 2026

El flujo es la API de gráficos

El título no tiene que llamar a una función de dibujo de alto nivel por cada triángulo. Escribe paquetes: actualizaciones de registros, dibujos, despachos, fences y flips. Sea cual sea la capa que produjo el búfer, la GPU ve el mismo flujo. El decodificador nombra los paquetes cuyos opcodes tienen un significado documentado y deja los demás como números. Un nombre inventado en una traza sería peor que un opcode.

La longitud del cuerpo del paquete se almacena con un sesgo de uno, de modo que un cuerpo vacío no puede codificarse. Cada paso comprueba sus límites. Un cuerpo que no cabe se informa. No se trunca, porque un cuerpo truncado desplazaría cada paquete siguiente y la traza mentiría.

Estado, esperas y búferes indirectos

El estado de los registros sobrevive entre envíos, incluidas las escrituras de cero. El ejecutor aplica listas directas de registros, listas indirectas nativas y heredadas, acquire y release, esperas de 32 y de 64 bits, escrituras, eventos y SetFlip. Una espera que no se cumple devuelve bloqueado y la palabra exacta desde la que reanudar. La memoria del invitado no se modifica para fabricar progreso.

Los búferes indirectos se siguen de forma recursiva, tanto la forma ordinaria de 4 dwords como la forma condicional de 14 dwords. Los paquetes chain terminan al padre. El anidamiento se detiene en dieciséis marcos. Un hijo bloqueado devuelve una ruta fija desde la raíz hasta la hoja, de modo que reanudar no vuelve a ejecutar dibujos que ya ocurrieron. El planificador copia cada búfer de comandos raíz y los búferes indirectos a los que puede llegar, para que el título pueda reciclar la arena mientras una espera sigue bloqueada.

De los registros a un dibujo

En un dibujo o un despacho, la instantánea de registros se convierte en recursos tipados: descriptores de búfer y de sampler de 128 bits, descriptores de imagen de 256 bits, ocho destinos de color, profundidad y stencil, viewports, scissor, culling, mezcla, y los campos de swizzle y MSAA de PS5. Las escrituras ausentes de color-control y de clip-control heredan los valores predeterminados de AGC. Una desactivación explícita sigue siendo una desactivación. Dos workers de CPU preparan los comandos de gráficos y de cómputo. Un único propietario de Vulkan los envía para que la ejecución y la finalización sigan ordenadas.

Los metadatos del shader aportan las tablas de recursos y los registros de user-data. La procedencia escalar recorre un prefijo acotado del shader, carga solo la memoria del invitado que el prefijo toca de verdad y se detiene ante una rama desconocida en lugar de inventar un descriptor. El resultado es lo que consumen el traductor y el backend de Vulkan.

Qué está implementado

  • Descodificación PM4 con longitudes de cuerpo sesgadas y límites estrictos en cada paquete.
  • Bancos de registros persistentes, esperas bloqueadas y búferes indirectos recursivos de hasta dieciséis marcos.
  • Búferes tipados, imágenes, destinos de color, profundidad, viewport, mezcla y estado MSAA en el momento del dibujo.
  • Dos workers de preparación y un propietario ordenado del envío a Vulkan.

Qué falta todavía

  • Un opcode sin un significado documentado sigue sin nombre.
  • Una espera bloqueada nunca se despeja escribiendo un valor de fence falso.
  • Las capas, los metadatos y unas pocas operaciones de imagen siguen incompletos. Tienen sus propias páginas.

Mecanismos relacionados

Qué describen estas páginas

El texto sigue las notas de arquitectura y los informes de octubre de 2026 del repositorio PS5PCEM. Un test concreto que pasa no es una tasa de fotogramas nueva ni una partida terminada nueva.

Todas las tecnologías