Principe de recompilation statique

Le projet ps2-web-recomp analyse l’exécutable EE (Emotion Engine) d’un jeu PS2, suit son flux de contrôle et génère du C++ à raison de blocs de 16 KiB de code invité. Le code produit conserve les particularités du processeur R5900 : registres de 128 bits, instructions multimédia, slots de retard de branche et un FPU qui ne possède ni infinities ni denormals et qui arrondit différemment de l’IEEE. Les sauts entre blocs sont traduits en tail calls et le changement de thread se traduit par le déroulement de la pile hôte avant de reprendre à l’adresse invitée, évitant ainsi la création d’une pile par fil invité.

Émulation du kernel PS2

Le côté EE du système d’exploitation est reproduit par une émulation de haut niveau : gestion des threads, sémaphores, interruptions du contrôleur DMA et du vertical blank, alarmes et canal SIF qui relie le CPU principal au processeur d’E/S (IOP). L’IOP exécute les modules IRX du jeu (pilote son, streaming disque, contrôleur) via un interpréteur du CPU R3000, tandis que les bibliothèques appelées par ces modules sont ré‑implémentées en C++. Le disque est servi par des requêtes HTTP Range, ce qui ne télécharge que l’exécutable au démarrage.

Gestion des unités vectorielles et rendu WebGPU

La majeure partie du rendu 3D d’un titre PS2 réside dans les microprogrammes uploadés sur l’unité vectorielle 1. Ces programmes sont traduits à l’avance en code SIMD C++ ; lorsqu’un nouveau microprogramme apparaît, il est compilé en module WebAssembly en quelques millisecondes. Le Graphics Synthesizer (GS) de 4 MiB est mappé dans la mémoire GPU native, conservant les dispositions « swizzled ». Le dessin s’effectue via des compute shaders WebGPU : les triangles sont triés en tuiles, rasterisés selon les règles du GS (texturation, palettes, alpha‑blending, tests de profondeur). Le rendu peut être affiché à la résolution native, à deux ou trois fois celle‑ci, tout en restant dans la mémoire du GS, ce qui garantit la fidélité des effets qui réutilisent le framebuffer comme palette.

Performances observées

Le premier titre porté, Gran Turismo 4, atteint 50 fps en PAL sur Chrome, avec une résolution doublée par rapport à la console, grâce à un GPU intégré de laptop. God of War II tourne à 60 fps à la résolution PS2 et entre 48 et 60 fps lorsqu’on double la résolution, limité par le même GPU intégré. Aucun code spécifique au jeu n’a été requis, mais deux bugs ont été découverts : un dans le recompilateur et un dans le timing de l’unité vectorielle, ainsi que des lacunes dans l’émulation de l’IOP. Le système conserve la capacité de sauvegarder sur une carte mémoire virtuelle stockée dans le navigateur.