PCSX ReARMed now has dynarec support across multiple platforms!

If you can recall, a few days ago, Beetle PSX gained a dynamic recompiler based on Lightrec/GNU Lightning. We are happy to inform you that the latest version of PCSX ReARMed now available on the buildbot also has Lightrec support enabled for x86 (32bit and 64bit) and Aarch64 (64bit ARM).

How to get it

There are two ways to update your PCSX ReARMed core:

a – If you have already installed the core before, you can go to Online Updater and select ‘Update Installed Cores’.

b – If you haven’t installed the core yet, go to Online Updater, ‘Core Updater’, and select ‘PCSX ReARMed’ from the list. It will then download and install this core.

So what has changed?

Before, PCSX ReARMed only had a dynamic recompiler for 32bit ARM-based systems. Every other CPU architecture would instead have to revert to a CPU interpreter core. This mean that for every other achitecture, it would be far slower than the optimized 32bit ARM versions.

What has changed now is that x86 (32bit and 64bit) and Aarch64 (64bit ARM) now use the Lightrec dynamic recompiler. ARM 32bit will still use the Ari64 dynamic recompiler because it just happens to be much faster than Lightrec.

Other things important of note – the 32bit ARM version uses a different renderer, NEON GPU renderer. All the other versions use P.E.Op.S. Soft GPU. NEON GPU Plugin has an enhanced resolution which gives you a 4x upscaling, while P.E.Op.S. Soft GPU doesn’t have any such feature. We’d like to bring the NEON GPU Renderer over to the other platforms but right now, the C codepaths are pretty bad compared to the optimized 32bit ARM NEON codepaths. It would require a lot of work to bring it up to par and get rid of the graphics glitches, so Pete’s Soft it is for now.

Current limitations

  • Right now it won’t work with the HLE BIOS feature. The dynamic recompiler only works right now with a real BIOS.
  • Runahead won’t work reliably right now.
  • Right now, Lightrec in PCSX ReARMed uses the Cycle Timing Check mode. If you can recall from our earlier article on Beetle PSX, this is a dynarec mode with additional cycle timing checks, which makes it significantly slower than the ‘Max performance’ mode. Hopefully PCSX ReARMed can eventually use the ‘Max Performance’ mode soon, giving us an additional speed boost.

We hope these issues can be resolved soon.

Performance tests

Test hardware: Desktop PC – Core i7 7700k, Windows 10

Game Interpreter (No Dithering) Interpreter (With Dithering) Dynarec (No Dithering) Dynarec (With Dithering)
Final Doom 246fps 245fps 621fps 616fps
Resident Evil 250fps 248fps 642fps 639fps
Tekken 3 190fps 175fps 279fps 250fps

Beetle PSX Dynarec Update – Switch alpha port plus runahead support – lower latency than original hardware!

As an addendum to our earlier Beetle PSX dynarec post, a lot has changed in a couple of days:

  • Several important bugfixes have been pushed for ARM v7/AArch64. This should benefit Android users and ARM Linux SBC users.
  • Runahead support is finally working
  • Alpha release Switch version now available

Runahead support – lower latency than original hardware

Runahead is one of RetroArch’s crowning features as a frontend ever since we debuted this revolutionary feature in 2018.

Most systems more complex than the Atari 2600 will display a reaction to input after one or two frames have already been shown. For example, Super Mario Bros on the NES always has one frame of input latency on real hardware. Super Mario World on SNES has two frames of latency.

Runahead allows RetroArch to “remove” this baked-in latency by running multiple instances of a core simultaneously, and quickly emulating multiple frames at a time if input changes. This strategy has some analogs to frame rollback, similar to how GGPO handles high-lag connections. For it to work reliably, you need to figure out the amount of lag frames a game has, and then set Runahead frame count to that value. When done correctly, not only can you eliminate any perceptible lag, you can actually achieve latency that is quantifiably lower than when played on the original hardware [yes, with a CRT]. Surely that is the stuff of miracles on display technologies that have inherent far higher latency than any CRT screen, plus all the added additional latency of modern day PC OSes on top of the typical overhead brought about by emulators.

So up until now, runahead was not possible on Beetle PSX. Why not? For one, runahead relies on savestates. If serialization and savestates are well implemented, runahead can be used on a libretro core. Second, for runahead to run at fullspeed at any amount of frames, your hardware has to meet the demands of running a game at well above fullspeed. So the lower the FPS, the less conducive that core will be for runahead purposes even IF savestates are well implemented.

A couple of days ago, runahead would not work with the dynarec. This required some modifications. Zach Cook has since managed to fix these issues, and now we can use runahead just fine.

How to use it

First, make sure that you set Hardware Renderer to ‘Software’. Unless you are using a very high end CPU from the last two years, we recommend you leave Internal GPU Resolution at 1x. Combining the dynarec with runahead is a very CPU intensive task. You need all the headroom you can get.

To tinker with runahead settings, go to Quick Menu -> Latency.

Enable ‘Run-Ahead To Reduce Latency’, and set ‘Number of Frames To Run Ahead’ to a value of your choosing. For runahead to run as intended, this value shold match the amount of lag frames of the game.

NOTE: ‘Runahead Use Second Instance’ can give a big performance improvement. Consider always enabling it unless you have reason not to (for instance, some game related issue requires you disable it for whatever reason)

Alpha Switch version available

m4xw has done a quick port of Beetle PSX with the dynarec to the Switch port. He has already uploaded a build that you can try – you’ll have to pass the time with this core until we start deploying this on the buildbot properly.

To use this, extract the contents of this archive into /retroarch/cores/ (assuming RetroArch is already installed).

Performance has dramatically improved over interpreter before – just as an indication, Pepsi Man reportedly runs at fullspeed at 2x software rendering. But be sure to put this build through its paces yourself!