2 puntos por GN⁺ 2024-09-03 | 1 comentarios | Compartir por WhatsApp

Emulación del GS de PlayStation 2 – la frontera final de la emulación por cómputo con Vulkan

  • En 2020, escribió paraLLEl-RDP para implementar el RDP de N64 con cómputo en Vulkan. Era muy rápido, preciso y también se añadió soporte de escalado.
  • Esto llevó a imaginar un proyecto similar para PlayStation 2. Hasta ahora, GSdx había sido el estándar durante 20 años.
  • paraLLEl-GS no es la primera implementación por cómputo del GS de PS2. Ya hubo un intento en 2014 con OpenCL, pero no se completó.

Panorama básico del GS

El GS es un monstruo del procesamiento de píxeles

  • El GS es famoso por su enorme fillrate y ancho de banda. En 2000 podía procesar más de mil millones de píxeles por segundo.
  • La VRAM es pequeña, pero fue diseñada para mantenerse en streaming constante usando varios motores DMA.

El pipeline de píxeles del GS es básico, pero peculiar

  • El GS es más simple que el RDP de N64. Tiene una sola textura y un combinador de un solo ciclo.
  • El blending puede superar 1.0. 0x80 se trata como 1.0 y puede llegar hasta un máximo de 0xff.
  • Tiene varias funciones extrañas, como prueba de alfa de destino, blending condicional y corrección de alfa.

Reglas de rasterización estilo D3D9

  • Los primitivos se entregan en una forma simple dentro del espacio de clip. La unidad VU1 se encarga de la transformación y el clipping.
  • X/Y: punto fijo 12.4, Z: uint de 24 o 32 bits, FOG: uint de 8 bits, RGBA: 8 bits, STQ: texturizado en perspectiva con coordenadas normalizadas.

Cola de vértices

  • El GS se siente parecido a OpenGL 1.0. Soporta TRIANGLE_FAN.
  • Las escrituras al registro XYZ fijan el estado del vértice y hacen avanzar la cola.

Formatos de swizzling curiosos

  • Al renderizar en color o profundidad de 24 bits, se pueden usar los 8 bits superiores como textura.
  • Las coordenadas de píxel se organizan en “páginas”. Las páginas son de 8 KiB y se subdividen en 32 bloques.

Caché de framebuffer y caché de texturas

  • Hay cachés dedicadas para renderizado al framebuffer y para texturas. Los juegos suelen hacer bucles de retroalimentación.

Texturizado

  • El texturizado es familiar, pero a la vez arcano. El centro del texel está en medio píxel.
  • Hay modos especiales de direccionamiento como REGION_CLAMP y REGION_REPEAT.

CLUT

  • Hay una caché de 1 KiB que almacena la paleta actual. Se necesita un paso explícito de copia desde la VRAM hacia la caché CLUT.

TEXFLUSH

  • Existe un comando para sincronizar e invalidar la caché de texturas. Se opta por ignorar TEXFLUSH y usar un caché mínimo.

Manipulación de registros con GIF

  • La interacción con el hardware GS se hace a través de GIF. La cabecera de un paquete GIF define a qué registros se escribe y cuántos bucles hay.

Trongle – GS

  • Una API para quienes extrañan la simplicidad de OpenGL 1.0.
  • Se añadió una herramienta que genera el formato de volcado .gs con fines de prueba.

Detalles de implementación

Pipeline de renderizado

  • Sincronización de datos del CPU hacia la VRAM, carga de datos a la VRAM, actualización de la caché CLUT, unswizzling desde la VRAM hacia VkImages, renderizado, sincronización de la VRAM desde la GPU al CPU.

Rastreador de páginas

  • La VRAM se divide y se rastrea por páginas. Se sigue el estado de cada página para manejar riesgos potenciales.

Caché de texturas

  • Cada página tiene una lista de VkImages asociadas. Si la textura de una página se invalida, la imagen se destruye y se vuelve a hacer unswizzling desde la VRAM.

Actualización de CLUT

  • Para agrupar las cargas de texturas, también se agrupan las cargas de CLUT. Se usan 1024 snapshots de CLUT.

Unswizzling de texturas desde la VRAM

  • Se usa Vulkan para asignar una nueva VkImage y procesarla con un compute shader.

Configuración y binning de triángulos

  • Igual que paraLLEl-RDP, es un renderizador basado en tiles. Proporciona arreglos de atributos para la configuración de triángulos.

Resumen de GN⁺

  • Este artículo trata sobre la emulación del GS de PlayStation 2, con énfasis en una implementación usando compute shaders de Vulkan.
  • El GS de PS2 es difícil de emular debido a su complejo pipeline de píxeles y sus funciones peculiares.
  • El proyecto explica varias características del GS y distintos enfoques técnicos para emularlas.
  • Es útil para quienes se interesan en la emulación de PS2, especialmente por las ideas que ofrece sobre emulación de alto rendimiento con Vulkan.

1 comentarios

 
GN⁺ 2024-09-03
Comentarios en Hacker News
  • Tiene curiosidad por saber qué significa la abreviatura "GS"
  • Rezó por blending programable
    • También rezó por decodificación de texturas programable desde principios de los 2000, cuando aprendió por primera vez sobre pixel shaders
    • La GPU terminó adoptando ray tracing primero
    • El blending programable reemplaza los bloques de función fija
    • Sigue esperando los texture shaders
  • El bus del GS era extremadamente ancho, de 2560 bits
    • El PS3 se sentía inferior al GS en términos de blending
  • Espera que alguien reescriba dynarmic y publique una entrada de blog al respecto
  • Tiene curiosidad por cómo se compara este enfoque con el ubershader de Dolphin
  • Tiene curiosidad por lo que significa "top-left raster"