2 Punkte von GN⁺ 2024-09-03 | 1 Kommentare | Auf WhatsApp teilen

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

 
GN⁺ 2024-09-03
Hacker-News-Kommentare
  • Ich frage mich, wofür die Abkürzung „GS“ steht
  • Ich habe für programmierbares Blending gebetet
    • Seit ich in den frühen 2000ern zum ersten Mal Pixel-Shader gelernt habe, habe ich auch für programmierbare Texturdekodierung gebetet
    • GPU hat Raytracing zuerst eingeführt
    • Programmierbares Blending ersetzt Fixed-Function-Blöcke
    • Ich warte immer noch auf Texture Shader
  • Der Bus des GS war mit 2560 Bit extrem breit
    • Bei Blending fühlte sich die PS3 dem GS unterlegen an
  • Ich hoffe, dass jemand dynarmic neu schreibt und darüber einen Blogpost verfasst
  • Ich frage mich, wie sich dieser Ansatz mit Dolphins Ubershader vergleichen lässt
  • Ich frage mich, was „top-left raster“ bedeutet