PlayStation-2-GS-Emulation – die letzte Grenze der Vulkan-Compute-Emulation
- 2020 wurde paraLLEl-RDP geschrieben und der N64-RDP mit Vulkan Compute implementiert. Das war sehr schnell und präzise, außerdem kam Unterstützung für Upscaling hinzu.
- Dadurch entstand die Idee für ein ähnliches Projekt für die PlayStation 2. Bis heute war GSdx 20 Jahre lang der Standard.
- paraLLEl-GS ist nicht die erste Compute-Implementierung des PS2-GS. 2014 gab es bereits einen Versuch mit OpenCL, der jedoch nicht abgeschlossen wurde.
Grundlegender Überblick über den GS
Der GS ist ein Monster bei der Pixelverarbeitung
- Der GS ist für seine enorme Fillrate und Bandbreite bekannt. Im Jahr 2000 konnte er mehr als 1 Milliarde Pixel pro Sekunde verarbeiten.
- Der VRAM ist klein, wurde aber so ausgelegt, dass er mithilfe verschiedener DMA-Engines kontinuierlich gestreamt wird.
Die Pixel-Pipeline des GS ist einfach, aber eigenwillig
- Der GS ist einfacher als der N64-RDP. Er besitzt eine einzelne Textur und einen Single-Cycle-Combiner.
- Blending kann über 1.0 hinausgehen. 0x80 wird als 1.0 behandelt und kann bis maximal 0xff reichen.
- Es gibt viele ungewöhnliche Funktionen wie Destination-Alpha-Test, bedingtes Blending und Alpha-Korrektur.
Raster-Regeln im D3D9-Stil
- Primitive werden in einfacher Form im Clip-Space bereitgestellt. Die VU1-Einheit übernimmt Transformation und Clipping.
- X/Y: 12.4 Fixed-Point, Z: 24-Bit- oder 32-Bit-uint, FOG: 8-Bit-uint, RGBA: 8-Bit, STQ: perspektivische Texturierung mit normalisierten Koordinaten.
Vertex-Queue
- Der GS fühlt sich ähnlich wie OpenGL 1.0 an.
TRIANGLE_FAN wird unterstützt.
- Schreibzugriffe auf das XYZ-Register fixieren den Vertex-Zustand und schieben die Queue weiter.
Interessante Swizzling-Formate
- Beim Rendern mit 24-Bit-Farbe oder -Tiefe können die oberen 8 Bit als Textur verwendet werden.
- Pixelkoordinaten sind in „Pages“ angeordnet. Eine Page ist 8 KiB groß und in 32 Blöcke unterteilt.
Framebuffer-Cache und Textur-Cache
- Es gibt dedizierte Caches für Framebuffer-Rendering und Texturen. Spiele verwenden häufig Feedback-Loops.
Texturierung
- Die Texturierung ist vertraut und zugleich arkane. Texel-Zentren liegen auf halben Pixeln.
- Es gibt spezielle Adressierungsmodi wie
REGION_CLAMP und REGION_REPEAT.
CLUT
- Es gibt einen 1-KiB-Cache zum Speichern der aktuellen Palette. Ein expliziter Kopierschritt vom VRAM in den CLUT-Cache ist erforderlich.
TEXFLUSH
- Es gibt einen Befehl zum Synchronisieren und Invalidieren des Textur-Caches. TEXFLUSH wird ignoriert und stattdessen minimales Caching gewählt.
Registersteuerung über GIF
- Mit GIF wird mit der GS-Hardware interagiert. Der Header eines GIF-Pakets legt Zielregister und Anzahl der Schleifen fest.
Trongle – GS
- Eine API für alle, die die Einfachheit von OpenGL 1.0 vermissen.
- Für Testzwecke wurde ein Tool zum Erzeugen des
.gs-Dump-Formats hinzugefügt.
Implementierungsdetails
Rendering-Pipeline
- Datensynchronisierung von der CPU zum VRAM, Daten-Upload in den VRAM, Aktualisierung des CLUT-Caches, Unswizzling vom VRAM in VkImages, Rendering, VRAM-Synchronisierung von der GPU zur CPU.
Page-Tracker
- Der VRAM wird in Pages aufgeteilt und auf dieser Basis nachverfolgt. Page-Zustände werden verfolgt, um potenzielle Hazards zu behandeln.
Textur-Caching
- Jede Page hat eine Liste zugehöriger VkImages. Wenn die Textur einer Page invalidiert wird, wird das Image zerstört und erneut aus dem VRAM unswizzled.
CLUT-Aktualisierung
- Um Textur-Uploads zu bündeln, werden auch CLUT-Uploads gebündelt. Es werden 1024 CLUT-Snapshots verwendet.
Textur-Unswizzling aus dem VRAM
- Mit Vulkan wird ein neues VkImage allokiert und per Compute-Shader verarbeitet.
Triangle-Setup und Binning
- Wie paraLLEl-RDP ist auch dies ein Tile-basierter Renderer. Für das Triangle-Setup wird ein Attribut-Array bereitgestellt.
Zusammenfassung von GN⁺
- Dieser Artikel behandelt die Emulation des GS der PlayStation 2 und konzentriert sich insbesondere auf eine Implementierung mit Vulkan-Compute-Shadern.
- Der PS2-GS ist wegen seiner komplexen Pixel-Pipeline und seiner ungewöhnlichen Funktionen schwer zu emulieren.
- Das Projekt beschreibt verschiedene technische Ansätze, um die unterschiedlichen Eigenschaften des GS zu verstehen und zu emulieren.
- Für alle, die sich für PS2-Emulation interessieren, ist dies nützlich und bietet insbesondere Einblicke in Hochleistungs-Emulation mit Vulkan.
1 Kommentare
Hacker-News-Kommentare