Disponibile il nuovo report sui progressi raggiunti dall’emulatore RPCS3 nel mese di aprile. RPCS3 ad oggi è l’unico programma che ci permette di emulare gran parte dei titoli commerciali della console PlayStation 3 su PC Windows e Linux.
Questo è stato un mese molto impegnativo, che ha visto il contributo da parte di molti sviluppatori regolari e da diversi collaboratori esterni arrivati da poco nel gruppo.
Importanti miglioramenti sono stati apportati all’emulazione RSX da parte del developer kd-11, con la correzione della cache per le texture e il decompilatore shader.
Nel frattempo, eladash, ha corretto una moltitudine di bug relativi alla gestione dei salvataggi e agli interpreti e ricompilatori della PPU/SPU.
Numan (alias Inviuz) ha implementato un nuovo syscall marginale necessario per la corretta esecuzione di Metal Gear Solid 4, mentre Nekotekina ha spremuto un po’ le prestazioni dal percorso SPU LLVM.
Per migliorare anche l’aspetto visivo dell’emulatore, drysalter ha creato due bellissimi temi e infine GalCiv ha ampliato il supporto per il controller DualShock 3 in Linux. Questi e molti miglioramenti hanno contribuito a rendere RPCS3 sia un software migliore che un emulatore migliore.
Oltre al seguente rapporto, ulteriori dettagli sul lavoro di Nekotekina e kd-11 durante il mese di aprile e sui contributi futuri possono essere trovati nei loro report settimanali sul Patreon.
Sommario
Questo mese RPCS3 ha raggiunto un traguardo ragguardevole nella compatibilità dei giochi, questa è la prima volta che la categoria Playable supera il 40%!
Di conseguenza, le categorie Ingame e Intro vedono un equivalente, mentre la categoria Loadable scende a soli 29 giochi. Ci stiamo anche attrezzando per intraprendere un’ulteriore manutenzione all’elenco di compatibilità identificando e unendo le voci duplicate nei prossimi mesi!
Per un aspetto più dettagliato, puoi visualizzare la pagina della cronologia per la compatibilità dei giochi che possono essere eseguiti su RPCS3.
Principali miglioramenti
Correzioni della cache Texture e miglioramenti del decompilatore shader (#5785, #5813, #5860)
Ad aprile, kd-11 ha attivato lo stato attivo per affrontare la parte del motore di tipo blit della cache delle texture. Anche con l’implementazione iniziale, più giochi hanno risposto positivamente alla maggiore accuratezza della texture e della cache di superficie in generale senza un impatto troppo grande sulle prestazioni.
kd-11 ha aggiunto altri miglioramenti insieme a quelle patch, come l’implementazione di alcuni formati compressi mancanti, lavorando per ottenere finalmente il bit casting dei dati di texture che lavorano su un bordo DEPTH_STENCIL<->COLOR
.
Per chi è interessato ai dettagli tecnici, questo è particolarmente importante dal momento che RSX non ha alcun concetto di storage delle texture (di solito è solo una comodità API per gli utenti), e la rifusione arbitraria dei pool di memoria è abbastanza comune.
Ad esempio, è possibile memorizzare una normale texture RGBA a 32 bit da qualche parte, persino renderizzarla e quindi eseguire il passaggio successivo come formato a 2×16 bit come RG_16
o RG_16FLOAT
o anche un formato di profondità come DEPTH24_STENCIL8
.
Poiché molti formati della PlayStation 3 non si adattano correttamente alle moderne schede grafiche per PC, è importante implementare un passaggio di decodifica appropriato per emulare correttamente tali formati.
kd-11 ha impostato questo con il calcolo per Vulkan, mentre OpenGL ha il vantaggio di una configurazione di pack/unpack flessibile per copie di memoria tra texture e buffer arbitrari. Questi miglioramenti hanno effetti fissi come illuminazione rotta, profondità di campo e nebbia in titoli come Uncharted 2.
In questo changeset è incluso anche un miglioramento della gestione della memoria Vulkan di RPCS3 che dovrebbe ridurre la probabilità di incontrare un buffer operativo non sufficientemente grande.
Durante il test dei miglioramenti della cache delle texture, kd-11 ha raccolto un’attività secondaria per migliorare il decompilatore shader. C’erano diversi esempi di titoli in cui hardware diverso produceva risultati estremamente variabili.
Questo include titoli come Ridge Racer 7, che era riproducibile su GPU AMD, ma un pasticcio sfarfallio con le GPU NVIDIA.
Un problema comune con l’hardware grafico è che sono spesso fondamentalmente molto diversi internamente, qualcosa che i produttori possono spesso farla franca a causa dell’accesso solo tramite API fornito ai programmatori e agli utenti finali.
Ciò significa che, a differenza di una CPU, gli stessi ingressi a una funzione potrebbero non fornire sempre gli stessi risultati su hardware diversi.
In questo caso, c’è stata una deriva aritmetica significativa nelle GPU NVIDIA in cui alcune operazioni matematiche sembrano aver funzionato a una precisione apparentemente bassa che un test comparativo con una costante fornita dal gioco stava fallendo.
L’hardware AMD e Intel era apparentemente inalterato, quindi kd-11 ha iniziato a indagare ulteriormente e ha riscontrato molti problemi simili.
Per gestire queste variazioni, kd-11 ha trascorso un’intera settimana lanciando istruzioni casuali con ingressi a cassetta d’angolo su PlayStation 3 per documentare meglio il comportamento dell’unità di elaborazione degli shader RSX.
Ciò ha prodotto maggiore accuratezza in diverse aree in cui RPCS3 stava scorrendo in modo errato molti elementi grafici e nascondeva alcuni bug difficili da correggere.
Per arrotondare la copertura del lavoro di kd-11 questo mese, ecco le immagini di confronto di Ridge Racer 7 che ora mostrano il fogliame delle GPU Nvidia e Battlefield: Bad Company non ha più luci accese sullo schermo:
kd-11 ha creato anche un framework per sfruttare le schede grafiche che offrono supporto nativo FP16 sia per migliorare l’accuratezza dell’emulazione, sia per migliorare potenzialmente le prestazioni in futuro, specialmente con le nuove GPU che supportano questa funzionalità, ad esempio Turing e Vega.
Miglioramenti di eladash (#5749, #5792, #5850)
Come con il mese scorso, eladash ha corretto così tanti bug che è quasi impossibile coprirli tutti adeguatamente, ma ecco il riassunto.
Uno degli obiettivi di eladash era quello di risolvere i problemi relativi al modo in cui RPCS3 gestiva il salvataggio. Ciò era evidente in alcuni giochi come Lord of the Rings: Conquest, in cui provava a leggere la directory savefile anche se non esisteva ancora.
Su una vera PlayStation 3, viene restituito al gioco un codice di errore che comunica che la directory non esiste.
Tuttavia, prima di questa correzione, l’emulatore non ha mai questo particolare codice di errore, quindi il gioco tenta di caricare un file di salvataggio inesistente, portando a un arresto anomalo dell’accesso e rendendo il gioco non riproducibile a meno che non si disponga già di un file di salvataggio nella directory.
Dopo aver implementato la corretta gestione di questa situazione, Lord of the Rings: Conquest e Fritz Chess sono stati risolti, il secondo passando dalla categoria Intro a Playable!
eladash ha anche affrontato una difficile condizione di gara che affligge RPCS3. Le condizioni di gara si presentano con complesse applicazioni multi-threaded come RPCS3 in cui i tempi tra le diverse parti del programma che vengono eseguite contemporaneamente sono fondamentali per il corretto funzionamento del programma.
Questo può essere causato da due thread che dipendono dagli stessi dati, o che si aspettano che i dati siano in uno stato specifico quando iniziano a lavorarci, eppure quello stato potrebbe essere alterato se inaspettatamente l’altro thread ha operato su di esso per primo.
Questi problemi sono difficili da debugare e comportano problemi come la schermata di caricamento infinita in Family Guy: Back To The Multiverse e l’impossibilità di caricare i salvataggi in Cars: Race-O-Rama.
eladash ha risolto entrambi questi problemi semplicemente rendendo il thread sleep (wait) in alcuni punti, che correggeva i tempi.
Il prossimo obiettivo di eladash è stato il miglioramento degli interpreti e dei ricompilatori di PPU e SPU. Ciò include la correzione delle istruzioni gestite in modo errato, ottenendo che tutti questi diversi decodificatori si comportino in modo più simile, ottenendo in alcuni casi piccoli miglioramenti delle prestazioni.
Questo ha risolto il rendering dell’orb nella schermata del menu di SoulCalibur IV con l’Interprete PPU Preciso, la schermata nera e si blocca in Sonic Unleashed e rende il Recompiler PPU LLVM più preciso e più vicino all’interprete PPU.
Infine, esaminiamo come ha corretto la gestione del SIMD con le istruzioni di saturazione su entrambi i decoder PPU Fast and Precise.
Quando decodificano queste istruzioni SIMD, iteriamo su tutti gli elementi singolarmente, applichiamo l’istruzione e scriviamo i risultati nell’elemento appropriato del registro di destinazione.
Quest’ultima parte tuttavia causa problemi quando il registro di destinazione è anche uno dei registri di origine, poiché ora stiamo sovrascrivendo il registro di origine, corrompendo i dati per l’elemento successivo.
La soluzione era semplice: basta usare una variabile temporanea come destinazione e copiarla nel registro di destinazione vero e proprio alla fine. Questo risolve in modo specifico l’icona di caricamento in Beyond Two Souls.
Supporto iniziale sys_overlay (#4007)
Molti di voi probabilmente hanno sentito dell’implementazione di Numan (alias Inviuz) dell’infame syscall sys_overlay, usato (per quanto ne sappiamo) esclusivamente da Metal Gear Solid 4.
Da quando Numan ha aperto questa richiesta di pull alla fine del 2017, tutti nella comunità hanno atteso con impazienza che si unisca e ora finalmente è successo!
Sebbene si sia parlato abbastanza spesso, e anche preso in giro in questo vecchio rapporto sui progressi, qui è ancora un breve riassunto per chi non lo sapesse:
Le syscall sono funzioni fornite dal sistema operativo della PlayStation 3, che agiscono come un modo per i programmi di interagire con il sistema.
Esistono molte syscall per tutto, dall’allocazione della memoria alla comunicazione con i dispositivi USB, e mentre RPCS3 implementa molte di esse, alcune sono ancora mancanti.
Una di queste syscall mancanti era sys_overlay, che non è stato implementato fino ad ora a causa di non avere praticamente nessuna documentazione sulle sue funzionalità e utilizzato da un solo gioco.
Questa syscall offre ai giochi un modo speciale per caricare file self esterni e viene utilizzato da Metal Gear Solid 4 per avviare uno stage arcade PS1.
Ora che è implementato, siamo un passo avanti verso l’avvio di Metal Gear Solid 4. Sfortunatamente, c’è ancora molto da fare fino a quando ciò non accadrà, ma ci sono delle correzioni nei lavori dei nostri sviluppatori, quindi rimanete sintonizzati!
Miglioramenti delle prestazioni di SPU LLVM (#5882)
Di seguito sono riportati alcuni miglioramenti delle prestazioni necessari al programma di ricompilazione SPU LLVM di Nekotekina.
Utilizzato un trucco per ottimizzare il passaggio di LLVM LICM (loop-invariant code motion), ottenendo fino al 10% di miglioramento in FPS in molti giochi quando si utilizza xfloat accurato. Approssimativamente xfloat non è stato influenzato da questo cambiamento.
Per capire come Nekotekina abbia raggiunto questo obiettivo, dobbiamo prima capire che cosa fa la LICM. In poche parole, controlla tutti i loop del codice per le parti che non cambiano (loop-invariant) e le sposta fuori dal loop (movimento) in modo che non vengano eseguite inutilmente più e più volte.
Questo può essere un importante fattore di ottimizzazione in alcuni casi, tuttavia LLVM non applica sempre perfettamente questo passaggio.
Per questo motivo, Nekotekina ha deciso di migliorare questo rimpiazzando alcune istruzioni che hanno impedito a LLVM di identificare correttamente queste sezioni invarianti di loop con alcune istruzioni fittizie che non interferiscono con il passaggio della LICM.
Quindi, dopo che LLVM ha fatto il suo lavoro, possiamo ancora una volta sostituire quelle istruzioni fittizie con quelle reali, lasciando il codice funzionalmente equivalente, ma meglio ottimizzato.
Nuovi temi Skyline e Envy (#5789, #5884)
Per quelli che non ne erano ancora a conoscenza, RPCS3 ha dato agli utenti la possibilità di personalizzare l’aspetto dell’emulatore per un po’ di tempo e da allora alcuni temi personalizzati sono stati aggiunti al roster.
Questo mese, due nuovi fantastici temi sono stati aggiunti da drysalter nel suo primo contributo per RPCS3. Il tema Envy sfoggia un design neon completamente nuovo che offre agli utenti un altro tema scuro da utilizzare mentre i temi Skyline sono ispirati alla combinazione di colori di DAGINATSUO del sito Web e sono disponibili in due varianti: Standard e Nightfall.
Puoi trovare questi e altri temi interessanti navigando su Config> GUI> UI> Fogli di stile . Basta sceglierne uno, fare clic su Applica e vedere immediatamente RPCS3 sotto una nuova luce!
Supporto DualShock 3 su Linux (#5888)
Infine, diamo una rapida occhiata ai miglioramenti di GalCiv (alias RipleyTom) al gestore di pad nativo DualShock 3.
Come spiegato nel report dello scorso mese, GalCiv ha implementato un gestore di pad DualShock 3 nativo che consente l’emulazione di funzioni quali pulsanti sensibili alla pressione e controlli di movimento in RPCS3 quando si utilizza il controller DualShock 3.
Sebbene questo cambiamento sia stato ben accolto, l’implementazione è stata purtroppo limitata in Windows, in quanto l’uso di driver USB generici richiedeva una considerazione speciale su Linux.
GalCiv, non volendo lasciare il lavoro a metà, ha cercato di implementare lo stesso driver su Linux quando ha fatto una rivelazione interessante.
Il kernel Linux ha i driver per il controller integrato DualShock 3. Ciò consente il supporto diretto per il controller senza la necessità di soluzioni utilizzate su Windows.
Approfittando dello stesso, GalCiv ha implementato un gestore DualShock 3 su Linux utilizzando questo driver, fornendo l’intera gamma di funzioni come pulsanti sensibili alla pressione e controlli di movimento tramite USB o Bluetooth senza l’utilizzo di dispositivi di terze parti.
Affascinante vedere cosa è iniziato come deficienza trasformarsi in un’altra clamorosa vittoria per il team Pingu!
Giochi
Sonic Unleashed
Grazie ai miglioramenti di Eladash per il ricompilatore PPU LLVM, questo gioco non si blocca più durante le fasi notturne e quando si fanno rapidi passi. Le prestazioni sono notevolmente migliorate durante le fasi notturne, ma è ancora troppo lento per essere considerato giocabile. Guarda i video dal nostro canale YouTube ufficiale qui sotto:
Giochi NCAA
Iniziamo con alcuni giochi sportivi. NCAA Football 09 e NCAA Football 10, due titoli sul football sono ora giocabili questo mese. Entrambi i giochi funzionano bene con una buona resa grafica e prestazioni.
Giochi Madden
Madden NFL 11 è il primo gioco della serie Madden ad essere stato spostato nella categoria Giocabile dopo che Nekotekina ha corretto alcune regressioni questo mese, mentre Madden NFL 13 e Madden NFL 09 sono ora nella categoria Ingame.
Giochi NBA
La maggior parte dei giochi NBA, ad esempio NBA 2K7 e NBA 2K8, stanno entrando ingame per la prima volta. Tuttavia, entrambi i titoli sono troppo lenti per essere considerati giocabili a questo punto.
Giochi MLB
Passando ai giochi di baseball, MLB 08: The Show e MLB Front Office Manager sono diventati entrambi giocabili questo mese.
Altri miglioramenti
Ci sono state numerose altre richieste di pull unite durante il mese che non sono riuscite a raggiungere la sezione Major Improvements.
Abbiamo raccolto un elenco di tutti questi miglioramenti qui e abbiamo allegato una breve panoramica a ciascuno di essi.
Assicurati di controllare i link forniti, dato che le pagine GitHub di solito rivelano ulteriori dettagli, così come i cambiamenti del codice stesso. Per vedere l’elenco completo delle richieste di pull direttamente su GitHub, clicca qui.
Potrete scaricare la versione più recente dell’emulatore collegandovi a questo indirizzo per PC Windows e Linux. Se vi piace potrete anche contribuire allo sviluppo con una piccola donazione sul Patreon.
Fonte: rpcs3.net