Emulação do GS do PlayStation 2 – a fronteira final da emulação por compute com Vulkan
- Em 2020, foi escrito o paraLLEl-RDP para implementar o RDP do N64 com compute em Vulkan. Ele era muito rápido e preciso, e depois ganhou suporte a upscaling.
- Isso levou à ideia de um projeto semelhante para o PlayStation 2. Até agora, o GSdx foi o padrão por 20 anos.
- O paraLLEl-GS não é a primeira implementação por compute do GS do PS2. Houve uma tentativa em OpenCL em 2014, mas ela não foi concluída.
Visão geral básica do GS
O GS é um monstro no processamento de pixels
- O GS é famoso por sua taxa de preenchimento e largura de banda enormes. Em 2000, ele conseguia processar mais de 1 bilhão de pixels por segundo.
- A VRAM é pequena, mas foi projetada para receber streaming contínuo usando vários motores de DMA.
O pipeline de pixels do GS é básico, mas peculiar
- O GS é mais simples que o RDP do N64. Ele tem uma única textura e um combinador de ciclo único.
- O blending pode ultrapassar 1.0. 0x80 é tratado como 1.0, e pode chegar até 0xff.
- Há vários recursos peculiares, como teste de alfa de destino, blending condicional e correção de alfa.
Regras de rasterização no estilo D3D9
- Os primitivos são fornecidos de forma simples no espaço de clip. A unidade VU1 faz a transformação e o clipping.
- X/Y: ponto fixo 12.4, Z: uint de 24 bits ou 32 bits, FOG: uint de 8 bits, RGBA: 8 bits, STQ: texturização em perspectiva com coordenadas normalizadas.
Fila de vértices
- O GS lembra o OpenGL 1.0. Ele suporta TRIANGLE_FAN.
- Escritas no registrador XYZ fixam o estado do vértice e avançam a fila.
Formatos de swizzle interessantes
- Ao renderizar em cor ou profundidade de 24 bits, é possível usar os 8 bits superiores como textura.
- As coordenadas de pixel são organizadas em "páginas". Cada página tem 8 KiB e é subdividida em 32 blocos.
Cache de framebuffer e cache de textura
- Há caches dedicados para renderização em framebuffer e para texturas. Os jogos frequentemente fazem loops de feedback.
Texturização
- A texturização é familiar, mas também arcana. O centro do texel fica em meio pixel.
- Existem modos especiais de endereçamento, como REGION_CLAMP e REGION_REPEAT.
CLUT
- Há um cache de 1 KiB que armazena a paleta atual. É necessária uma etapa explícita de cópia da VRAM para o cache de CLUT.
TEXFLUSH
- Há um comando para sincronizar e invalidar o cache de textura. A escolha aqui é ignorar TEXFLUSH e optar por cache mínimo.
Manipulação de registradores com GIF
- A interação com o hardware GS é feita por meio do GIF. O cabeçalho do pacote GIF define os registradores de destino e a contagem de loops.
Trongle – GS
- Uma API para quem sente falta da simplicidade do OpenGL 1.0.
- Foi adicionada uma ferramenta para gerar o formato de dump .gs para fins de teste.
Detalhes de implementação
Pipeline de renderização
- Sincronização de dados da CPU para a VRAM, upload de dados para a VRAM, atualização do cache de CLUT, unswizzle da VRAM para VkImages, renderização, sincronização da VRAM da GPU para a CPU.
Rastreador de páginas
- A VRAM é rastreada por páginas. O estado das páginas é acompanhado para lidar com possíveis hazards.
Cache de texturas
- Cada página tem uma lista de VkImages associadas. Quando a textura de uma página é invalidada, a imagem é destruída e refeita com um novo unswizzle a partir da VRAM.
Atualizações de CLUT
- Para fazer upload em lote de texturas, os uploads de CLUT também são feitos em lote. São usados 1024 snapshots de CLUT.
Unswizzle de texturas a partir da VRAM
- O Vulkan é usado para alocar uma nova VkImage e processá-la com um compute shader.
Configuração de triângulos e binning
- Assim como o paraLLEl-RDP, trata-se de um renderizador baseado em tiles. Ele fornece arranjos de atributos para a configuração dos triângulos.
Resumo do GN⁺
- Este artigo trata da emulação do GS do PlayStation 2, com foco especial em uma implementação usando compute shaders em Vulkan.
- O GS do PS2 é difícil de emular por causa de seu pipeline de pixels complexo e de seus recursos peculiares.
- O projeto explica várias abordagens técnicas para entender e emular as diversas características do GS.
- É útil para quem tem interesse em emulação de PS2 e, em especial, oferece insights sobre emulação de alto desempenho com Vulkan.
1 comentários
Comentários no Hacker News