paraLLEl N64 RDP – Android support and Intel iGPU improvements – What you should know (and what to expect)

Ridge Racer 64 running on Parallel RDP on an Android phone (with RetroArch)
Ridge Racer 64 running on Parallel RDP on an Android phone (with RetroArch)

Themaister wrote an article a few days ago talking in-depth about all the work that has gone into ParaLLEl RDP since launch.

Two of the important things discussed in this article were:
* Intel iGPU performance
* Android support

What you might not have realized from reading the article is that with the right tweaks, you can already get ParaLLEl RDP to run reasonably well. As indicated in the article he wrote, Themaister will be looking at WSI Vulkan issues specifically related to RetroArch since there definitely do seem to be some issues that have to be resolved. In the meantime, we have to resort to some workarounds. Workarounds or not, they will do the job for now.

How to install and set it up

  • In RetroArch, go to Online Updater.
  • (If you have paraLLEl N64 already installed) – Select ‘Update Installed Cores’. This will update all the cores that you already installed.
  • (If you don’t have paraLLEl N64 installed already) – go to ‘Core Updater’, and select ‘Nintendo – Nintendo 64 (paraLLEl N64)’.
  • Now start up a game with this core.
    Go to the Quick Menu and go to ‘Options’. Scroll down the list until you reach ‘GFX Plugin’. Set this to ‘parallel’. Set ‘RSP plugin’ to ‘parallel’ as well.
  • For the changes to take effect, we now need to restart the core. You can either close the game or quit RetroArch and start the game up again.

Intel iGPU

What you should do for optimum performance right now:

  • For Intel iGPU, I have found that what makes the biggest difference by far (on Windows 10 at least) is to run it in windowed mode instead of fullscreen. Fullscreen mode will have horribly crippled performance by comparison.

Performance

Once you have done this, the performance will actually not be that far behind with a run-off-the-mill iGPU from say a 2080 Ti (in asynchronous mode). Sure, it’s still a bit slower by about ~30fps, but it’s no longer the massive gulf in performance it was before where even Angrylion was beating ParaLLEl RDP in the performance department.

With synchronous, the difference between say a 2080 Ti and an iGPU should be a bit more pronounced.

Hopefully in future RetroArch versions, it will no longer be necessary to have to resort to windowed mode for good performance with Intel iGPUs. For now, this workaround will do.

Android

What you should do for optimum performance right now:

  • Turn vsync off. Go to Settings -> Video -> Synchronization, and make sure that ‘Vertical Sync (Vsync)’ is disabled.

NOTE: It is imperative that you turn V-Sync off for now. If not, performance will be so badly crippled that even Angrylion will be faster by comparison. Fortunately, there will be no noticeable screen tearing even with Vsync disabled right now.

Performance

I tested ParaLLEl RDP on two devices:

  • Nvidia Shield TV (2015)
  • Samsung Galaxy S10 Plus (2019) [European Exynos model]

NOTE: The European model of the Galaxy S10 Plus used here has the Samsung Exynos SoC (System-On-A-Chip). Generally these perform worse than the US models of the Galaxy phones, which use a Qualcomm Snapdragon SoC instead. You should therefore expect significantly better performance on a US model.

Performance on Shield TV

Here are some rough performance figures for the Nvidia Shield TV –

Title Performance
Mortal Kombat Trilogy 87 to 94fps
Yoshi’s Story 99fps
Doom 64 90 to 117fps
Tetris 64 117fps
Starcraft 64 177fps

It’s hard to put an exact number on other games, but just from a solely gameplay-focused perspective, you can get a near-locked framerate with games like Legend of Zelda: Ocarina of Time and Super Mario 64 if you run the PAL versions (which limit the framerate to 50fps instead of 60fps with NTSC versions). There might still be the odd frame drop in certain graphics intensive scenes but nothing too serious.

Similarly, games like 1080 Snowboarding drop below fullspeed with the NTSC version, but running them with the PAL version is nearly a locked framerate in all but the most intensive scenes.

Performance on Samsung Galaxy S10 Plus

Performance on a high-end 2019 phone like the Galaxy S10 Plus can tend to be more variable, probably because of the aggressive dynamic throttling being done on phones. Sometimes performance would be a significant step above the Shield TV where it could run NTSC versions of games like Legend of Zelda: Ocarina of Time and Super Mario 64 at fullspeed with no problem (save for the very odd frame drop here and there in very rare scenes), and then at other times it would perform similarly to a Shield TV. Your mileage may vary there.

Conclusions

Overall, it’s clear that certain battles have to be won on the Vulkan side, especially when it comes down to having to disable vsync at all so far for acceptable performance.

We’d like to learn more from people who have a Samsung Galaxy S20 or a similar high end phone released in 2020. Even a Snapdragon version of the S10 Plus would produce better results than what we see here.

So, Low-Level N64 emulation, is it attainable on Android? Yes, with the proper Vulkan extensions, and provided you have a reasonably modern and fast high end phone. The Shield TV is also a decent mid-range performer considering its age. Far from every game runs at fullspeed yet but the potential is certainly there for this to be a real alternative to HLE based N64 emulation on Android as hardware grows more powerful over the years.

FAQ

Some specific issues should be addressed –

Game compatibility is significantly lower on Android right now

The mupen64plus-core part of ParaLLEl N64 is older than the one found in Mupen64plus next. While on PC this is not so much of an issue because of the generally mature (but slower) Hacktarux dynarec, on ARM platforms it is a different story since new_dynarec was in a premature state back then. Not only that, LLE RDP + RSP plugin compatibility with new_dynarec was not even a consideration back then. So some games might not work at all right now with Parallel RDP+RSP on Android.

ParaLLEl N64 will likely receive a mupen64plus-core update soon, and Mupen64Plus Next might also in the near future get ParaLLEl RDP + ParaLLEl RSP support. So this situation will sort itself out.

You get a display error showing ‘ERR’ on your Android device

The Vulkan driver for your GPU is likely missing these two Vulkan extensions, which ParaLLEl RDP requires.

VK_KHR_8bit_storage
VK_KHR_16bit_storage

(Intel iGPU) Performance is halved (or more) in fullscreen mode

Known issue, read above. These issues have been identified and it’s a matter of finding the appropriate solution for these issues.

RetroArch 1.8.8 released!


RetroArch 1.8.8 has just been released.

Grab it here.

Read our latest Libretro Cores Progress Report blog post here. It’s an exhaustive list, and especially the older consoles have received a lot of new cores and improvements.

Remember that this project exists for the benefit of our users, and that we wouldn’t keep doing this were it not for spreading the love with our users. This project exists because of your support and belief in us to keep going doing great things. If you’d like to show your support, consider donating to us. Check here in order to learn more. In addition to being able to support us on Patreon, there is now also the option to sponsor us on Github Sponsors! You can also help us out by buying some of our merch on our Teespring store!

Highlights

Add option to sort playlists after name truncation (Ozone)

A couple of users have complained about a feature we made in 1.8.7 (Fix sidebar playlist sort order when ‘Truncate Playlist Names’ is enabled). This new addition makes the new sidebar playlist sorting behaviour optional via a Sort Playlists After Name Truncation setting under User Interface > Appearance. When disabled, playlists will be sorted the old way (according to file name), not by display name.

Localization – big updates and crowdsourced

A new language has been added, Slovakian. And plenty of the existing languages have received big updates as far as localization goes.

But by far the biggest change is our transition to Crowdin. This allows non-programmers to more easily contribute localization changes/additions to RetroArch. You can see the completion status of the various languages on our Crowdin page.

Improved shader preset dirs

1.8.8 restores the original behavior of the “Save Shader Preset As” option, and improves the cycling of shaders by allowing to cycle the shaders on fallback directories if the Video Shader directory does not contain any preset.

Input Remapping Fixes

In 1.8.7, pressing RetroPad Start to reset a core input remap to the default setting did not work correctly – analog stick inputs get the wrong defaults, and inputs that are left undefined by the core are not set to the proper RARCH_UNMAPPED value.

1.8.8 fixes the issue.

RetroArch WiiU: Gamepad hotplugging support, theoretical multi-gamepad support

1.8.8 adds support for hotplugging WiiU Gamepads. Critically for users, this makes the driver no longer assume a Gamepad is present, so when it’s broken or out of battery or missing; the first Wiimote gets slot 1 instead (helpful when All Users Control Menu is off). I [quarkawesome] also made it check Gamepad channel 2 – while it’s impossible to connect a second Gamepad on a retail console, the code to do it still appears to be there. If that feature ever becomes a thing through CFWs, it’ll work here.

RetroArch P2 – New SDK/toolchain – big improvements

fjtrujy spent a lot of time adapting RetroArch PlayStation2 to the latest PS2 SDK. RetroArch PS2 is now being built with a modern version of the GCC compiler, and certain cores are already seeing massive speedups as a result.

As can be seen by the tweet, QuickNES went from 255fps with the old SDK to 429fps with the new SDK. This makes the core more than fast enough to use runahead – on a PlayStation2 of all things!

A newer C/C++ toolchain also will make it much easier to port over software to PS2, it was previously quite difficult to port C++ cores over to PS2.

fjtrujy also added Theodore to the list of cores supported.

Changelog

What you’ve read above is just a small sampling of what 1.8.8 has to offer. There might be things that we forgot to list in the changelog listed below, but here it is for your perusal regardless.

1.8.8

  • AUDIO/JACK: Fix regression introduced after 1.8.4 – would hang at startup
  • CHEEVOS: Disable hardcore when cheats are enabled
  • CHD: Return false when special track cannot be found
  • DISCORD/MATCHMAKING: Fix Discord ‘Ask To Join’ functionality
  • FILE PATH: Various file path handling optimisations
  • FONT: Fix Arabic, Chinese and Korean font rendering
  • INPUT MAPPING/REMAPPING: Restore broken ‘reset to default’ functionality with RetroPad ‘start’ button
  • INPUT MAPPING/REMAPPING: Fix ‘reset to default’ action for analog sticks and undefined core inputs
  • LIBRETRO: Add new message extension allowing for richer messages
  • LOCALIZATION: Update Arabic translation
  • LOCALIZATION: Update Chinese (Simplified) translation
  • LOCALIZATION: Update Chinese (Traditional) translation
  • LOCALIZATION: Update German translation
  • LOCALIZATION: Update Greek translation
  • LOCALIZATION: Update Spanish translation
  • LOCALIZATION: Update French translation
  • LOCALIZATION: Update Italian translation
  • LOCALIZATION: Update Japanese translation
  • LOCALIZATION: Update Korean translation
  • LOCALIZATION: Update Dutch translation
  • LOCALIZATION: Update Polish translation
  • LOCALIZATION: Update Portuguese Brazilian translation
  • LOCALIZATION: Update Russian translation
  • LOCALIZATION: Update Turkish translation
  • LOCALIZATION: Update Vietnamese translation
  • LOCALIZATION: Add Slovak translation
  • MENU: Small buffer optimizations
  • MENU/THUMBNAILS/BUGFIX: Fix heap-use-after-free error
  • MENU/OZONE: Add option to sort playlists after name truncation
  • MENU/OZONE/ANDROIDTV: Default to Ozone menu driver
  • MENU/OZONE/ANDROID: Gamepad-like devices default to Ozone now (Shield Portable)
  • NETPLAY: Lower announcement rate
  • OVERLAYS: Fix memory leak when loading overlays
  • SHADER PRESETS: Improved shader preset dirs
  • TIME/DATE: Enable configuration of date seperator in clock and runtime ‘last played’ displays
  • VITA: Fix upside-down vertical games
  • UWP: Enable playlist and savefile compression by default (because of slow file I/O)
  • VIDEO/WIDGETS: Fix overlapping text when simultaneous pop-up notifications and core/shader messages are being displayed
  • WIIU: Gamepad hotplugging support
  • WIIU: Theoretical multi-gamepad support
  • X11: Fix crash in x11_display_server_get_screen_orientation
  • X11/XSHM: Allow X11/XHSM video driver to operate without SHM extension
  • X11/XSHM: Fix compatibility with X11 input driver
  • XVIDEO: Fix keyboard input initialization
  • XVIDEO/XWAYLAND: Fix XVideo support on xwayland (by supporting I420 and YZ12)