2 pontos por GN⁺ 2024-09-03 | 1 comentários | Compartilhar no WhatsApp

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

 
GN⁺ 2024-09-03
Comentários no Hacker News
  • Fico me perguntando o que significa a sigla "GS"
  • Rezei por blending programável
    • Também rezei por decodificação de textura programável desde o começo dos anos 2000, quando aprendi pixel shaders pela primeira vez
    • A GPU acabou adotando ray tracing primeiro
    • Blending programável substituiria blocos de função fixa
    • Ainda estou esperando por texture shaders
  • O barramento do GS era muito largo, com 2560 bits
    • O PS3 parecia inferior ao GS em termos de blending
  • Espero que alguém reescreva o dynarmic e publique um post no blog sobre isso
  • Fico me perguntando como essa abordagem se compara ao ubershader do Dolphin
  • Fico me perguntando o que significa "top-left raster"