2 points par GN⁺ 2024-09-03 | 1 commentaires | Partager sur WhatsApp

Émulation du GS de la PlayStation 2 – la dernière frontière de l’émulation compute avec Vulkan

  • En 2020, l’auteur a écrit paraLLEl-RDP pour implémenter le RDP de la N64 en compute Vulkan. Le résultat était très rapide, précis, avec en plus la prise en charge de l’upscaling.
  • Cela l’a amené à envisager un projet similaire pour la PlayStation 2. Jusqu’à présent, GSdx faisait figure de standard depuis 20 ans.
  • paraLLEl-GS n’est pas la première implémentation compute du GS de la PS2. Une tentative en OpenCL avait déjà eu lieu en 2014, sans jamais être achevée.

Vue d’ensemble de base du GS

Le GS est un monstre du traitement de pixels

  • Le GS est réputé pour son fill rate et sa bande passante énormes. En 2000, il pouvait traiter plus d’un milliard de pixels par seconde.
  • La VRAM est petite, mais conçue pour être alimentée en continu via divers moteurs DMA.

Le pipeline de pixels du GS est basique, mais atypique

  • Le GS est plus simple que le RDP de la N64. Il dispose d’une texture unique et d’un combineur mono-cycle.
  • Le blending peut dépasser 1.0. 0x80 est traité comme 1.0 et peut monter jusqu’à 0xff.
  • Il existe diverses fonctions inhabituelles, comme le test d’alpha de destination, le blending conditionnel et la correction d’alpha.

Règles de rastérisation de style D3D9

  • Les primitives sont fournies sous une forme simple dans l’espace de clip. L’unité VU1 effectue les transformations et le clipping.
  • X/Y : virgule fixe 12.4, Z : uint 24 bits ou 32 bits, FOG : uint 8 bits, RGBA : 8 bits, STQ : texturing en perspective avec coordonnées normalisées.

File de sommets

  • Le GS donne une impression proche d’OpenGL 1.0. Il prend en charge TRIANGLE_FAN.
  • L’écriture dans le registre XYZ fige l’état du sommet et fait avancer la file.

Formats de swizzling intéressants

  • Lors d’un rendu en couleur 24 bits ou en profondeur, les 8 bits de poids fort peuvent être utilisés comme texture.
  • Les coordonnées de pixels sont organisées en « pages ». Une page fait 8 KiB et est subdivisée en 32 blocs.

Cache de framebuffer et cache de textures

  • Il existe des caches dédiés pour le rendu framebuffer et pour les textures. Les jeux utilisent souvent des boucles de rétroaction.

Texturing

  • Le texturing est à la fois familier et ésotérique. Le centre des texels se situe à un demi-pixel.
  • Il existe des modes d’adressage spéciaux comme REGION_CLAMP et REGION_REPEAT.

CLUT

  • Un cache de 1 KiB stocke la palette courante. Une étape explicite de copie de la VRAM vers le cache CLUT est nécessaire.

TEXFLUSH

  • Une commande permet de synchroniser et d’invalider le cache de textures. L’auteur choisit d’ignorer TEXFLUSH et d’opter pour un cache minimal.

Manipulation des registres via le GIF

  • L’interaction avec le matériel GS se fait via le GIF. L’en-tête des paquets GIF définit les registres à écrire ainsi que le nombre de boucles.

Trongle – GS

  • Une API destinée à ceux qui regrettent la simplicité d’OpenGL 1.0.
  • Un outil a été ajouté pour générer le format de dump .gs à des fins de test.

Détails d’implémentation

Pipeline de rendu

  • Synchronisation des données du CPU vers la VRAM, upload des données vers la VRAM, mise à jour du cache CLUT, unswizzling de la VRAM vers des VkImages, rendu, synchronisation de la VRAM du GPU vers le CPU.

Suivi des pages

  • La VRAM est suivie page par page. L’état des pages est tracé pour gérer les risques potentiels.

Cache des textures

  • Chaque page possède une liste de VkImages associées. Quand la texture d’une page est invalidée, l’image est détruite puis de nouveau unswizzlée depuis la VRAM.

Mise à jour du CLUT

  • Pour batcher les uploads de textures, les uploads de CLUT sont eux aussi batchés. 1024 instantanés de CLUT sont utilisés.

Unswizzling des textures depuis la VRAM

  • Vulkan est utilisé pour allouer un nouveau VkImage et le traiter via un compute shader.

Configuration et binning des triangles

  • Comme paraLLEl-RDP, il s’agit d’un moteur de rendu basé sur des tuiles. Des tableaux d’attributs sont fournis pour la configuration des triangles.

Résumé de GN⁺

  • Cet article traite de l’émulation du GS de la PlayStation 2, avec un accent particulier sur une implémentation utilisant des compute shaders Vulkan.
  • Le GS de la PS2 est difficile à émuler en raison de son pipeline de pixels complexe et de ses fonctions atypiques.
  • Ce projet explique différentes approches techniques pour comprendre et émuler les diverses caractéristiques du GS.
  • Utile pour les personnes intéressées par l’émulation PS2, il offre notamment des éclairages sur l’émulation haute performance avec Vulkan.

1 commentaires

 
GN⁺ 2024-09-03
Commentaires Hacker News
  • Se demande ce que signifie l’abréviation « GS »
  • Espérait du blending programmable
    • Attend aussi un décodage de textures programmable depuis qu’il a appris les pixel shaders au début des années 2000
    • Les GPU ont adopté le ray tracing en premier
    • Le blending programmable consiste à remplacer les blocs à fonction fixe
    • Attend toujours les texture shaders
  • Le bus du GS était extrêmement large, à 2560 bits
    • La PS3 donnait l’impression d’être inférieure au GS sur le plan du blending
  • Espère que quelqu’un réécrira dynarmic et en fera un billet de blog
  • Se demande comment cette approche se compare à l’ubershader de Dolphin
  • Se demande ce que signifie « top-left raster »