AGC e o fluxo de comandos PM4
Um título de PS5 monta pacotes de GPU na própria memória e envia o buffer. O PS5PCEM decodifica esse fluxo PM4, mantém o estado dos registradores e executa desenhos e dispatches em ordem.
Notas do repositório até 10 de outubro de 2026
O fluxo é a API de gráficos
O título não precisa chamar uma função de desenho de alto nível para cada triângulo. Ele escreve pacotes: atualizações de registrador, desenhos, dispatches, fences e flips. Seja qual for a camada que produziu o buffer, a GPU vê o mesmo fluxo. O decodificador nomeia os pacotes cujos opcodes têm um significado documentado e deixa os outros como números. Um nome inventado num rastreio seria pior do que um opcode.
O comprimento do corpo do pacote é armazenado com viés de um, então um corpo vazio não pode ser codificado. Cada passo verifica os próprios limites. Um corpo que não cabe é informado. Ele não é cortado, porque um corpo cortado deslocaria todo pacote seguinte e o rastreio mentiria.
Estado, esperas e buffers indiretos
O estado dos registradores sobrevive entre envios, inclusive escritas de zero. O executor aplica listas diretas de registradores, listas indiretas nativas e legadas, acquire e release, esperas de 32 bits e de 64 bits, escritas, eventos e SetFlip. Uma espera que não foi atingida devolve bloqueio e a palavra exata de onde retomar. A memória convidada não é modificada para fabricar progresso.
Buffers indiretos são seguidos de forma recursiva, tanto a forma comum de 4 dwords quanto a forma condicional de 14 dwords. Pacotes de encadeamento encerram o pai. O aninhamento para em dezesseis frames. Um filho bloqueado devolve um caminho fixo da raiz até a folha, então retomar não reproduz desenhos que já aconteceram. O escalonador copia cada buffer de comandos raiz e os buffers indiretos que consegue alcançar, então o título pode reciclar a arena enquanto uma espera ainda está bloqueada.
Dos registradores a um desenho
Num desenho ou num dispatch, o instantâneo dos registradores vira recursos tipados: descritores de buffer e de amostrador de 128 bits, descritores de imagem de 256 bits, oito alvos de cor, profundidade e stencil, viewports, scissor, cull, mistura e os campos de swizzle e de MSAA da PS5. Escritas ausentes de controle de cor e de controle de recorte herdam os padrões do AGC. Um desligamento explícito continua desligado. Dois workers de CPU preparam comandos de gráficos e de computação. Um dono Vulkan os envia para que a execução e a conclusão permaneçam ordenadas.
Os metadados do shader fornecem as tabelas de recursos e os registradores de user data. A proveniência escalar percorre um prefixo limitado do shader, carrega só a memória convidada que o prefixo de fato toca e para num desvio desconhecido em vez de inventar um descritor. O resultado é o que o tradutor e o backend Vulkan consomem.
O que está implementado
- Decodificação PM4 com comprimentos de corpo enviesados e limites rígidos em todo pacote.
- Bancos de registradores persistentes, esperas bloqueadas e buffers indiretos recursivos até dezesseis frames.
- Buffers tipados, imagens, alvos de cor, profundidade, viewport, mistura e estado de MSAA na hora do desenho.
- Dois workers de preparação e um dono ordenado do envio Vulkan.
O que ainda falta
- Um opcode sem significado documentado permanece sem nome.
- Uma espera bloqueada nunca é liberada pela escrita de um valor falso de fence.
- Camadas, metadados e algumas operações de imagem ainda estão incompletos. Esses assuntos têm páginas próprias.
Mecanismos relacionados
O que estas páginas descrevem