RetroArch Open-Hardware Newsletter & User Survey

A busy year passed by and there was a lot of silence on the Open-Hardware Project.

The promise of RetroArch Open-Hardware has always been open hardware with open software delivering an open solution.
We stand by this goal to this day, however we felt that the DIY market alone will not help the cause significantly to bring emulation to the mainstream.
Thus we partnered with a hardware manufacturer for a commercial release – bringing the peripheral into everyone’s hands – while still keeping a free and open DIY route.

With that in mind we are re-designing the hardware to be modular – meaning there would be a base unit & “addon modules” for other console hardware (the main focus for initial release will still be N64).
Our goal is to reach more people with this approach – while only slightly increasing the difficulty for DIY folks (req. of a second PCB).
If things go well, we could enter production in mid 2022 and have a product by the end of the year (knowing current global shipping tho, there will be some nightmares down the road).

To help gauge interest and keep the community up-to-date, we launch today the RetroArch Open-Hardware Newsletter & User survey!

Please sign-up if you want to stay updated. We won’t spam you and only write you when really needed.

Even if you aren’t interested – please still take the survey.
It’s up to 10 questions max. and should only take 2 minutes to complete.

It will help us a lot! The project depends on you 🙂


RetroArch 1.9.14 release!

RetroArch 1.9.14 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here.

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 to 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!


Vulkan – Avoid hard crash when capturing screenshot in emulating mailbox

The emulating mailbox infrastructure is very hacky and needs a rethink to be able to properly support screenshots. Emulating mailbox is pretty nasty to begin with and should be considered a hack. The next version might have a setting to allow you to disable mailbox emulation entirely. Mailbox emulation as it is only takes effect in fullscreen mode.

Steam updates

We have been busy since 1.9.13! The following cores have been added:

RetroArch Steam now has 26 cores in total, and the 27th is about to be added soon, EasyRPG! Please look forward to future announcements of more cores coming to Steam soon.

Netplay improvements

Netplay has received plenty of improvements thanks to the efforts of Cthulhu. We have a lot more prepared for the next version, so consider this a prelude to the main event.

  • Added setting to allow/disallow players other than the host from pausing the game.
  • Added a sublabel for netplay max connections.
  • Changed unknown commands to be ignored instead of forcing a disconnection.
  • Fixed port override macro from not being set immediately after the port setting.
  • Fixed memory leaks.
  • Show passworded rooms on lobby. Small improvement to the lobby viewer – it should now make a distinction between passworded rooms and non-passworded rooms.
  • uPnP: Fixes more memory leaks
  • uPnP: Added a task_queue_wait to prevent executing two nat tasks at once, so it’s also thread safe now
  • uPnp: Fix UPNP port mapping failed error – switch to a permanent lease time, but request it to be removed when we do netplay_free

For the next version, we will finally address the relay MITM server issues.

WiiU improvements

* Keyboard support has been fixed. The problem was caused by changing the driver lookup point. The deferred lookup resulted in the WIIU trying to treat the keyboard as a gamepad which …
didn’t work. This change short-circuits at the connection event by ignoring mouse &
keyboard connection events.

* Picodrive is now available for the WiiU, and this marks the first time there is a 32X emulator for WiiU, on top of it running at fullspeed.
* Caprice32 is now available for the WiiU.

Core improvements

As mentioned before, as part of Project IO, we are going over every core and performing some basic quality control checks. This already resulted in numerous Quality of Life enhancements to cores. Not all of the improvements listed below can be attributed to Project IO, but it’s fair to estimate over 90% of them are.


Description: This is a Commodore 64 home computer emulator

  • Updated to use VFS instead of straight file I/O (ProjectIO)
  • Core option sublabel adjustments
  • Audio detection for AutoLoadWarp
  • More moderate tape warp detection
  • Press play on tape change
  • Mapper additions
  • Dupecheck for disk append
  • More distinguishable light gun cursor
  • Diskwarp audio detection correction
  • Mute Datasette with Autoloadwarp
  • Diskwarp audio detection improvement
  • Autoloadwarp automuting fixes
  • Fix sound muting on rewind
  • Add Automatic Zoom Mode
  • Aspect toggle correction
  • Touch pointer cleanups


Description: This is a Nintendo Entertainment System console emulator

  • Add automatic Crowdin synchronization
  • Mapper 196: Support IRQ for The Ancient & Modern Heroes
  • Mapper 319: Use hp898f.c only for the old incorrect UNIF bank order, and 319.c for all NES 2.0 ROMs. Add CNROM mode and solder pad switch to the latter.
  • Mapper 57: Change default DIP for YH-xxx Olympic multicarts, always reset to menu
  • Mapper 178: Always reset to menu.
  • CNROM/UNROM: Only emulate bus conflicts when explicitly specified by NES 2.0 header
  • Added support for mapper 383
  • Add UNROM modes and two-chip variant to mapper 242
  • Add Realtec 8099 PCB support to mapper 236


Description: This is a Nintendo GameCube/Wii console emulator

  • Shake motions to middle mouse – Map Nunchuk and Wiimote shake to the middle mouse button.
  • Fix real Wiimote. Tested with a few games with a Dolphin Bar, works fine AFAICT 🙂 Still needs the “Continuous Scanning” core option ON to “pair” the Wiimote.
  • Remove analog properties for Classic Controller Pro + swap L/R and ZL/ZR


Description: This is a Nintendo Entertainment System console emulator

  • Add automatic Crowdin synchronization


Description: This is a Nintendo Entertainment System console emulator

  • Add automatic Crowdin synchronization

Beetle PSX

Description: This is a Sony PlayStation console emulator

  • Add core options to change crosshair color + remove light gun warnings
  • Add automatic Crowdin synchronization


Description: This is an Atari 7800 home console emulator from the ’80s

  • Fix base height. This system only have one resolution depending on if it is NTSC or PAL. Before it was even worse because it was always reporting a hardcoded 320×240 which is totally wrong, so better to output the correct one even if it is also hardcoded.


Description: This is an NEC PC-8800 series home computer emulator from the ’80s

  • Update core options to v2


Description: This is an MSX home computer emulator from the ’80s

Heavy improvements have been made to the fMSX core.

  • Upgrade to fMSX 6.0
  • Replace all direct file I/O access with VFS
  • Support screen 6 & 7 (512px wide)
  • Support all 8 specific values for fmsx_mapper_type_mode
  • To enable fMSX to take over DiskROM disk access routines, conform -simbdos/-wd1793 fMSX cmdline option.
  • Second joystick was already mapped into RetroArch, but never enabled on fMSX side.. Author comments: “Now I can finally play F1 Spirit side by side with my son ;)”
  • Implement -auto fMSX cmdline option, as RA option ‘fmsx_autospace’. This doesn’t feel right though – is ALWAYS on. Also during boot and game start. This IS the way fMSX itself implements it, but I doubt if this feature is very useful.
  • Fix keyboard map: some keys where registering twice, and shifted keys did not need to be mapped
  • Add option fmsx_allsprites, which shows all sprites, i.e., lifts a video chip hardware limitation, which is reproduced faithfully by default. Makes for just a tad nicer (though less nostalgic) playing experience in games like Zanac.
  • Add option fmsx_font, to load a fixed text font
  • Optionally load .pal, automatically (was introduced in fMSX 4.0)
  • Finally support .cas tape, with autostart to convenience keyboardless platforms.
  • Fix maximum VRAM size – 192KiB (12 pages) was selectable in libretro.c but capped at 128KiB in MSX.c.
  • Support maximum RAM size (256 pages of 16KiB = 4MiB)
  • Remove unused code and features – remove dead code & unused features: effects, image-related code, dummy HID methods Keyboard() & GetJoystick(), debug console-related code, I8251.c/h serial COM, printer, EMULib.c, LoadFile()
  • Support fmsx CHT and bluemsx MCF cheat files – MCF support was already rudimentary present in fMSX.
  • implement multidisk (.m3u) support using code borrowed from bluemsx-libretro
  • retro_unload_game(): invoke TrashMSX() and solve free() problem related to getcwd()/WorkDir
  • explicitly #define NUM_FDI_DRIVES 4 (differs from MAXDRIVES, which is 2 for MSX!)
  • rework PATCH_Z80 Makefile cfg
  • fix 192kB VRAM using proper bitmask


Description: This is a Sony PlayStation2 console emulator

  • Add “Fast Texture Invalidation” hack core option
  • Add core options categories
  • GS-ogl: Put GL_ARB_get_texture_sub_image code under a define.
    Code is currently disabled, no need to check for the extension.


Description: This is a Game Boy Advance portable handheld emulator

Improved audio frame pacing

Previously, the core was susceptible to crackling audio, particularly when using low frontend audio latency settings.

This is because the core was handling audio output suboptimally. At the set audio sample rate, the frontend expected between 1097 and 1098 audio samples per frame – but the core was sending samples in multiples of 256. This means that the audio output becomes ‘desynchronised’ with retro_run() – sometimes 1024 samples will get sent to the frontend for the current frame, sometimes 1280 as the core either falls behind or overcompensates. As a result, when the frontend tries to synchronise on audio, jitter can occur – and if the frontend audio buffer is small (when using low latency values), it can sometimes run dry or reach capacity, causing crackling.

1.9.14 modifies audio handling such that the correct expected number of samples is sent to the frontend in proper synchronisation with retro_run(). This greatly improves audio quality, even on the notoriously crackly Mother 3.

To demonstrate the effect of this, here are a couple of figures measured from the core on a Linux desktop with an audio latency setting of 64 ms, averaged over 5k frames:

Time spent close to audio buffer underrun:

* Current master: 8.68 %
* With this PR: 2.37 %

In addition, a Miyoo port has also been added.


Description: This is a Quake 2 game engine core

Now, this core got some big and much-needed improvements!

* Fixes segfaults (which prevented the core from even running on many platforms) due to:
* Illegal use of strcpy() when handling path strings
* Illegal use of realloc() in the memory ‘hunk’ handling code
* Severe memory corruption when using the Software renderer: an extern struct was created in one file then used in another with a different type definition, such that half the members were pointing to invalid addresses…
* Moves all core-generated files (saves + config.cfg) to the frontend save directory (these were previously dumped in the game directory)
* Removes irrelevant entries from the in-game menu (the multiplayer, options, etc. menus had no purpose in the libretro core)
* Fixes screen blanking behind the in-game menu when using the OpenGL renderer
* Updates the core options to v2 format
* Clarifies existing core option labels/sublabels
* Adds a core options category for input-related settings
* Adds new core option: Gamma Level
* Allows gamma correction for both Software and OpenGL renderers
* Adds new OpenGL core option: [GL] Brightness
Sets overall ‘environment’ brightness when using the OpenGL renderer
Default OpenGL brightness has been set to a usable level (previously almost nothing could be seen…)
* Adds new OpenGL core option: [GL] Texture Filtering
Allows selection of linear or nearest-neighbour filtering for textures, with ‘HQ’ variants that improve mipmap handling (reducing the movement-induced ‘shimmer’ effect on floor/ceiling textures)
* Adds new core option: Analog Deadzone
Used to eliminate controller drift
* Adds new core option: Auto Run
Enables running by default
* Adds new core option: Camera Sensitivity
Sets the speed of camera movement using the right analog stick
* Fixes gamepad mapping (and adds proper input descriptors) by replacing the botched copy/paste code from tyrquake. The default controls are now laid out as follows:
JOYPAD_LEFT: Open Inventory
JOYPAD_RIGHT: Use Inventory Item
JOYPAD_B: Menu Cancel
JOYPAD_A: Menu Select
JOYPAD_Y: Next Weapon
JOYPAD_R: Crouch / Descend
JOYPAD_L2: Jump / Climb
JOYPAD_R2: Attack
JOYPAD_R3: Drop Inventory Item
JOYPAD_SELECT: Show / Hide Help Computer
* Fixes rumble functionality (previously, the Rumble core option did nothing…)
* Fixes mirrored controls when using the Software renderer with the OpenGL-only [GL] Mirror Mode core option enabled
* Improves the uniformity of left/right and up/down camera movement speed (previously, up/down motion was too fast)
* Ensures a valid framerate is selected when the Framerate core option is set to Auto (previously this would fail if display refresh rate was set to e.g. 59.950 Hz)
* Ensures core is properly shut down when ‘closing content’ via the frontend
* Fixes a number of memory leaks
* Replace direct file access with VFS routines
* Music support – adds support for playback of CD audio tracks. Music must be in OGG format, placed inside the /music folder.
* Ensure that resolutions incompatible with the software renderer cannot be selected (the software renderer caps out at 1920×1200, and breaks with aspect ratios less than 4/3)
* New OpenGL core option: [GL] HUD Scale Factor
Adjusts the scale of on-screen HUD icons/text and in-game menus. A value of 1.00 will draw elements at the size expected when running the original game at a native resolution of 320×240. A value of 0.00 will draw elements with 1:1 (pixel perfect) scaling
* New core option: Force 4:3 for Cinematics
When enabled (set by default), all videos (introductions, cutscenes) will be displayed at the correct aspect ratio of 4:3. If disabled, videos will be stretched to fill the screen
* New core option: Accurate Aiming
When enabled, weapons will target the exact centre of the aiming crosshair. This modifies the behaviour of the original game, where shooting is slightly inaccurate and projectiles intentionally drift
Core option Show Crosshair additions: Users can now select White Cross, Red Dot or Red Angle images to use as an aiming crosshair
* Bug fix: The aiming crosshair is now scaled to match other HUD elements
* Bug fix: OpenGL dynamic shadows are now rendered correctly (previously, the [GL] Dynamic Shadows core option did nothing…)
* Bug fix: The OpenGL functions Draw_Fill() and Draw_FadeScreen() now operate as intended (several benefits, including a ‘proper’ semi-transparent fade effect behind in-game menus)
* Bug fix: The software renderer no longer generates heap-buffer-overflows when scaling cinematics at certain resolutions

Fix compatibility with expansion packs + add expansion pack cores

All three Quake II expansion pack cores are now available on the buildbot. In addition, each core build will fail to load content – and provide an appropriate error notification – if the wrong PAK file is selected (e.g. if the user attempts to load the rouge expansion with the xatrix core).

The list of expansion packs is as follows:
* Quake II: The Reckoning (xatrix)
* Quake II: Ground Zero (rogue)
* Quake II: Zaero (


Description: This is a Magnavox Oddysey 2 console emulator

1.9.14 fixes the following audio-related issues previously affecting the core:

* Before, the audio sample rate was set entirely incorrectly (I believe due to a misunderstanding when the core was originally ported). A fixed output sample rate was used which does not match the internal generated sample rate – such that the last ~30% of the samples generated each frame were simply discarded (!). This has now been rectified. (Note that we have to do some internal resampling to 2/3 of the internally generated rate, since the default rate is so high/unusual that it causes poor performance of the sinc resampler used by RetroArch)
* Before, the Audio Volume core option was applied incorrectly when the value was set below 100%, creating a non-zero ‘silence’ level. This has been fixed.
* The Voice implementation previously used the libretro-common audio_mixer.h/.c code. This cannot be used directly by a core, since it relies on certain global variables; if the core is build statically then calling audio_mixer functions will create conflicts with RetroArch itself. 1.9.14 therefore replaces the mixer code with a core-specific core_audio_mixer.h/.c copy of the library.
* Previously, the mixing of The Voice into the main audio stream was not quite correct: it just added the voice, without dealing with clipping issues. This has been fixed, by using the audio mixer code ‘as intended’.
* In addition, a new Voice Volume option has been added to allow the volume of The Voice to be set independently from sound effects.

NOTE: Voice support is disabled for the Emscripten port.


Description: This is a Sony PSP game handheld console emulator

* Move audio callback to the main thread (fixes the longstanding hang
issues when using OpenGL)
* 64ms on desktop isn’t enough due to excess buffering going on in this
emulator. Set default to 128ms instead for now.
* Different audio approach is necessary due to the following: it sets a
fixed framerate of 60, then sends either too many or too few audio
samples per frame in order to force the frontend to run at the correct
speed (.e.g. making the frontend run in slow motion for games that run
at 30fps) – this is undesirable for libretro, we want a consistent
amount of audio samples per batch.

Miscellaneous core improvements

  • 81/EightyOne: Add RetroFW port
  • Beetle Supergrafx: Use VFS instead of direct file I/O
  • Beetle Wswan: Fix v30mz regression (again)
  • Caprice32: [event] changed mouse pointer to absolute position
  • Caprice32: [event] better first the default mouse mode code.
  • Caprice32: [KoS] little fix to avoid render problem on WiiU
  • Caprice32: Should work now on WiiU
  • Caprice32: [KoS] changed to RETRO_DEVICE_ID_POINTER_PRESSED
  • Caprice32: [dsk] clean base
  • Caprice32: [fdc,slots] new loader endian compatible WIP
  • Caprice32: [loader] compatible wiiu basic loader.
  • Boom3: Add automatic Crowdin synchronization
  • Cannonball: remove XML config file loading/saving – settings are stored in core options file instead
  • Dosbox Core: Correct disassembly of some FPU instructions.
  • Dosbox Core: don’t do dual writes to opl2
  • Dosbox Core: Add proper opl3 handling of the waveform select to dbopl
  • FBA2012 CPS1: Add automatic Crowdin synchronization
  • FBA2012 CPS2: Add automatic crowdin synchronization
  • Gambatte: Add automatic crowdin synchronization
  • Beetle Lynx: Don’t tell software this is emulation
  • FBNeo: (libretro) xybots remapping
  • FBNeo: (libretro) llander remapping
  • FBNeo: megadrive update from gab75
  • FBNeo: nes update from gab75
  • FBNeo: gijoe: all clones have a 4 players mode
  • FBNeo: gaelco: modernize driver, fix thoop stg. 4 crash
  • FBNeo: atarivad, fix runahead w/some games using this
  • FBNeo: tempest: add some hacks
  • FBNeo: msx update from gab75
  • FBNeo: d_taitof2.cpp: add Majestic Twelve – The Space Invaders Part IV (US)
  • FBNeo: batman, more drums volume, vad offset, ssriders oops
  • FBNeo: xmen6p, note about resetting
  • FBNeo: In Your Face (inyourfa), fix priority
  • FBNeo: ssriders, fix # of players
  • FBNeo: speccy update c/o gab75
  • FBNeo: galaxian, update pisces date
  • FBNeo: 7z: fix cpp ODR (second attempt)
  • FBNeo: spectrum fix 48k’s ay
  • FBNeo: vector, underp mode change
  • FBNeo: video, less derpy mode changes for megadrive, etc
  • FBNeo: grdnstrm: also fix clones’s dips
  • FBNeo: grdnstrm: fix dips
  • FBNeo: sms: update Voyage – A Sorceress Vacation to 1.05
  • FBNeo: ssv, buffer spriteram for every game in driver
  • FBNeo: d_namcos2.cpp: added Mirai Ninja (Japan, set 2) [Corrado Tomaselli]
  • FBNeo: d_cps1: marked forgottnj as a prototype, it’s an unfinished version of the game
  • FBNeo: d_hyperpac.cpp: added New HyperMan (3-in-1 with Cookie & Bibi & Hyper Man) (set 2) [jordigahan]
  • FBNeo: d_cps1.cpp: Fixed 2 players mode DIP switch for sf2cejx and sf2hfj.
  • FBNeo: spectrum update from gab75
  • FBNeo: williams, add Playball!, fix lottofun
  • FBNeo: lua: fix window not opening after closing a game w/lua console opened
  • FBNeo: cbombers, undrfire: impl. contrast/luma settings as recommended by Tatsuya79
  • FBNeo: ssv, experimental lag fix plus fix pastelis 2p split screen mode
  • FBNeo: d_m107.cpp: hiscore support
  • FBNeo: ssv, add spritebuffering to stmblade to fix lines in stage 6, cleanup a little
  • FBNeo: experimental cheat fix for midway (mk/umk3/etc) games
  • FBNeo: md, updates from gab75
  • FBNeo: megadrive palette fix (0 bit ignored)
  • FBNeo: sys16b doesnt have highlights, only shadows. i think? revert if breaks something
  • FBNeo: add ktiger2p [DsNo]
  • Genesis Plus GX: Fetch translations & Recreate libretro_core_options_intl.h
  • Handy: Add automatic Crowdin synchronization
  • Lutro Pong: Alpha opacity fixes
  • LRMAME2003: Fix white crosshair color in some games
  • LRMAME2003: Fix wiiu rotation – ported from 2003+ grant2258
  • LRMAME2003: Adjust tempest volume
  • LRMAME2003: Update core_options.c
  • LRMAME2003: Flag cheat input port content
  • LRMAME2003: Fix cheat input ports defender and stargate
  • LRMAME2003 Plus: New working game Kyukyoku Tiger (Japan, 2 Players)
  • LRMAME2003 Plus: Use absolute to compare against threshold
  • LRMAME2003 Plus: Use new scaling function
  • LRMAME2003 Plus: Account for all sample rates – also correct labels to Hz
  • LRMAME2003 Plus: Tempest volume – Volume seems very low, adjusted to MAME2010 value
  • LRMAME2003 Plus: Change default for audio skew
  • LRMAME2003 Plus: Use libretro rotations when available and let mame sort anything that needs to be rotated – let MAME do rotations when ra fails
  • LRMAME2003 Plus: Improve the Priority Prom – Fixes some graphical problems in the mini game when the screen zooms in which was broken previously, with thanks to dink and the FBN dev team
  • LRMAME2003 Plus: In Your Face improvements
  • LRMAME2003 Plus: Fix rotations when rotations are disabled or not supported
  • LRMAME2003 Plus: Lethal Enforcers gun read
  • LRMAME2003 Plus: Crypt Killer gun read
  • LRMAME2003 Plus: Undrfire crosshairs and cleanups
  • LRMAME2003 Plus: Lightgun crosshair appearance core option
  • LRMAME2003 Plus: Jpark uses analog / le2_flip fix for le2u
  • LRMAME2003 Plus: fix SHA1 ktiger2p
  • LRMAME2003 Plus: Tidy up enhanced crosshair shape
  • LRMAME2003 Plus: Lethal Enforcers 2 fix gun reload top and bottom
  • LRMAME2003 Plus: Lethal Enforcers 2 color fix hack
  • LRMAME2003 Plus: Fix Lethal Enforcers 2 left side reload
  • LRMAME2003 Plus: Thunder Hoop and Squash refresh rate protection fixes – prevents Thunder Hoop from crashing on level 4 and insert coin text sticking on screen after you continue in Squash
  • LRMAME2003 Plus: Fix white crosshair color in some games
  • LRMAME2003 Plus: Bbusters fix gfx and gun calibration
  • LRMAME2003 Plus: Update namcos2.c
  • LRMAME2003 Plus: Player specific crosshair tracking
  • LRMAME2003 Plus: Failsafe if CONTENT_LIGHTGUN_COUNT equals zero
  • LRMAME2003 Plus: Tag player number draw_crosshair
  • LRMAME2003 Plus: Drawgfx – reset full array
  • mGBA: Add automatic Crowdin synchronization
  • Mu: Add pdb to the extensions list
  • PPSSPP: Reimplement audio
  • Picodrive: Fix loading of SMS/GG ROMs
  • Picodrive: sound, fix ym2612 ladder effect, add option
  • Picodrive: 32x, fix DMA mem-2-mem copying for big endian
  • Picodrive: sound, add ym2612 channel clipping, ladder effect
  • Picodrive: sms, set non-TMR images to region Japan
  • PocketCDG: Replace direct file I/O access with VFS
  • Pokemini: Add 7x (672×448) video scale
  • Prboom: Update core options to v2 and automatic Crowdin synchronization
  • SameBoy: Update the SameBoy core with latest changes
  • SameBoy: Add GB_is_cgb_in_cgb_mode
  • SameBoy: Add memory write callback, optimize memory access with likely/unlikely
  • SameBoy: Add a safe memory read API
  • SameBoy: Initial MBC7 support
  • SameBoy: Mouse controls for MBC7
  • SwanStation: Latest updates
  • VirtualJaguar: Fix 39 & 54 numpad controller/keyboard mapping
  • Yabause: Add automatic Crowdin synchronization



  • ANDROID/PLAYSTORE: Bump up SDK level to 30 to comply with Play Store policies
  • AUDIO/MIXER: Increase sample buffer padding
  • CHEEVOS: Disallow achievements when spectating netplay
  • CHEEVOS: Fix need-to-activate achievement logic for non-hardcore
  • CHEEVOS: Don’t queue rewind re-init if already on main thread
  • CHEEVOS: Ignore unofficial achievements unless setting is enabled
  • CHEEVOS: Use SSL host when available
  • CHEEVOS: Validate hashes for secondary discs in multi-disc games
  • CHEEVOS: Ensure placard is initialized on main thread when game has no achievements
  • CHEEVOS: Audit achievement settings defaults and visibility
  • CHEEVOS: Show error message when no password provided
  • CHEEVOS: Use widget for game loaded achievement progress
  • CONFIG: Honor config_save_on_exit when Reboot/Shutdown is called
  • DISK CONTROL: Focus on current content entry in Disk Control append/insert
  • FRAMEDELAY: Auto Frame Delay Improvements – swap interval handling, D3DX handling, and delay target resets also on core restart. It should now work with high refresh rates and also with Direct3D 10/11/12 drivers
  • INPUT/GYRO/ACCELEROMETER/ANDROID: Re-enable Gyroscope & Accelerometer when RetroArch resumes or regains focus
  • INPUT/HID: Fix gamepad disconnect on unrecognized HID device
  • LAKKA: Patch to fix keyboard typing
  • LAKKA: CD-ROM eject menu item
  • LAKKA/BLUETOOTH: Add option to remove pairing
  • LAKKA/SWITCH: Disable rumble gain
  • LAKKA/SWITCH: Disable cpu scaling, uses its own CPU governor
  • LOGGING: Logging cleanups. A bunch of unifications and reformattings (capitalizations, dots, quotes, prefixes etc). Also added a few missing things, such as Run-Ahead error logging and LED interface init logging when it is enabled.
  • NETPLAY: Networking – should not print country for a local lobby
  • NETPLAY: Added setting to allow/disallow players other than the host from pausing the game.
  • NETPLAY: Added a sublabel for netplay max connections.
  • NETPLAY: Fixed port override macro from not being set immediately after the port setting.
  • NETPLAY: Show passworded rooms on lobby
  • NETWORK: Make HTTP header parsing case insensitive
  • NETWORK/UPNP: Fixed memory leaks
  • NETWORK/UPNP: Added a task_queue_wait to prevent executing two nat tasks at once, so it’s also thread safe now
  • NETWORK/UPNP: Switch to a permanent lease time, but request it to be removed when we do netplay_free. Switch to a permanent lease time, but request it to be removed when we do netplay_free.
  • NETWORK/UPNP: Only use a single interface for UPnP, return on the first one found instead of iterating over all of them and opening them one by one
  • OVERLAYS: Revert changes
  • RETROFW: Add OSS audio
  • VIDEO/ROTATION: Always return false if rotation can’t occur. RETRO_ENVIRONMENT_SET_ROTATION should return false when rotation has been forcefully disabled in frontend, that way the core can decide if aspect ratio should be rotated or not for vertical games. Useful for FBNeo for instance.
  • VULKAN: Avoid hard crash when capturing screenshot in emulating mailbox.
  • WIIU: Make wiiu_gfx_load_texture code safer
  • WIIU: Fix keyboard support.

Lakka 3.6 release

Original article here.

New version of Lakka has been released!

We are happy to announce the new and updated version of Lakka.

Release summary

Changes since version 3.5.2:

  • RetroArch updated to to control the menu by all users is back
    New option for automatic frame delay (accessible via Settings → Latency, and also via Quick Menu; Advanced Settings must be enabled to access this option)
  • Cores updated to their most recent versionsbeetle-fce: added new libretro core (exists besides beetle-fce-fast)
    ecwolf: added new libretro core
    fbneo: added highscore.dat to RetroArch system folder
    mame2003-plus: added artwork, cheat.dat and history.dat to RetroArch system folder
    scummvm: added engine files, themes, soundfont and basic scummvm.ini file to RetroArch system folder,
  • Mesa updated to 21.2.5
  • Mainline kernel updated to 5.10.78
  • Raspberry kernel/firmware updated to 1.20211029
  • Fixed issue with older Intel GPUs (crocus driver is now preferred and using MESA_LOADER_DRIVER_OVERRIDE is not required anymore)

Known issues

See GitHub for information about currently open bugs and issues and also for possible workarounds for these bugs/issues.

Final notes

You can download the latest release from Lakka download page. If you want to follow the development of Lakka more closely, you can download latest Lakka nightly builds.

If you want to show your support for further development of the Libretro projects and ecosystem, you can learn more here.

Happy retro-gaming!

RetroArch 1.9.13 ninjafix release

A ninjafix release was just pushed for RetroArch 1.9.13. This overwrites the current 1.9.13 build. Download it here.

The main reason for this was that the overlays had been changed in 1.9.13. This would lead to many people’s existing overlay config files being broken due to the paths no longer working. So we changed it back to defaults. We apologize for the inconvenience. For example, because of this, the default overlay for Android would fail to start, and some overlays for 3DS would fail to show up.

Several Cheevos-related fixes have also been pushed.


  • ANDROID/PLAYSTORE: Bump up SDK level to 30 to comply with Play Store policies
  • CHEEVOS: Fix need-to-activate achievement logic for non-hardcore
  • CHEEVOS: Don’t queue rewind re-init if already on main thread
  • CHEEVOS: Ignore unofficial achievements unless setting is enabled
  • NETPLAY: Networking – should not print country for a local lobby
  • NETPLAY: Add Text Chat functionality
  • OVERLAYS: Revert changes
  • VIDEO/ROTATION: Always return false if rotation can’t occur.
  • RETRO_ENVIRONMENT_SET_ROTATION should return false when rotation has been forcefully disabled in frontend, that way the core can decide if aspect ratio should be rotated or not for vertical games. Useful for FBNeo for instance.
  • WIIU: Make wiiu_gfx_load_texture code safer

RetroArch is looking for more translators

Written by DisasterMo

As all here know, RetroArch is an amazing open-source project. It has provided many people with countless hours of high quality entertainment. At the same time many contributors strive to make it better, more inclusive and more enjoyable for more people. That is why we translators do our best to localize RA into any and all languages we can!

Unfortunately, some translation efforts have been stagnating for some time, so we would like to ask you for help: If you would like to contribute to localizing RetroArch into your language, and make this app even more amazing, please consider joining us at Crowdin!

More translators for any language would be great, but languages in dire need of some include:

– Arabic
– Asturian
– Chinese Traditional
– Czech
– Danish
– Dutch
– Esperanto
– Galician
– Greek
– Hebrew
– Hungarian
– Indonesian
– Persian
– European Portuguese
– Slovak
– Swedish
– Ukrainian
– Vietnamese
– Welsh

And if you can’t find your language on Crowdin, just notify us right over at the #retroarch-translations channel of the libretro Discord and we’ll see if it can be added.

We have prepared a written tutorial for all of you who want to get started.

If you have any questions, just hop on over to the #retroarch-translations channel and we’ll gladly help you out!

Hope to see you there!

RetroArch 1.9.13 release!

RetroArch 1.9.13 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here.

UPDATE (11/11/2021): A ninjafix release has been pushed. See our blog post here.

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 to 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!


Project IO continues

Project IO continues as we try to abstract all file I/O in libretro cores and RetroArch to meet the Google Play Store’s new policies. Android 11/12 requires the use of the Storage Access Framework for file I/O, as libc stdio access is being restricted as much as possible.

One of the beneficial side effects of Project IO is that in going over each core, we find out all sorts of long standing issues along the way, and we try to improve the cores along the way. So it serves as a much needed quality control check as well.

No RetroArch 1.9.13 for Google Play Store for now

Do not expect frequent updates to the Google Play Store version until further notice for now. This is because of the new Play Store requirements (as explained bove in the Project IO section). Basically what it comes down to is that despite our hardest work and effort, we have missed the deadline, and so any new APK that is pushed to Google Play is likely to be rejected until the minimum SDK Level (30) and SAF is being used. We are trying to work as fast as we can to get to that stage. A realistic target is possibly two weeks from now, but we’d rather not make promises and see how far we can get by that point. In the meantime, downloading it from our site (the non-Google Play Store version), the Amazon App Store, or Huawei AppGallery or all valid alternatives that should receive an update.

Automatic Frame Delay

After introducing unique innovations like runahead in the past, RetroArch continues to innovate once more and remains at the forefront of latency reduction: introducing automatic frame delay! Read all about it in our separate article here.

The aim of this option is to lessen the burden of creating core-specific and also game-specific overrides for Frame Delay, and instead go for “set it and forget it”. With 0 value, the starting point will be half frame time.

It is fairly simple and it is based on frame time averaging with a few different thresholds which filter out false positives and provide quick stabilization with bigger steps depending on the need.

It only goes down, it is temporary, and it will reset on core unload and on SET_SYSTEM_AV_INFO. The necessary values are shown in video statistics and all actions are logged in info level.

Some notes by the author:
* For Windows users – use the XAudio driver for now, WASAPI and DirectSound does not lead to reliable results with Auto Frame Delay for now.
* Early polling could behave better with frame delay. Try setting Polling Behavior from ‘Late’ to ‘Early’ and see if you prefer it that way. Note that that polling setting needs (restart) info with it, since it does not properly refresh in realtime. If it is anything but Late at startup, putting it to Late will be always one frame behind.

‘All Users Control The Menu’ option is back

A much requested feature by WiiU users is back again! This allows all the connected gamepad devices to control the menu simultaneously. It is enabled by default for WiiU and disabled for all other devices.

NOTE: Only player 1 can toggle the menu. This is a limitation of the current input system. But any set Menu Toggle Controller Combo will work fine for all users, so it is probably acceptable for now.

Initialise ‘Explore’ menu on a background thread

Before, accessing the Explore menu would freeze the user interface for up to several seconds (depending on host hardware performance) while playlists and databases are scanned.

1.9.13 just pushes the Explore menu initialisation onto a background thread, so the UI remains responsive while the various processing occurs. (Note that the host platform must of course have threading support – if not, Explore menu initialisation will remain on the main thread)

RetroAchievements – Replace co-routines with tasks

Not important much to endusers but still worthy of a mention to people familiar with the codebase. Replaces the single long-running load task for RetroAchievements with several smaller tasks (which are threaded).

This also eliminates the coroutine code as that was only being used to yield the long-running load task – there wasn’t actually anything else to be coroutine with.

Subtasks (i.e. 1a/1b) are queued together and can be executed in parallel. RetroArch’s task system only has one task thread, but the HTTP task does sort of interleave the server requests so they are more-or-less executed at the same time.

Core improvements

As mentioned before, as part of Project IO, we are going over every core and performing some basic quality control checks. This already resulted in numerous Quality of Life enhancements to cores. Not all of the improvements listed below can be attributed to Project IO, but it’s fair to estimate over 90% of them are.


Description: mGBA is a Game Boy Advance emulator

Fixed audio pacing – no more crackles and bad frame pacing

GBA content ran with the mGBA core was sometimes subject to crackling audio and intermittent bad frame pacing (particularly when using low frontend audio latency settings).

It turns out that the core was handling audio suboptimally in the libretro layer. At the set audio sample rate, the frontend expects between 548 and 549 audio samples per frame – but the AVStream audio callback reads and sends exactly 512 samples. This means that the audio callback becomes desynchronised with retro_run() – sometimes 512 samples will get sent to the frontend for the current frame, sometimes 1024 as the core either falls behind or overcompensates. As a result, when the frontend tries to synchronise on audio, jitter can occur – and if the frontend audio buffer is small (when using low latency values), it can sometimes run dry or reach capacity, causing crackling.

Our changes modifies audio handling in the libretro layer such that the correct expected number of samples is sent to the frontend in proper synchronisation with retro_run(). With this change we no longer experience cracking audio in GBA games, and the 240p test suit demonstrates smooth scrolling.

Note that the changes here only affect GBA content. GB/GBC emulation produces irregular audio sample pacing that is not consistent with the set sample rate, and so I am unsure how best to handle it. The existing AVStream audio callback and fixed buffer size of 512 is therefore maintained for GB/GBC content (since it already seems to produce acceptable results in most cases)


While working on the above, we noticed that the audio produced by this core is somewhat ‘harsh’ sounding. We have added an optional (fast) low pass audio filter (with associated strength setting), which softens the generated output to a more comfortable level.

Since we had to modify the core options, we also took this opportunity to update the options to v2 format, with category support.


Description: This is the mainline MAME core based on current sourcecode

Update to 0.237

We have updated the LRMAME core to version 0.237.

1 frame of input lag removed from core

In addition, we are happy to report that a longstanding issue with this core has been resolved. There was previously 1 additional frame of input latency in this core. This has thankfully been shaved off now.


Description: This is a Game Boy Advance emulator

x86 32bit/64bit dynamic recompilers

gpSP now has a dynamic recompiler for x86 x64 architecture processors! Now both 32bit and 64bit CPUs have a working dynamic recompiler.

This is now hands down the fastest Game Boy Advance emulator in existence on x86 x64 platforms, outside or inside of libretro/RetroArch. We have benchmarked it ourselves – on an i9 10900KF, we get a regular reading of 2270/2280 fps in fastforward mode with Super Mario Advance 2. This makes it even faster than QuickNES, an 8bit Nintendo Entertainment System emulator. It is a little bit slower than Gambatte (still one of the kings in terms of performant cores) at ~2300fps, but it bears reminding that Gambatte is only targeting 8bit Game Boy consoles as opposed to the 32bit Game Boy Advance.

With Advance Wars, we can get even crazier readings like anywhere from ~4000 to ~5000fps in windowed mode.

Suffice to say, this kind of performance before was simply unheard of for a GBA emulator. Suffice to say, if you were still hurting for performance with a Game Boy Advance emulator before (on whatever ghetto rig you have repurposed), give this a try!


Description: This is a Doom/Doom 2/Ultimate Doom/Final Doom game engine core.

In addition to this core now using the VFS for file I/O, we also improved the following listed below.

Fix core options version detection

On recent versions of RetroArch the core options are currently falling back to v0 format (missing sublabels) due to a trivial ‘supported version check’ error in libretro_core_options.h. We fixed the issue.

Fix memory leaks + prevent potential segfault when saving/loading games

We tried fixing every memory leak that we could find in the core.

It also works around a nasty bug in the code for saving/loading games, where an array index can easily go out of bounds.

Note that we had to stub a certain deinit out for the Windows build, the z_zone memory management seems to be pretty hairy on Windows and we unfortunately haven’t found a clean way to fix that yet. However, we don’t expect this to be a big issue on Windows regardless since it’s a dynamically linked core that gets deallocated after unloading anyway. Most of the leaks on the statically linked consoles should be all gone, and that is what ultimately counts at the end of the day.


Description: This is a Quake 1 game engine core.

In addition to this core now using the VFS for file I/O, we also improved the following listed below.

Fix startup crash on x64 systems

The core would segfault under some circumstances when running the shareware version of Quake on Windows.

It turns out that the code makes a number of assumptions about the width of certain data types when casting pointers, which are not true on a number of platforms. On 64bit Windows this can cause pointer addresses to be determined incorrectly – leading to chaos.

We fixed the issue by using standard fixed-width types for the affected pointer casts. It also cleans up some other related compiler warnings.

Clean up file path handling + fix segfault when loading content from ‘non-standard’ directories

Before, the core would segfault on certain platforms when loading PAK files from non-standard directories (anything other than id1, quoth, hipnotic, rogue) due to illegal usage of strncpy(). This can be observed most easily by attempting to run the shareware version of Quake from RetroArch’s online content downloader.

We fixed this issue, and also cleaned up all file path handling in libretro.c (using libretro-common routines). A number of libretro-common files have also been updated to the latest version.

Fixed memory leaks

We fixed three sources of memory leaks in the core:

* A relatively minor one related to loading PAK files (the file handle was always left open)
* Two serious ones in the sprite handling code, which may potentially trigger multiple times per frame (and which were likely to cause crashes on RAM limited platforms…)

Miscellaneous core improvements

We have been spending time improving fMSX (MSX emulator core), PX68K (X68K emulator core), and Frodo (Commodore 64 emulator core), but are not quite done yet. We will probably spend some time detailing the changes to these cores by the time the next release comes along (two weeks from now).

For WiiU users: Frodo has been added to the WiiU build.

  • Beetle PSX: Add static crop behavior for “Crop Overscan” alongside dynamic
  • Beetle PSX: Set game specific tweak to get Monkey Hero running past the title screen
  • FBNeo: Numerous updates – see below:
  • FBNeo: CPS1 – fix Strider palette fades
  • FBNeo: CPS1 – Stars: simplify/fix
  • FBNeo: CPS2 – added Super Street Fighter II: The New Challengers Super 2 (bootleg, USA 930911)
  • FBNeo: CPS2 – Corrected some overdumps for Alien Vs Predator [Guru]
  • FBNeo: Sync FB Neo with MAME 0.237
  • FBNeo: Spectrum updates from gab75
  • FBneo: Mega Drive updates from gab75
  • FBNeo: NES updates from gab75 – also add Goemon 2 Translation (English)
  • FBNeo: Fix Vigilante breakage
  • FBNeo: M90 – Hiscore support
  • FBNeo: PC Engine – Add sprite limit override DIP
  • FBNeo: PC Engine – Fix timing, arrange render pipeline, scale windowing for Supergrafx
  • FBNeo: Supergrafx – Dai Makai – perfect background scrolling fix
  • FBNeo: SNK – Fix Psychos DIPs
  • FBNeo: Colecovision – Fix v-linecount (glitch in Frogger)
  • FBNeo: Pacman – added Buccaneer (set 2) [Jeremy Locke, Cam]
  • FBNeo: d_seta.cpp: add dumps for plds in blandia set, and info for undumped plds
  • FBNeo: neogeo: add “The King of Fighters ’98 (Ratio hack)”
  • FBNeo: d_cps2.cpp: add Street Fighter Zero 2 Alpha (Asia 960805) [Genaro Rodarte]
  • FBNeo: New WORKING clone – Floritas (Multivideo Spanish Moon Cresta bootleg) [Retromaniacs]
  • FBNeo: Renamed ‘spcdraga’ as ‘floritas’
  • FBNeo: Add ‘floritasm’ and rename ‘spcdraga’ as ‘floritas’
  • FBNeo: Homogenized all “bootleg on Galaxian hardware” descriptions
  • FBNeo: Now there’s only one “Space Dragon” set
  • Frodo: Added WiiU build
  • Gambatte: Fix loading of custom palettes with CRLF line terminators
  • Genesis Plus GX Wide: Fix specific Plane B scrolling bug – This bug occurred when HSRAM values for Plane B were `>= 0x10000 – config.h40_extra_columns * 4` (e.g., `0xFFD8` when h40_extra_columns = 10) because of a bit carry into the upper 16-bit word of `xscroll`.
  • Kronos: Latest updates
  • MAME2003 Plus: Improve sound tempo for Dolmen and Twin Action – some sound niggles a constant crackling noise still remain
  • MAME2003 Plus: Use control name before universal default – uses the specific control name before filling with our universal defaults. Also update DAT.
  • MAME2003 Plus: Support a couple more Afega games – these just hang off the standard NMK16 code so can be added easy enough to nmk16.c rather than afega.c which would be more complicated
  • MAME2003 Plus: New gfx scrolling routine for Twin Action
  • MAME2003 Plus: Speed up macro search – refine search to look for player specific joycodes.
  • MAME2003 Plus: Add Amlogic S812 platform + cleanup unused vars in Makefile
  • PCSX2: Numerous updates – see below:
  • PCSX2: GS: Don’t propagate 24bit textures on download
  • PCSX2: GS: Properly loop when reading 32bit CLUT from offset
  • PCSX2: GS: Fix up CLUT offset handling in 32bit I8 mode
  • PCSX2: GameDB: Add gamefixes for Ruff Trigger
  • PCSX2: GameDB: Port Iridium Runners patch, update fixes
  • PCSX2: GameDB: Patch rounding problem in Playmobil Hype The Time Quest
  • PCSX2: GameDB: Sports (RTL)
  • PCSX2: GameDB: Katamari Games
  • PCSX2: GameDB: add VU clamping to ‘Enthusia Professional Racing’
  • PCSX2: GameDB: fix serial for ‘Panzer Elite Action – Fields of Glory’
  • PCSX2: GameDB: add EE clamping to ‘Max Payne 2 – The Fall of Max Payne’
  • PCSX2: GameDB: add VU clamping to ‘Battle Engine Aquila’
  • PCSX2: GS-hw: Don’t write clamped depth test value to depth buffer when ZMSK is enabled
  • PCSX2: GameDB :add VU clamping to Monster Rancher 3
  • PCSX2: GS-hw: Add Slam Tennis to automatic mipmapping.
  • PCSX2: EE: Cyclerate > 1 caused some cycles to be lost
  • PCSX2: GS-fx/glsl: Get rid of PS_ATST 0 condition. It does nothing so no need to have it in shader.
  • PCSX2: SIF: Kind of revert a SIF timing change made a while back to fix Parappa the Rapper 2
  • PCSX2: COP2: Fix reg allocation issue. Really fixes Devil May Cry which was a bug hidden by clamping hidden by a bug, yeah i think that covers it all…
  • Yabause: Fix pixel format on android



  • CHEEVOS/MSVC2010: Add Cheevos support
  • CRT/SWITCHRES: Fixes some issue where scaling is incorrect in some video modes for CRT output.
  • FRAMEDELAY: Add ‘Automatic Frame Delay’ option
  • INPUT: Add ‘All users control the menu’ setting – any gamepad can control the menu when this is enabled. Only limitation right now is that only player 1 can toggle the menu, but any set Menu Toggle Controller Combo will work fine for all users, so this should be acceptable for now
  • INPUT/UDEV: Fix Dolphin bar and safeguard against not adding devices with no mouse or touch buttons detected
  • NETPLAY/CLI: -C/–connect commandline fix
  • NETPLAY: Other improvements
  • NETPLAY: Remove forced disconnection on unknown netplay command – will be backwards compatible with any version that removed this disconnect. instead of disconnecting, we just read the data and ignore, like most network implementations do
  • TASKS/CHEEVOS: Replace coroutines with tasks/thread
  • TASKS/DATABASE/EXPLORE: Initialise ‘Explore’ menu on a background thread – no more stall when hovering over the Explore tab

RetroArch 1.9.13 – Automatic Frame Delay

Article written by Ryunam

RetroArch 1.9.13 introduces a new option called “Automatic Frame Delay”. It has been added to the Latency sub-menu (found under Settings -> Latency).

This new feature provides an effective way to avoid having to configure a specific value for the “Frame Delay” option for each and every core and individual piece of content that you may want to run, by automatically tuning down its strength based on your system performance.
This is yet another contribution that empowers our long-standing efforts in reducing input latency to the lowest extent possible. We feel this new addition also gives us a good opportunity to delve further into the inner workings behind the concept of “Frame Delay” and briefly explain what purpose this functionality serves and how we generally advise our users to apply it.

What is “Frame Delay”?

The setting known as “Frame Delay” has actually existed for some time in RetroArch. However, due to its nature and the complexity of its effect, it has always required a level of strictly manual adjustment and finetuning on the user side.

To best describe the underlying mechanism, let us briefly touch upon the timing of when a new frame is produced (including when the inputs are sampled) and then displayed on-screen.

The way frames are rendered and then displayed on video can be best understood by considering this sequence:
• each frame has a set duration, namely a “frame time” or “frame period” as it is usually called, which on a 60hz screen and in ideal circumstances corresponds to a length of 16.7 milliseconds on average;
• as per the picture shown above, once the first frame is shown the next frame starts being prepared “behind the scenes”. This rendering process includes the moment the inputs are polled and it all happens within the allotted frame period;
• in typical situations the rendering process of the next frame is finished some time before the given frame period is over;
• this results in the next frame essentially “stalling”, being left in a suspended state for a few more milliseconds than necessary, until the frame period is properly finished;
• only at that point the newly created frame is presented on-screen.

While the process described here is normal and does not usually yield a considerable impact on latency, the fact that the next frame has to be put “on hold” and wait a certain amount of time from the moment it finishes rendering until the end of the frame period does in fact contribute to the combined responsiveness of the inputs.

This is where “Frame Delay” comes into play.

Depending on the value set for the “Frame Delay” option, the creation of the new frame including the input polling can be postponed by a certain number of milliseconds, until the last moment that is realistically viable.

Doing this requires some additional CPU processing power depending on the chosen amount of delay, but it also helps decrease the number of milliseconds that the new frame – which has been prepared and is ready to be presented on video – has to remain on hold. As a consequence, adjusting the “Frame Delay” setting can offer a slight – albeit measurable – improvement to the perceived input latency.

The “Automatic Frame Delay” setting

The problem with the “Frame Delay” setting has been traditionally that the many cores and types of content available, as one may expect, are vastly different and often have varying degrees of system and CPU requirements.

Users have had to constantly tweak the “Frame Delay” values for each specific situation, often resorting to set either per-core or per-content overrides, so that the benefits of the latency reduction could be had without stumbling on framerate drops, stutter, audio crackling and all sorts of other issues.

With the introduction of the “Automatic Frame Delay” toggle, the use of this functionality becomes simpler: the amount of delay time for the rendering of the new frame will scale down automatically, if the system detects any framerate fluctuation/drop, until it reaches a value that allows your gameplay to remain stable while still retaining a certain extent of latency reduction.
Here is a quick rundown of the different ways that you can enable and apply this setting, based on your preference:

• if you set “Frame Delay” to 0 and “Automatic Frame Delay” to ON, the starting point of the delay that is applied to the new frame will be half your “frame period”. For instance, on a typical 60hz screen with a frame time of 16.7 ms, the initial value applied will be “8”, as in 8 milliseconds of delay. Afterwards, if drops or hiccups are detected in the video performance, this value will be reduced dynamically until it reaches a stable point;

• if you set “Frame Delay” to any value higher than 0 and “Automatic Frame Delay” to ON, the starting point will be the delay value that was manually set. For instance, if “Frame Delay” is set to 10, the initial amount of delay for the processing of the new frame will be 10ms. Then, it will be adjusted downwards in case any framerate drop is detected;

• if you set “Frame Delay” to any value higher than 0 and “Automatic Frame Delay” to OFF, the automated scaling of the frame delay setting will be disabled. The amount of delay applied to the rendering of the new frame will be exactly the one chosen and will not change or decrease during gameplay at all;

• if you set “Frame Delay” to 0 and “Automatic Frame Delay” to OFF, no amount of delay will be applied to the rendering of the new frame. Frame Delay will be disabled entirely.


While the tangible effects of “Frame Delay” on the total combined latency might be small compared to other implementations such as Runahead, this setting has the advantage of being applicable to all cores and content, albeit to varying degrees.

The added convenience of having “Frame Delay” scale down automatically is yet another asset in making sure that you can run your content with the lowest latency possible.

Hopefully this new toggle allows a greater ease of use of this particular option for our users. We definitely encourage experimenting with it and testing it with the wide array of cores available for the libretro platform!

RetroArch 1.9.12 released!

RetroArch 1.9.12 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here.

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 to 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!



New cores are on the verge of being approved on Steam. First out of the gates is Picodrive, a Sega Genesis/Master System/Sega CD/32X emulator. You can grab that for RetroArch right now here.

We’d also like to remind users that are still using the RetroArch Play Test version on Steam to please migrate over to the mainline Steam release now and to stop using it. The Play Test version is outdated and won’t really be updated anymore after this point.

Miyoo – Pocket Go, PowKiddy Q90-V90 and New BittBoy – Over 28 cores now

For version 1.9.11, we added support for Miyoo devices, such as the Pocket GO, PowKiddy Q90-V90 and New BitBoy. Back then, we only had one or two cores available.

Version 1.9.12 now comes with a whopping 28 cores – quite the improvement over 1.9.11.

List of all cores so far –

  • 81
  • CAP32
  • fMSX
  • FUSE
  • Gambatte
  • Genesis Plus GX
  • GW
  • Handy
  • LRMAME2003
  • LRMAME2003 Plus
  • Mednafen PCE Fast
  • Mednafen Wswan
  • mGBA
  • NXEngine
  • O2EM
  • Picodrive
  • PokeMini
  • Potator
  • PrBoom
  • Prosystem
  • QuickNES
  • RACE
  • Retro8
  • ScummVM
  • SMS Plus
  • Stella 2014
  • Theodore
  • Vecx

NOTE: We are not affiliated or have any association with the companies behind these devices.

HID subsystem unification – improvements/bugfixes

1.9.11 added a new unified HID subsystem that works on both Mac and WiiU.

Version 1.9.12 features several crucial bugfixes and additions that were plaguing the initial implementation in 1.9.11. See the CHANGELOG at the end of this blog post for more details.

Increased backwards compatibility for macOS cores

Since the migration to our new infrastructure, the minimum OS requirements for macOS cores unintentionally went up. We have since taken steps to address this.

Here are the current minimum OS requirements:

  • 2048: 10.9
  • 81: 10.9
  • atari800: 10.9
  • bk: 10.1
  • blastem: 10.9
  • bluemsx: 10.9
  • bsnes2014_accuracy: 10.9
  • bsnes2014_balanced: 10.9
  • bsnes2014_performance: 10.9
  • bsnes_cplusplus98: 10.9
  • bsnes_hd_beta: 10.9
  • bsnes: 10.9
  • bsnes_mercury_accuracy: 10.9
  • bsnes_mercury_balanced: 10.9
  • bsnes_mercury_performance: 10.9
  • cannonball: 10.9
  • cap32: 10.9
  • craft: 10.7
  • crocods: 10.9
  • desmume: 10.7
  • dinothawr: 10.8
  • dosbox_core: 10.9
  • dosbox_pure: 10.9
  • dosbox_svn: 10.9
  • duckstation: 10.15
  • easyrpg: 10.9
  • ecwolf: 10.9
  • fbalpha2012_cps1: 10.9
  • fbalpha2012_cps2: 10.9
  • fbalpha2012_cps3: 10.9
  • fbalpha2012: 10.9
  • fbalpha2012_neogeo: 10.7
  • fbneo: 10.9
  • fceumm: 10.9
  • fixgb: 10.9
  • flycast: 10.9
  • fmsx: 10.9
  • freechaf: 10.9
  • freeintv: 10.9
  • frodo: 10.9
  • fuse: 10.9
  • gambatte: 10.9
  • gearboy: 10.9
  • gearcoleco: 10.9
  • gearsystem: 10.9
  • genesis_plus_gx: 10.9
  • genesis_plus_gx_wide: 10.9
  • gme: 10.9
  • gpsp: 10.1
  • gw: 10.9
  • handy: 10.9
  • hatari: 10.9
  • lowresnx: 10.9
  • lutro: 10.9
  • mame2000: 10.9
  • mame2003: 10.9
  • mame2003_plus: 10.9
  • mame2010: 10.9
  • mame: 10.9
  • mednafen_gba: 10.9
  • mednafen_lynx: 10.9
  • mednafen_ngp: 10.9
  • mednafen_pce_fast: 10.7
  • mednafen_pce: 10.7
  • mednafen_pcfx: 10.9
  • mednafen_psx: 10.9
  • mednafen_saturn: 10.9
  • mednafen_snes: 10.9
  • mednafen_supergrafx: 10.9
  • mednafen_vb: 10.9
  • mednafen_wswan: 10.7
  • melonds: 10.9
  • mesen-s: 10.9
  • mesen: 10.9
  • mgba: 10.9
  • mrboom: 10.9
  • mu: 10.9
  • nekop2: 10.9
  • neocd: 10.9
  • nestopia: 10.9
  • np2kai: 10.7
  • nxengine: 10.9
  • o2em: 10.9
  • oberon: 10.9
  • opera: 10.9
  • parallel_n64: 10.7
  • pcsx_rearmed: 10.9
  • picodrive: 10.6
  • play: 10.14
  • pocketcdg: 10.9
  • pokemini: 10.9
  • potator: 10.9
  • ppsspp: 10.9
  • prboom: 10.9
  • prosystem: 10.9
  • puae: 10.6
  • px68k: 10.7
  • quasi88: 10.9
  • quicknes: 10.9
  • race: 10.9
  • reminiscence: 10.9
  • retro8: 10.9
  • sameboy: 10.9
  • scummvm: 10.9
  • smsplus: 10.7
  • snes9x2002: 10.9
  • snes9x2005: 10.9
  • snes9x2005_plus: 10.9
  • snes9x2010: 10.9
  • snes9x: 10.9
  • squirreljme: 10.9
  • stella2014: 10.7
  • stella: 10.9
  • tgbdual: 10.7
  • theodore: 10.7
  • thepowdertoy: 10.15
  • tic80: 10.15
  • tyrquake: 10.9
  • uzem: 10.9
  • vba_next: 10.9
  • vbam: 10.9
  • vecx: 10.9
  • vemulator: 10.9
  • vice_x128: 10.9
  • vice_x64: 10.9
  • vice_x64sc: 10.9
  • vice_xcbm2: 10.9
  • vice_xcbm5x0: 10.9
  • vice_xpet: 10.9
  • vice_xplus4: 10.9
  • vice_xscpu64: 10.9
  • vice_xvic: 10.9
  • virtualjaguar: 10.9
  • vitaquake2: 10.9
  • x1: 10.9
  • xrick: 10.9
  • yabause: 10.9

We intend to drive down the requirements even lower in the coming months. For C++-based cores, the lowest we can go is 10.9. Going lower would require installing an older SDK version. For C-based cores, the lowest we can go is 10.4 for Intel-based architectures.

Project IO – Continued

You’ve read in our previous blog post that we were working on a long-term project to wrap/abstract all file system I/O in cores, and also correct and improve cores along the way. This work has continued for version 1.9.12, and we are happy to report that various cores have been improved substantially as a result.

Below are all the cores we managed to cover so far. The ones listed in bold are the new cores we have covered since 1.9.11.

Project IO – FCEUmm improvements

We replaced all direct file access in the core with VFS routines (libretro/RetroArch#12949)

In addition, it turned out that this core had been violating the libretro API for some time by setting need_fullpath = false but then requiring the content fullpath to detect the region of iNES v1.0 ROMs. This PR fixes the issue by setting need_fullpath = true by default, but then lifting this restriction for frontends that support the RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE environment callback (which allows a valid content name to be extracted even when using a frontend-provided data buffer)

Built-in Game Genie support

FCEUmm has long supported emulation of the Game Genie cartridge add-on, but this is currently unavailable in the libretro core. 1.9.12 wires up said functionality:

A new core option Game Genie Add-On (Restart) has been added (disabled by default)
In order for the option to apply, the Game Genie ROM file named gamegenie.nes must be present in the frontend system directory
Game Genie support is disabled for FDS and arcade content
Save states do not function (and are disabled) while the Game Genie boot screen is open
After enabling Game Genie Add-On (Restart), launching a game will cause the Game Genie boot screen to appear. Codes can be entered with the gamepad (as on real hardware): D-Pad to move, A to select, B to delete. For example:

Super Mario Bros.
YSAOPE + YEAOZA + YEAPYA Start on World 8

Why would we want this functionality, when the regular cheat interface is already available? Because:

* It provides an authentic experience
* It enables cheats when using frontends that don’t support the regular cheat interface
* All the code was already in place, and it was easy to enable 🙂

In addition, during the process of implementing this, the core’s OSD messaging code was overhauled and cleaned up. OSD warnings will be displayed when appropriate if the Game Genie ROM file is missing, and also if the FDS bios is missing. OSD message durations have been shortened a little, and the core makes use of the extended messaging interface when available.

Color palette switching

At present it is difficult to compare the core’s Color Palette options, because these can only be set via the quick menu. 1.9.12 adds the ability to switch to the next/previous colour palette by holding RetroPad L2 and pressing D-Pad Left/Right while content is running.

Memory leaks fixed

Numerous memory leaks have been fixed while going over this core. This should benefit in particular all the statically linked platforms, such as game consoles.

Project IO – SameBoy improvements

1.9.12 makes the following changes to the core:

Direct file access has been replaced with VFS routines (libretro build only) (Cores with straight stdio file I/O RetroArch#12949)

The core now sets need_fullpath = false, such that content is loaded from the frontend-supplied memory buffer. (Cores that should be turned into need_fullpath = false)

Since the core no longer receives a content path, automatic ROM type detection cannot be based on file extension (.gb, .gbc). We now therefore inspect the ROM header, which means we can also distinguish SGB-enhanced content. As a result, the System – Emulated Model core option has been modified such that the Auto settings are:

Auto Detect DMG/CGB (default): Emulated hardware will be set to either Game Boy or Game Boy Color depending upon the ROM.
Auto Detect DMG/SGB/CGB: Emulated hardware will be set to either Game Boy, Super Game Boy or Game Boy Color depending upon the ROM.
A new Auto Detected SGB Model has also been added, to enable selection of which type of SGB hardware to emulate when content is detected as being SGB-enhanced.

Since it was necessary to edit the core options anyway, these have been updated to v2 and option categories have been added.
Note that all changes here (apart from two .gitignore additions) are limited to the libretro directory – no ’emulator’ code has been modified.

Fixes issue #58 – ‘Better Auto System Model Support #58’
Fixes issue #52 (since the core no longer loads ROMs directly) – ‘Can’t load ROM files with special characters in filename’

PCSX ReARMed – Improvements

Lots of improvements have been made to PCSX ReARMEd courtesy of gameblabla –

  • Literals are deduplicated, so there’s no guarantee they will be stored next to each other, even if they’re written sequentially. verify_dirty and get_bounds must use the offsets on each instruction, instead of assuming values are stored sequentially. According to neonloop, this fixes a dynarec crash in FF7 on ARMv5 platforms like the F1C200S as used in the TrimUi handheld. Given that the old3DS is ARMv6, it may also possibly fix some crashes there as well.
  • GTE stalls/timings – This is to fix an issue with Battle Arena Toshinden 1 and Zero Divide going too fast. To test the GTE fix with Battle Arena Toshinden : Boot the game and go to “” at the titlescreen. Then, choose any character except rungo and select Rungo for the computer.
    Before, the game would go too fast. Now, it will run at the correct speed. (well very close, PCSX rearmed’s clock counting is still kinda finicky). The fix in question was inspired by a similar fix from PCSX-Revolution. Might also fix NBA Jam Extreme.
  • Fix for Armored Core misdetecting a Link cable being detected -fFor some reason, the game would detect that a link cable is plugged in and disables the local multiplayer as a result.
  • Various CDROM fixes from Swanstation and Mednafen. These fixes aim to address the inaccuracies of some CDROM commands and make it on par with nocash’s doc and mednafen. So far, it mostly fixes some delay issues in the Simple 1500 sound novel game as well as F1 2000 (which is notoriously time sensitive).
  • Merge several fixes from PCSX Redux and adjust delay for SetLocPending. There’s a game, PoPoLoCrois Monogatari II, that unfortunately locks up during the intro screen.
    I should have known that code was wrong as Mednafen did not have anything like that in their code either, hence the confusion.Their fix however still don’t include the Driver fix so the game would still crash if we don’t have the “+ Seektime”.
    To be honest, i’m not sure why the PCSX Reloaded team did it this way…
    In any case, i adjusted it so it doesn’t mess up the audio for Driver’s titlescreen and doesn’t crash in Worms Pinball either.
    Seems like setting it to 100000 was not enough for that game.

    I noticed the fastword and FastBackward were not being used in any way.
    Looked at Mednafen and all they do is just adjust the cursector
    and make sure that fastword & backword trigger the AUTO_REPORT code so i did the latter.

  • CDROM: Rename Reset+Init commands, fix “This is Football 2” lockup
  • CDROM: Ignore sectors with channel number 255 – This was tested on “Blue’s Clues : Blue’s Big Musical” and it fixed the missing audio there.
    Taxi 2 is also said to be affected by this.
  • ICache emulation (Interpreter) from PCSX redux. Known games to be affected by the lack of or improper ICache emulation : Formula F1 99, Formula F1 2000 (EA), Formula One Champion Season 2000
    Formula One Arcade, Formula F1 2001 (Confirmed to be fixed), Buster Bros. Collection, ISS Pro 98
  • Dare to set MDEC_BIAS to 10 – This based on an original fix by dmitrysmagin in PCSX4ALL. “This fixes graphic artifacts during cinematics in Vandal Hearts and R-Types, other games seem to be unaffected. (?)”
  • GTE: Fix gteH division and sign extension (from PCSX4ALL) – Original comment by senquack :
    “gteH register is u16, not s16. DIVIDE macro/func assumed it was
    s16 for some reason. Behavior now matches Mednafen.” I also put in there the “GTE_USE_NATIVE_DIVIDE” stuff but currently unless manually enabled, it’s not used.
    You may wish to use this on some low end platforms but that’s up to you.
  • [SPU] Emulate SPUSTAT[5:0] as a mirror of SPUCNT[5:0] – I have tested the fix against Loonies 8192 (a PSn00bSDK made homebrew game) and it no longer locks up during loading. This affects all games and demos that uses PSn00bSDK. (I’ve been told it’s unlikely this will affect games that uses the official SDK)
  • Implement fix from Mednafen for Fantastic Pinball Kyuutenkai – this also fixes ‘Multi Track games crash on .CHD’.
  • CDROM timing changes – fixes Crash Team Racing’s intro music cutting off too soon – FF8 Lunar Cry FMV freeze (Disc 3) – Worms Pinball not booting – Xenogears (Deus fight)
  • Fix CD Volume issue in Star Wars Dark Forces – CD Volume is 16-bits signed, not unsigned.
    Otherwise in Star Wars – Dark Forces : if you lower the music volume slider all the way down, the volume will wrap around and instead be set at the highest volume.

Ozone – new color themes

Solarized Light theme for Ozone menu driver
Solarized Light theme for Ozone menu driver
Solarized Light theme for Ozone menu driver
Solarized Light theme for Ozone menu driver
Solarized Dark theme - Ozone
Solarized Dark theme – Ozone

Two new color themes got added – Solarized Light and Solarized Dark.

Libretro additions – Enable SRAM for contentless cores

Before, the saving/loading of SRAM data is disabled for contentless cores – which means that cores such as 2048 have to handle save data internally instead of utilising frontend-provided functionality.

1.9.12 simply disables this artificial and unnecessary restriction.



  • 3DS: Ensure parallax barrier is disabled when ‘3DS Display Mode’ is ‘2D’
  • COMMAND: Command interface should work again
  • INPUT/HID: Rewrote the HID deregistration algorithm; it should no longer cause issues when dealing with multiple pads of the same HID/VID combo
  • INPUT/HID: Fix initialization bug that caused wiimotes to fail to register without an accessory attached
  • INPUT/HID: Fix Wiimote regression
  • INPUT/HID/MAC: Get Sony Sixaxis (DualShock 3) working on MacOS
  • INPUT/UDEV: Add extra abs check for dolphinbar
  • INPUT/UDEV: Add relative left mouse button when pointer device is not abs
  • INPUT/WAYLAND: Fix keyboard input on Wayland – fixes ‘Certain cores ignore user input’
  • NETPLAY: Improvements from Cthulhu
  • OPENDINGUX: Fix HAS_ANALOG/HAS_MENU_TOGGLE defines in sdl_dingux joypad driver
  • LIBRETRO: Enable SRAM for contentless cores
  • LIBRETRO: Add environment callback to get the rate retro_run is called – GET_THROTTLE_STATE and RETRO_THROTTLE_UNBLOCKED environment callback
  • LINUX: Update metadata manifest
  • MENU/OZONE: New themes – Solarized Light, Solarized Dark
  • WINDOWS/WIN9X: Fix non-ASCII text display in window title

RetroArch 1.9.11 released!

RetroArch 1.9.11 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here. The next version of Lakka (with an updated RetroArch 1.9.11 version) is scheduled to be released very soon!

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 to 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!


Steam information

In case you have missed our previous announcement, take the time to read this article.

TLDR – we switched over to the Soldier runtime for Steam Linux builds which should increase compatibility with various Linux distributions.

As for how things are progressing on Steam, we are currently waiting on new depots before we can add the next batch of core DLCs. Stay tuned!

Miyoo – Pocket Go, PowKiddy Q90-V90 and New BittBoy now supported

We now have an official build (dubbed Miyoo) for the cheap impulse purchase handheld consoles listed below:

  • Pocket Go
  • PowKiddy Q90-V90
  • New Bittboy

These are cheap, low-spec ARM handheld consoles powered by OpenDingux that can be bought for $50 or less. Currently we have only a few cores available in this official version, but expect us to expand the cores list significantly soon. And as a result of the initiative Project IO, expect cores to become more suitable for low-end devices like this and its ilk as well. We care very much about continuously improving our cores so that they become more suitable for the low-end spectrum of devices. And the nice thing about that is that this ends up benefiting the high-end devices as well.

NOTE: We are not affiliated or have any association with the companies behind these devices.

HID subsystem unification – WiiU Gamecube adapter now works on Mac

Previously, the WiiU and Mac ports used a completely different HID subsystem. This has now been unified, so that both WiiU and Mac use the same underlying system.

Thanks to this, Mac RetroArch gets some nice additions, such as Gamecube WiiU adapter support. It should also work on WiiU RetroArch itself. Currently it only works with the first gamepad in controller port 1.

Further, author gblues remarks: “I don’t have any of the devices in order to confirm, but I think the other HID devices (SNESUSB, HID-capable PS4 controllers, etc.) should start working.”.

NOTE: While the WiiU side has been tested, there might still be things that don’t work like they did before. Hopefully whatever issues are found can be patched up in subsequent versions.

RetroArch PS2 – Resolution switching support

1.9.11 provides the ability to change the resolution for RetroArch PS2. The approach used is based on how it was implemented in the past for the Wii.

We finally have 240p support for RetroArch PS2! 240p probably is recommended to play on CRT. However, 480p is recommended for HDTV (component cable is needed however for progressive scan).


  • Be able to change resolution on PS2 (it’s possible to use 240p and 288p modes now)
  • You can center the video content on the CRT screen (new settings option for Video Offset X/Y)


You need an RGB SCART cable for 240p/288p video modes.
You need an AV component cable for 480p/576p. Be aware that 576p is only available for the latest PS2 console versions (SCPH-750XX and higher).

Project IO – Wrapping file I/O

We have put in an extraordinary amount of work into our core library and trying to update them one by one so that they no longer use direct file I/O where possible. We are of course nowhere near done with this yet, but along the way it has given us the opportunity to do quality control checks on cores, and fix issues where necessary. Think of it as a glorified quality control check if you will.

Here are the cores we managed to cover thus far:

As you can see considering this list and how many cores Libretro/RetroArch has in total, We are nowhere near done yet of course.

Why are we doing this? Both the UWP/Xbox port and the Android port require it. Direct file I/O is more and more beginning to get sidelined on these platforms due to ‘security concerns’. In order to achieve this, each core that needs to use disk I/O will need to go through libretro’s VFS layer (Virtual File System).

Along the way, we have investigated if certain cores are not better off doing away with file I/O altogether, and if the input file can just be passed to the core as a memory buffer. For some cores, we have done just that. Other issues we found in other cores were memory leaks (sometimes related to disk I/O), and we took the time to plug those leaks.

Other design considerations along the way involve a core writing to multiple config files – for the cores we maintain ourselves, we try to avoid this. Instead, settings should just be part of the core options instead. So to that end, we will be modifying cores like Prboom (the Doom engine core) so that it no longer writes an auxiliary prboom.cfg file inside the saves directory, but instead writes those values back to the core options. This is going to be a bit tricky since the Prboom core allows you to access and change the settings in-game with its built-in Setup menu. In order to accomplish being able to change core options on the fly programmatically, jdgleaver graciously implemented an extension to the libretro API that allows us to do this.

It might be worth mentioning what kind of approach we take to file I/O in a core.

  • If a core’s input files (read: ROM for an emulator core) can fit reasonably into memory without exhausting main RAM, we are always in favor of setting ‘need_fullpath = false’ for a core. This way, the frontend can pass the content to the core as a memory buffer. Advantages of this? soft-patching support covered by the frontend. Other advantages are not limited to but include: less memory copies (see the next point), better performance due to no disk I/O after initial load, etc.
  • In case the memory buffer can be flagged as ‘persistent’, it can even remove the need for additional memory buffer copies in the core. Meaning less RAM being used. We have found that we unfortunately cannot do this for every core, as in some cases, a core might still be writing to the memory buffer after initial setup/reading of the input file (think of memory patching). In such cases, the memory buffer is not really persistent, so the core itself still has to maintain its own memory buffer copy.
  • If we can avoid disk I/O in a core, we try to do it. There are multiple reasons for this. One is performance : disk I/O can be by far one of the biggest bottlenecks in your system, and its performance can be entirely variable and random depending on what storage device you’re using. The other one is because from the perspective of a core, we don’t want users to have to place specific config files in specific places in order to change settings. Ideally, as many settings as possible are just implemented through core options so that the user always knows that he only needs to edit this one file instead of several stray files. This is obviously the goal, and it might still be the exception to the rule, but we’ll keep going through cores and seeing what the status of it is in certain cores, and make suitable adjustments.
  • Disk I/O happening during runtime is rarely a good idea from a performance perspective. You run the risk of introducing micro stutters and/or other undesirable issues. We therefore try in libretro cores as much as possible to avoid direct file writing to log files or any other examples of direct disk I/O for the duration of a core. For instance – this is the reason why the frontend is in control of SRAM saving/loading in libretro since its inception. Games like Shiren The Wanderer on SNES would write to SRAM as a ‘scratchpad’ every single time you move or press a button in the game. If you were to write to disk for every single step you take, not only do you incur wear and tear on storage devices with a limited amount of max read/writes like SSDs, but you’re also creating performance issues due to disk I/O. Hence our reason for always being mindful of what gets written to disk or read from disk in general.
  • Another issue relating to the location of files on disk – for the cores that we self-maintain, we like to be able to not demand of the user that they need to place required asset files in specific locations, like the system dir. Of course this is unavoidable for things like BIOS files, but for certain assets that the emulator itself provides, an effort should be made to try to embed these resources into the core so that it’s not the user’s problem to have to place all these cores somewhere. This increases core portability and makes it so the only thing a user has to care about is just moving a core over to the core directory, maybe supplying a BIOS in the system dir, and he is done from that point on and off to the races.

Expect us to be going over more and more of the cores. The Google Play Store (and Android itself) is pretty much going full-force in sandboxing disk I/O, and Xbox UWP has its own issues when it comes to direct file I/O (apparently it copies files that use direct disk I/O over to a temporary dir first before touching them or reading them, which can get clogged up fast). So it’s important that a lot of the cores have been covered by the time 1.9.12 rolls out.

Project IO – Improvements to cores

Here is a small example of the kinds of improvements that have been made to various cores as a result of Project IO that users will be able to appreciate and notice:

  • FCEUmm – Fixed a bug where it would cause the core to fallback to core options with no sublabels.
  • Game Music Emu/GME – Content loading has been fixed. Also fixed – a segfault when an invalid content path is provided, a segfault when loading content successively. And a few of the more obvious memory leaks has been fixed (there remain many more in this core though)
  • Gambatte – Now has toggling between palettes by pressing the L/R buttons.
  • Handy – the BIOS has been made optional, previously it was required but was not actually used. EEPROM save files are now generated in the frontend save directory, instead of the content directory. All logging is now performed via the frontend logging callback, and audio processing to libretro has been made more efficient.
  • PocketCDG – A file handle leak has been fixed.
  • RACE – The loading of real BIOS files has been disabled. This never actually worked before (the bios path was not configured corectly), and the use of a real BIOS with RACE is strongly discouraged – the relevant code path is not properly tested, and there are known issues with games.
    A workaround for a rare segfault (buffer overflow) has been added (the underlying cause of the overflow remains unknown, but this at least prevents the core from crashing and seems to have no adverse side effects)
  • QuickNES – Now has toggling between palettes by pressing the L/R buttons.

Direct3D9 driver works again!

RetroArch’s Direct3D9 driver finally works again after a long period of downtime. This is important because of our commitment to old hardware. You will find that many GPUs on Windows might have either spotty OpenGL drivers or they have no OpenGL support beyond OpenGL 1.0/1.1 (hopelessly archaic, a spec dating back to the late ’90s). Your previous options when faced with a graphics card that either doesn’t support OpenGL 2.0 or Direct 3D 10/11 would have been SDL or OpenGL 1.0. Now there is a viable third option – Direct3D 9.

Just to temper expectations:

  • Right now there is no shader support yet. Hopefully later on we can get the Cg and HLSL backends to work.
  • Only RGUI is fully supported as a menu driver right now. The graphics are still not displaying properly when using MaterialUI, Ozone or XMB. So only use RGUI for now with the Direct3D9 driver.
  • It relies right now on Direct3DX for font rendering, which is deprecated. Hopefully we can get rid of this dependency later on.

Of course, if your GPU is more than capable, we’d highly encourage you instead to use Direct3D 10/11/12 drivers in RetroArch. Use Direct3D9 only as a last resort when your GPU absolutely does not support Direct3D 10 and/or later.

NOTE: It will be very unlikely Direct3D9 will get Slang shader support. Most likely it will be limited to the old-style Cg shader format (since HLSL on Direct3D9 is nearly equivalent to Cg). It is our hope that we will be able to reuse the same Cg shaders for both the Cg and HLSL backends, and that people will be able to switch inbetween the two backends. For now, the HLSL and Cg backends are non-functional until further notice.

It is worth mentioning that RetroArch supports a wide variety of Direct3D versions. There is a working driver for Direct3D 8, Direct3D 9, Direct3D 10, Direct3D 11, and Direct3D 12. We do this to cast a large wide net so that we can support as many older GPUs as possible without having to resort to non-hardware accelerated rendering. Direct3D 8 driver will be unlikely to ever get shader support because pixel shading was very much in its infancy back then. Direct3D 9 will likely get Cg/HLSL9 shader support. Direct 3D 10/11/12 meanwhile fully support the new modern slang shader format that other video drivers also use (such as OpenGL 3/Core, Vulkan, and Metal).



  • ANDROID: New launcher logo – will fill the corners on the homescreen
  • D3D9: Driver works again (RGUI only and software rendered cores work, no shader support yet)
  • HID/MAC: WiiU GameCube Adapter now works
  • HID/WIIU: WiiU and general HID subsystem unified/merged
  • INPUT: Refactor menu toggle combo button logic to allow quit combo button
  • INPUT/UDEV: Add mouse relative check and set appropriately to fix issue
  • LIBNX/SWITCH: Splitted Joycon button mapping
  • LIBRETRO: Add environment callback to enable cores to notify the frontend that a core otion value has changed
  • MIYOO: Add initial port
  • OPENDINGUX/RG350: Enable tinyalsa for the RG350
  • PS2: Add ‘Change Resolution’ option
  • PS2: Add option to change video windows offsets
  • STEAM/LINUX: Move to new ‘soldier’ runtime
  • WAYLAND: Remove xdg-shell-v6 protocol
  • WINDOWS: Fix non-ASCII text display in window title
  • WINDOWS 11: Shows Windows 11 version name now (Information -> System Information)
  • UWP: Further improvements to WinRT VFS layer

RetroArch Steam – Important information for Linux users

Hello everyone!

We have been busy working on the Steam version to improve compatibility and stability. Right now, we need to make some changes for the Linux platform. For a long time, we have manually released everything on the Steam, this has now been automated for both platforms. Looking forward you can expect regular updates and soon a nightly branch. However, to simplify RetroArch on Steam we are moving to the same folder structure on all platforms. Additionally, on Linux, we are moving from the AppImage-based release to using the newer soldier runtime available in Steam to increase the likelihood of RetroArch working out of the box on more Linux distributions.

As there is a small risk for breakages for Linux users we felt the need to properly inform about this. So what does this change mean? Currently, the RetroArch base directory on Linux is RetroArch-Linux-x86_64-Nightly.AppImage.config/retroarch which you can see the retroarch’s itself in a subdirectory instead of being in the main directory of the game, so our goal is basically same directory structure for every platform! Due to the chance of data loss our recommendation is to copy everything you care about, for example; save files, options, your cfg files etc. somewhere safe outside the Steam install. While Steam Cloud should keep everything safe, we do still feel the need to mention this, as the changes are not risk-free.

The update is currently scheduled to go out the 3rd of October together with the next frontend release.

RetroArch 1.9.10 released!

RetroArch 1.9.10 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here. The next version of Lakka (with an updated RetroArch 1.9.10 version) is scheduled to be released very soon!

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 to 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!


RetroArch is now finally on Steam!

On September 14, 2021, RetroArch finally appeared on Steam (available here). It is available right now for both Linux (SteamOS) and Windows. See our initial release article here. Since then, we have already had over 100K+ downloads on Steam and over one million visits. Thanks to you all! We aim to make RetroArch the very best it can be.

What you need to know:

  • New cores are coming as DLC additions.
  • There is no macOS version available on Steam yet (but we’d like to!)
  • Remote Play is supported. We make no guarantees as to how well this will work.
  • Steam Cloud sync should be supported for save files.
  • There is work underway on automation – the idea is that both cores and RetroArch on Steam would be updated automatically.

Lastly, we hope that new users can be understanding of the fact that RetroArch’s UI might have a bit of an initial learning curve. We are a small team, and we definitely intend to simplify the UI at least for beginners in the coming months, but we are simply not ready yet. So we hope people are understanding of this and appreciate the swiss knife flexibility and power of RetroArch in the meantime instead of focusing on the overall complexities or whatnot of the UI/UX.

The Steam version should be updated to 1.9.10 soon.

High Dynamic Range fixes for D3D11/D3D12!

  • Fixed contrast to be more correct – now scales from 0-10 linearly and behaves more the way you’d expect it to – changed name to ditch legacy settings users may have
  • D3D11/HDR: Fixed D3D11’s blend, rasterizer and topology states not being set to the sames when using HDR and leaving the menu – caused issues with PCSX2’s Shadow of the Colossus
  • Added ability to skip inverse tonemapper to the shader via the constant buffer using ‘inverse_tonemap’ – set to 0.0f to skip
  • Fixed potential bug when swapping between HDR and SDR and the bit depth not being set correctly


1.9.10 adds a new Picoscale_256x-320×240 video filter. This uses a number of high quality, high performance algorithms developed by irixxxx for Picodrive standalone to upscale 256×224, 256×239 and 256×240 content to 320×240 (content of any other resolution is passed through unchanged).

Much like the existing Upscale_256x-320×240 filter, this is intended for use on platforms/devices with native 320×240 resolution support, where it greatly reduces aliasing while producing a significantly sharper image than conventional (hardware) bilinear filtering.

Three filter variants are provided:

Picoscale_snn_256x-320×240: ‘Smoothed’ nearest neighbour
Picoscale_bl2_256x-320×240: 2-level-bilinear with 2 quantized weights
Picoscale_bl4_256x-320×240: 4-level-bilinear with 4 quantized weights

Essentially, both image ‘smoothness’ and performance requirements increase in order of snn -> bl2 -> bl4.

Go here to see several screenshots demonstrating the output of each filter type: (click for full-size images)

These filters are highly efficient. Tested with the Snes9x 2005 Plus core (a lightweight core which is nonetheless at the upper limit of many low powered handheld devices), we see the following increase in total performance overheads when each filter is applied (note that the existing Upscale_256x-320×240 filter is included for comparison):

Filter Performance overhead
No filter +0%
snn +8%
bl2 +13%
bl4 +30%
upscale_256x_320x240 +27%

The performance overheads relative to the existing Upscale_256x-320×240 filter are:

Filter Performance overhead
snn -69%
bl2 -45%
bl4 +14%

Thus SNN and BL2 in particular have very little performance impact.

All credit goes to irixxxx – many thanks for giving us permission to use your work in RetroArch!

In other video filter news, the Switch/libnx port now also has video filters support!

Playlist Manager – New ‘Refresh Playlist’ option

The manual content scanner provides a quick and easy method for generating playlists – but there exists no convenient way to update playlists that already exist. If a user adds content to a ROM directory then they must go to the trouble of reconfiguring and re-running the manual scan (including selecting the ROM directory, system name, default core, etc.); if they have simultaneously removed some files, then they are also obliged to go to the relevant ‘playlist manager’ menu and ‘clean’ the playlist. This is time consuming and tedious.

1.9.10 adds a new Refresh Playlist option to the ‘playlist manager’ menus. When selected, the current playlist will be re-scanned with the manual scan configuration that was last used to generate/edit the playlist. ‘Refreshing’ a playlist also populates all entries of the Manual Scan menu – so it is easy to tweak values should the user wish to update the allowed file extension list, etc..

In addition: a new Validate Existing Entries option has been added to the manual scan interface. When enabled, any existing playlist is checked before commencing the content scan; entries referring to missing files, or files with invalid extensions, are then removed.

Validate Existing Entries is disabled by default, but automatically enabled whenever a playlist is refreshed. Thus selecting Refresh Playlist will both add new content and remove missing/invalid entries.


  • This functionality will not work with playlists generated before this commit, since they will lack the required metadata. It will be necessary for the user to re-run a ‘normal’ manual scan for any playlist they might want to later refresh; thereafter, the Refresh Playlist option will appear in the relevant ‘playlist manager’ menu and maintenance becomes a one-button affair.
  • We can only ‘refresh’ playlists created via the manual content scanner – not the database scanner. When performing a database scan, there is no practical method for extracting all required metadata for a repeat operation.

3DS – Add bottom screen idle state

Some nice QoL improvement for RetroArch 3DS users! 1.9.10 allows the bottom screen on the 3DS to be disabled when idle. On compatible devices, the bottom screen backlight is toggled.

If no core is running, the bottom screen is always idle with the backlight turned off.

If a core is running with the bottom screen in it’s ‘default state’, the bottom screen will idle in ~6 seconds. The displayed text “Tap the bottom screen to go to the Retroarch menu” fades out and the LCD backlight is disabled.

When interacted with the screen, the backlight turns on and toggles the menu as usual.

When in the menu / paused, the bottom screen remains active.

RetroAchievements/Cheevos improvements

Don’t write achievement credentials to override

Ignores changes to cheevos_token, cheevos_password, and cheevos_username when generating config override files.

While this is particularly important for not remembering a stale authentication token, not entering any credentials until after loading content, and then saving the override could lead to the actual password being stored in the override even after the authentication token is generated and put in the master settings file.

Since neither the authentication token nor the password should be stored in the override file, I believe it also makes sense to exclude the username, as having a per-override username would also require a per-override authentication token or password. If a players wants to have a separate retroachievements user for a specific core, they can still manually add the entries to the override file, but those will be cleared out any time they update the override file from within the application. A better solution would be to use separate master configs and launch using the –config option.

Disable slowmotion when enabling hardcore mode

There’s already code preventing the user from toggling (or otherwise using) slowmotion when achievement hardcore mode is enabled. Slowmotion provides an advantage for the user’s reflexes, so we don’t allow it in hardcore mode.

This addresses an issue where the user could enable hardcore mode with slowmotion already toggled on, and it would remain on. The user would be locked in slowmotion as the toggle would be disabled, but with enough patience, it could be worth it. With this change, slowmotion is disabled when enabling hardcore mode.



  • 3DS: Add bottom screen idle state
  • 3DS: Add unique IDs for Gearboy/Gearcoleco/Gearsystem, correct CAP32 code
  • 3DS/SAVESTATES: Fix RAM states to file when core deinits
  • AUDIO/MIXER: Pad sample buffers to prevent potential heap-buffer-overflows when resampling (fixes crash when using 30 kHz menu audio files)
  • AUDIO/LINUX/SNAP: Add JACK support
  • CHEEVOS: Don’t write achievement credentials to overrides
  • CHEEVOS: Disable slowmotion when enabling hardcore mode
  • D3D9: Fixed MVP matrix issue for RGUI texture (main game frame still won’t show up though)
  • D3D11/D3D12/HDR: Fixed contrast to be more correct – now scales from 0-10 linearly and behaves more the way you’d expect it to – changed name to ditch legacy settings users may have
  • D3D11/HDR: Fixed D3D11’s blend, rasterizer and topology states not being set to the sames when using HDR and leaving the menu – caused issues with PCSX2’s Shadow of the Colossus
  • D3D11/D3D12/HDR: Added ability to skip inverse tonemapper to the shader via the constant buffer using ‘inverse_tonemap’ – set to 0.0f to skip
  • D3D11/D3D12/HDR: Fixed potential bug when swapping between hdr and sdr and the bit depth not being set correctly
  • D3D11/D3D12/HDR: Added numerous helper functions to help create the correct values to colour the UI – normally the white UI elements should be rendered at paper white not max brightness for various reasons
  • BUGFIX/ANDROID: Fix crash that could happen on Android with Sameboy core – would crash on rumble function
  • GFX/WIDGETS: New regular widget message appearance
  • INPUT/MOUSE: Add distinct mouse zero index label for drivers that do not support multimouse
  • INPUT/RUMBLE: Add generic rumble gain to input settings
  • INPUT/UDEV/X11: Add workaround to fix keyboard input when using X11 + Udev
  • LIBNX/SWITCH: Add Video Filters support
  • LOCALIZATION: Fetch translations from Crowdin
  • PLAYLISTS: Add ‘Refresh Playlist’ option
  • STEAM: Initial release on Steam
  • UWP/VFS/XBOX: Improvements and bugfixes to UWP VFS driver
  • VIDEO/REFRESH RATE: Automatic PAL/NTSC refresh rate switch where available – as long as the platform display server allows changing refresh rates and the display has the desired refresh rate
  • VIDEO FILTERS: Add ‘Picoscale_256x-320×240’ video filter
  • WIIU/HID: Fix analog inputs on HID devices

RetroArch finally released on Steam!

Today, RetroArch has finally been released on Steam for both Windows and Linux/SteamOS. The Store page can be found here.

Differences between the Steam version and regular version

Functionally, RetroArch on Steam should be identical to the version you can get on our website, except for the following:

  • There is no Core Downloader to stay compliant with Valve/Steam’s Terms of Service.

Instead, you can download and install cores in either one of two ways:

  • Manually dragging the core file (a .dll file on Windows, .so on Linux) over to the ‘cores’ directory of RetroArch Steam.
  • Installing the core as a DLC.

10 Cores Available At Launch

We have decided to launch with 10 cores at launch. These cores are available both for Linux/SteamOS and Windows users. A ‘core’ is a program that RetroArch loads. It can be an emulator, game, or any other program. RetroArch loads this ‘core’, and from there RetroArch becomes the program.

The cores currently available as DLC on Steam are as follows:

First, you install RetroArch on Steam. After that, you can install the cores either on Steam’s browser page by clicking ‘Manage DLC’ and easily installing them all at once, or you can go to each respective page and install it from there.

More cores will be coming as DLC soon. We have no ETA on when these will arrive, but it will likely be a dripfeed of new cores on a periodic basis as it takes a lot of time preparing the pages, descriptions, logos, previews and whatnot that a Steam page requires.

Things to know

  • RetroArch on Steam is available for 64bit Windows/Linux users only for now. We are not sure if we will be supporting 32bit on Steam as well.
  • Builds right now are not automated but might be later on.
  • There is no macOS version available on Steam yet. There are no plans yet for this, but if there are updates on this, we will tell you.
  • Remote Play is supported. We make no guarantees as to how well this will work.
  • Steam Cloud sync should be supported for save files.

Lastly, we hope that new users can be understanding of the fact that RetroArch’s UI might have a bit of an initial learning curve. We are a small team, and we definitely intend to simplify the UI at least for beginners in the coming months, but we are simply not ready yet. So we hope people are understanding of this and appreciate the swiss knife flexibility and power of RetroArch in the meantime instead of focusing on the overall complexities or whatnot of the UI/UX.

RetroArch 1.9.9 released!

RetroArch 1.9.9 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here. The next version of Lakka (with an updated RetroArch 1.9.9 version) is scheduled to be released very soon!

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 to 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!


High Dynamic Range support for Direct3D 11/12 drivers!

We have now added HDR (High Dynamic Range) support to RetroArch’s Direct3D 11/12 driver thanks to a generous contributor!

What you should know:

* The HDR settings can be found in Settings -> Video when you are using the Direct3D 11 or 12 driver. In order to change to D3D11/12, go to Settings -> Drivers, and change Video to ‘D3D11/12’.

In case you don’t see the option, and you have made sure first that your driver is set to Direct3D 11/12, it might be that HDR is disabled in Windows 10. Make sure HDR is enabled in Windows in case you don’t see it pop up. In Windows, go to ‘Display Settings’ (pictured below) and make sure the HDR setting is turned on. If it doesn’t show up, your display device might simply not support HDR.

* We now let Direct3D 11 compile frontend shaders against Shader Model 5.0 (SM 5.0) in case your graphics card driver supports D3D11 Feature Level 11.0 or higher. Previously, it would always compile frontend shaders against Shader Model 4.0, and unfortunately the AMD FSR shader that has just been added needs SM 5.0 capabilities in order to work.

* While HDR already works on the UWP version on PC, on Xbox there are currently several deal-breaking display issues with it, so it remains disabled there for now.

Thoughts on future RetroArch HDR support

* We still need HDR implementations for other modern graphics APIs, like Vulkan (and Metal and/or OpenGL core if possible). We have no ETA on when this will be done. Ideally a generous contributor submits it to us, just like what happened with D3D11/12.
* Slang [the shader format] will need HDR support as well in order to take full advantage of the expanded gamut. Right now the author that made the D3D11/12 implementation made a reference shader that he says can already take advantage of HDR – check out his new shader ‘integer-scaling-scanlines.slangp’. You can find this preset inside the folder ‘scanlines/shaders’. It is an integer scaling mode pixel perfect scanline shader for use with low resolution monitors, underpowered machines, the new HDR mode in RetroArch and for people who want pixel sharp scanlines with absolutely no moire patterns (but with the downside that integer scaling must be on and so not fill up the screen or over fill the screen).
* It needs to be pointed out that HDR support on Linux in general is very premature right now compared to Windows. Windows happens to be a bit further along at this point in this department. Hopefully this inequality will be addressed shortly. But just know that this might tie our hands a bit.

3DS Bottom touchscreen menu

A fully interactive touchscreen menu for the bottom screen of the 3DS has been added by the very generous contributor bulzipke!

The following functions are currently available on this screen:

Resume Game
Toggles RetroArch menu, closes it and goes back to the game.
Create Restore Point
If you touch this, save it to SD card.
If the Save State Thumbnails option is enabled, you can see Screenshots at the Load Restore Point
Load Restore Point
Shows the date when you saved it. (And show Screenshot if exists). If you change the State Slot, bottom menu will refresh Screenshot / date / state.

Some important convenience features came as a result of this too. Savestate loading / saving to RAM instead of to disk was added, so it’s possible to have temporary suspend points without writing to disk. The state is only saved to disk when either:

* Closing the lid of the 3DS
* Pressing the HOME button
* Exiting RetroArch

This gives things a very seamless feel. Not only that, the saving of state to RAM is orders of magnitude faster vs. saving to disk, so now while doing these operations, things no longer slow to a crawl.

There’s also the option to disable the bottom screen –
Settings->User Interface->3DS Bottom Screen

Although this option will not affect performance, it is estimated that “Tap the Touch Screen to go to the Retroarch menu” text may add additional battery consumption to draw the screen. So it’s always nice to have the option to toggle it off if need be.

AMD FidelityFX Super Resolution (FSR) has been ported to Libretro/RetroArch!

A very generous contributor submitted a fully working implementation of AMD FSR as an slang shader for use in RetroArch! This shader should be fully compatible with the following video drivers in RetroArch:

* Metal
* OpenGL Core (or at least 4.0 with regular OpenGL driver)
* Vulkan
* Direct3D 11 (if your card supports Direct3D 11 Feature Level 11.0 or higher)
* Direct3D 12

We have had to update our Direct3D 11 driver to allow for the use of Shader Model 5.0 when your GPU supports it, since this shader requires SM 5.0 features and wouldn’t work on D3D11 without it.

The contributor mentions in his pull request that implementing AMD FSR as a pixel shader seemed to work out just fine despite AMD insisting it is supposed to be implemented as a compute shader.

On top of this straight port of FSR, he also took the time to remake the SMAA shader. It is now supposed to be less of a port and just uses the original library unmodified, while adding a few features and higher quality search textures. The contributor wasn’t too happywith the quality of this AA and wanted to check if it could be improved, mainly because FSR requires good looking AA (Anti-Aliasing) otherwise it wouldn’t make much sense. In the end, quality gains were marginal, pretty much imperceptible. Despite that, there is also an AMD FSR+SMAA preset that you can use.

You can see some comparison images down below – to the far left is the image without any shaders, in the middle is AMD FSR, and to the right is AMD FSR + SMAA applied.

Ys Seven undub with the PPSSPP core in RetroArch. The image is zoomed in here by 2x. Left: no shaders, middle: AMD FSR shader, right: AMD FSR + SMAA.

1st image: Gradius V with the PSCX2 core in RetroArch, zoomed in to showcase how FSR can combat aliasing. Left: no shaders, middle: AMD FSR, right: AMD FSR + SMAA. Note how the jaggies become less pronounced by applying FSR, and how they become even less with SMAA added to the mix.

2nd image: Gradius V with the PCSX2 core in RetroArch, zoomed in. Top: no shaders, middle: AMD FSR, right: AMD FSR + SMAA.

3rd image: Panzer Dragoon running on Kronos with AMD FSR shader (click on the image to see it without shader applied).

Add enhanced search functionality to the ‘Cheats’ menu

1.9.9 adds enhanced search functionality to the Quick Menu > Cheats menu, similar to that in the core downloader and core manager menus:

In addition, the search feature may be used to filter cheats that are currently on or off: this is done by searching for the ‘key’ string .on or .off

* The key string is case insensitive
* The actual on/off text is localised – it matches whatever is currently shown as the cheat value (i.e. if the user language is set to French, the on key is .Activé
* The leading period was chosen because (a) it should be available on most keyboard layouts, (b) it is available on the first ‘page’ of RetroArch’s OSK and (c) it is easier to type than enclosing the string with brackets, as it is displayed in the cheat value text

Faster sinc resampler and audio conversion for ARM NEON platforms

Previously, the audio sinc resampler and the audio conversion functions only had optimized SIMD codepaths written in ASM for ARM NEON. There are more and more platforms/toolchains now that prohibit or make it difficult to use assembly routines, or strongly recommend you resort to SIMD intrinsics instead.

So we have done exactly that now. All the audio conversion routines (float to signed 16bit integer, signed 16bit integer to float) and the sinc audio resampler now have ARM NEON intrinsic optimized codepaths available instead of just defaulting to C codepaths. This should contribute to performance on platforms like the Mac M1, Android devices, the PS Vita, iPhone devices, and ARM Linux hardware in general (both AArch64/ARMv7).

We have still left in these legacy ASM codepaths behind an ifdef in case someone still has a use for it, but from now on we will try to make sure to offer both intrinsic and ASM codepaths whenever possible, or intrinsic only if both can’t be provided.

Important fixes

Fix cheat when using second instance runahead
Before, using cheats when second instance runahead was enabled caused undefined behaviour because the cheats are only applied to the primary core (and not the secondary one). 1.9.9 fixes the issue. It also ensures that cheats are correctly reapplied when second instance runahead is toggled on while content is running.

Fix menu sounds (audio mixing) when using the ‘sinc’ resampler with quality lower than ‘normal’
Before, if the sinc resampler was used with a quality of lower or lowest, then enabling any ‘menu sounds’ (including cheevos notifications) would completely break in-game audio. 1.9.9 fixes the issue by ensuring that all audio mixer resamplers use the same quality setting as the main one. In addition, we ensure that the same backend driver is used.

1.9.9 also fixes a memory leak when loading system sounds without a driver reinit (i.e. when toggling menu sounds via the menu)

Fixed several crashes that could occur during fullscreen toggle
Fullscreen toggle should now be more robust in cores like PCSX2, Flycast and other 3D-based emulator cores.

Add option to (force-)write current core options to disk
RetroArch saves core options automatically when closing content – but if a badly behaved core causes a crash on close content, then the current core option settings will be lost.

1.9.9 adds a new Flush Options to Disk entry to the Quick Menu > Options > Manage Core Options menu. When selected, this will force the current core options to be written immediately to the active options file.

Since 99% of users will not need this functionality (it was requested for users testing the PCSX2 core) the entry is hidden by default, with visibility controlled via a new Settings > User Interface > Menu Item Visibility > Quick Menu > Show ‘Flush Options to Disk’ option.

This PR also fixes a rather nasty bug related to saving core options: At present, if a user has Use Global Core Options File enabled, and they create then delete a per-game or per-content directory options file via the Manage Core Options interface, when the current options are re-saved to the global file then any settings not related to the current core will be removed (!). This has been fixed by ensuring that all locally stored config file data is properly updated whenever per-game or per-content directory options files are deleted.

Highlight currently selected value in Shader Parameter drop-down lists

Before, when opening a shader parameter drop-down list via Quick Menu > Shaders > Shader Parameters, the selection cursor would always ‘reset’ itself to the top of said list. 1.9.9 ensures that the current parameter value will be auto-selected and marked.

Note that we may replace these shader parameter drop-down lists with keyboard input at some point, but we might as well fix this selection bug in the meantime (since it is so easy to do!).

Allow ‘Vertical Refresh Rate’ to be entered manually via keyboard/onscreen keyboard

Making significant changes to Settings > Video > Output > Vertical Refresh Rate (e.g. 60 Hz -> 50 Hz) is quite tedious, since holding left/right only modifies the value in 0.001 Hz steps.

1.9.9 adds the ability to set this parameter ‘manually’. When Vertical Refresh Rate is selected, a new value can be entered via the OSK or physical keyboard.

For current settings where very long dropdown lists are spawned, we might consider switching over to this style of input instead.

Linux – udev – Look for “ID_INPUT_KEY”, not “ID_INPUT_KEYBOARD”
Very important contribution by icculus (of SDL fame) –

This fixes programs using /dev/uinput to create a virtual keyboard failing to be detected on startup. Usual symptom is some sort of GPIO-based controller on a Raspberry Pi that looks like a keyboard to the OS and can control EmulationStation, but fails to work in-game unless you restart the controller’s program while the game is running (in which case udev_input.c’s hotplug code, which was using the correct string, would pick it up).

Core info cache files are now portable

Core info cache files should now be portable.

The core info cache stores absolute core paths, which breaks portability (i.e. if the cache is enabled and the core directory is moved, cores can no longer be loaded).

In truth, it is a mistake to cache the core path in the first place, since this is already retrieved from the filesystem regardless of whether the cache is enabled. 1.9.9 therefore removes core paths from the info cache, so the correct (dynamically determined) path is always used.

As a result, iOS now has core info cache files re-enabled again, which should lead to an increase in overall core info performance.



  • 3DS: Add bottom touchscreen menu
  • 3DS/SAVESTATES: Save and load save states to and from RAM
  • AUDIO/MIXER: Ensure than menu sounds are re-enabled when calling CMD_EVENT_AUDIO_REINIT
  • AUDIO/RESAMPLER/MIXER: Fix menu sounds (audio mixing) when using the ‘sinc’ resampler with quality lower than ‘normal’
  • AUDIO/CONVERSION/ARM NEON: Add intrinsic NEON versions for float_to_s16/s16_to_float – should lead to optimized codepaths for AArch64/ARMv7 architectures without being dependent on ASM codepaths.
  • AUDIO/RESAMPLER/ARM NEON: Add intrinsic NEON version for lanczos sinc function – should lead to optimized codepaths for AArch64/ARMv7 architectures without being dependent on ASM codepaths.
  • CHEEVOS: Upgrade to rcheevos 10.2
  • CHEATS: Add enhanced search functionality to the ‘Cheats’ menu
  • CHEATS/RUNAHEAD: Fix cheats when using second instance runahead
  • CONFIG: Add option to (force-)write current core options to disk (Quick Menu)
  • CORE INFO CACHE: Remove core path from core info cache. Should make core info caches portable now (for example: you can move RetroArch to a separate dir and they would still work).
  • D3D11: Use Shader Model 5.0 for frontend shaders if D3D11 Feature level is at least 11.0 or higher. Should fix some new shaders that require SM 5.0 (like AMD FSR)
  • D3D11: Add HDR support (not working for Xbox for now)
  • D3D12: Add HDR support (not working for Xbox for now)
  • EMSCRIPTEN: Fixed web player bug with filesystem and runtime
  • INPUT/OVERLAY: Fix overlay input when analog to digital mapping is enabled
  • INPUT/WINRAW: Fix crash when overlay is enabled
  • MAC/METAL: Add Discord RPC support
  • MENU: Allow ‘Custom Aspect Ratio (X Position)/(Y Position)/(Width)/(Height)’ to be entered manually via keyboard
  • MENU: Allow ‘Vertical Refresh Rate’ to be entered manually via keyboard
  • MENU/SHADERS: Highlight currently selected value in Shader Parameter drop-down lists
  • STABILITY: Safer way of avoiding the race condition in audio_driver_sample/audio_driver_sample_batch – we can check audio-suspended to see if we’re doing a fs/windowed toggle – enhances stability when fullscreen toggling/tearing down context
  • STABILITY: When audio driver write callback function fails, don’t turn audio off completely – look if audio_driver_output_samples_conv_buf is non-NULL first before we attempt to write audio – enhances stability when fullscreen toggling/tearing down context
  • STABILITY: Input robustness for cores that use internal threading (full teardown/setup), no audio should be processed at this point in time
  • VIDEO: Screen resolution list sanitizing
  • VULKAN: Fix some Vulkan validation layer errors
  • UWP: Updated icons courtesy of Danp142
  • UWP/XBOX: Disable CPU model check on Xbox as it doesn’t work and can even crash
  • UWP/VFS/XBOX: Code cleanup and simplification of UWP VFS driver

PCSX2 Libretro/RetroArch Core Progress Report – August 2021

We’re very excited to share with you all the work we’ve been putting into the PCSX2 core as of late.

Reducing file requirements

As a general baseline, Libretro strives to make sure that the cores we self-maintain are fairly portable. We’d like not to have the user to require to install several data files inside the System folder in order for an emulator core to work. The problem with the PCSX2 core up to this point was that it was too much of a straight port – PCSX2 by itself writes to dozens of files during startup and logging. However, it also has many config files scattered about the place.

We have cut all this config file reading/writing. Now, the only configuration file that gets written to is the ever-trusty ‘core options config file’ from Libretro/RetroArch.

Furthermore, the only files you need to have in your /pcsx2 folder are your BIOS files inside /pcsx2/bios. Anything else is not necessary. You can still have a ‘cheats’ and _cheats_ws’ folder where you store custom .pnach files for games, but it’s optional and not necessary. Memory cards will continue getting written to /pcsx2/memcards if you used this folder in previous versions of the core, otherwise they will be written in /retroarch/saves/pcsx2.

Other under the hood changes: all the internal GS shaders are now embedded as strings into the GS renderer instead of being loaded in as resource files. We have also spent a lot of time reducing WxWidgets UI dependencies, although we are not quite there yet all the way. The core should also be way smaller as a result. It used to be as big as 10MB but now clocks in as low as 7MB or less.

The core now also uses an internal game database (see here). This is converted at compilation time into a header file and baked into the core. This way, we once again do not require the user to have this game database file inside his/her system folder. Instead, the core comes with nearly everything that the user would need to get started.

Reduced dependencies on Linux

The core used to have many runtime library dependencies before and therefore be quite nonportable across Linux distributions. We have since severely lessened our dependencies on external system libs. Glib, X11 and Libpng have all been eliminated as are other things.

Built-in widescreen patches

The core now has an embedded widescreen patch database. We are going to try and keep this database updated as time goes along. Many thanks to the members of the PCSX2 Forums for posting all these wonderful patches.

Built-in no-interlacing patches

Many PS2 games render in interlaced resolutions. While this might have looked fine on a CRT TV, this can lead to bad image quality when running these games on a modern LCD or OLED display.

Many no-interlacing patches have been written for PS2 games running in PCSX2. These usually come in the form of .pnach patches. However, what we’re attempting to do here is apply these automagically. We want to give the user a seamless experience where they can just insert the game and we try to apply the right no-interlacing patch behind the scenes to make it look as users would expect without having to fiddle with deinterlacing settings.

With a no-interlacing patch, Tekken Tag Tournament on PS2 looks visually indistinguishable from the PS3 version that was released years later
With a no-interlacing patch, Tekken Tag Tournament on PS2 looks visually indistinguishable from the PS3 version that was released years later

So, what we have done is implement a ‘No-interlacing patch’ option to the ‘Deinterlacing’ setting. You don’t need to manually source together a bunch of .pnach patches – simply make sure you set ‘Deinterlacing’ to ‘No-interlacing patch’, and start up the game. If the internal database has an entry for the game, a popup message will show up saying that a no-interlacing patch has been applied. NOTE: The no-interlacing patch is only applied once at startup. If you change it mid-game, you will have to restart PCSX2 in order for these changes to take effect.

In some cases, a game might have a built-in option to remove interlacing. This is what was commonly known as the Progressive Scan option, and it was enabled in many games in the US by press and holding Square and Triangle at startup. For games like Soulcalibur 2/3 and Tekken 4/5, it will then ask you to boot to this progressive mode.

We hope that we can find patches to automate this procedure as well, so that the user doesn’t have to do this manually. In some cases like Tekken 4, people are returning empty handed, for the Gran Turismo games it’s been reported that with the proper patch, it can be changed into always loading in progressive mode.

NOTE: If it can’t find a non-interlacing patch inside the database for the game, it will have the same effect as if the setting were 0 – no deinterlacing will be applied.

Here is a list of all the games we currently have no-interlacing patches for.

IMPORTANT PERFORMANCE HINT: No-interlacing patches (when applied) can be significantly lighter on your GPU’s resources vs. deinterlacing. We can skip several rendering pipelines when we render a non-interlaced image vs. an interlaced one, because the odd and even lines need blending, which is done with separate shader passes.

Many thanks to the members of the PCSX2 Forums for posting all these wonderful patches. If you have new no-interlacing patches you’d love to add to the PCSX2 libretro core, please do not hesitate to contact us. We’d love your contributions.

Built-in 60fps patches

We have implemented an integrated 60fps patch database for a select number of games.

We do have some standards as to which patches we will include. If framerate unlocking results in the game running at double speed, we don’t include the patch. The game has to be able to run at least normally at proper speeds. There can be small inaccuracies like certain physics or animations not updating at a proper 60fps rate, but these we consider to be nonessential.

Please keep in mind that these 60fps patches will increase the system requirements severely in some cases. In some rare instances (like Silent Hill 2), the game might internally slow down at certain spots when experiencing heavy EE/GS load. In such cases, a generous Emotion Engine overclock could help alleviate this. Unfortunately, we have not yet hooked up Emotion Engine/CPU overclocking as a core option, but we intend to do so soon.

God Hand, Space Channel 5 Part 2, Silent Hill 2/3, Rule of Rose, Ico and GTA3 are some of the bigger games that now have embedded 60fps patches
God Hand, Space Channel 5 Part 2, Silent Hill 2/3, Rule of Rose, Ico and GTA3 are some of the bigger games that now have embedded 60fps patches

Here is a list of all the games we currently have 60fps patches for. For some games, you might need specific versions of the game (from specific regions). We are trying to test the codes per-game first to ensure they meet our minimum standards (see above).

We can tell you that playing some of the games in the list above at 60fps is a transformative experience. If you have the system specs for it, definitely consider replaying your PS2 games again at much smoother framerates.

Many thanks to the members of the PCSX2 Forums for posting all these wonderful patches. If you have new 60fps patches you’d love to add to the PCSX2 libretro core, please do not hesitate to contact us. We’d love your contributions.

A lot more settings have been hooked up

We have expanded the amount of core options considerably. Later on we also want to add support for the newly added core option categories that you can see in RetroArch v1.9.8 right now. This will significantly reduce the clutter onscreen when browsing the core options.

Plenty of backports/updates

Finally, there have been plenty of backports and updates.

Do note that our current core is:
1) more recent than the last PCSX2 stable (1.6.0)
2) is basically following standalone upstream master in terms of development but with severe tweaks for better libretro integration
3) is using the x64 JIT code. This is a new codepath that is less well tested than the 32bit codepath, but it’s the future regardless.

Tips and tricks

Here are some tips you might be able to appreciate:

If you experience heavy latency – You could experiment with the option ‘Emulation: Vsyncs in MTGS Queue’. Try lowering this to 1 or even 0. Depending on the amount of lag frames a game has, this could cut down on the latency severely, at the expense of some slight performance. 2 is the default but you might want to turn this down lower.

If a game has vertical lines across the screen – Try turning on a setting like ‘Merge Sprite’ or ‘Align Sprite’. Usually this takes care of the issue. This can be game specific. We intend to automate this for the problematic games in the near future, so you don’t have to.

If OpenGL performs too slowly and you’re on Windows – You could always try the Direct3D 11 renderer. While this renderer has less blending options than GL, it can sometimes be significantly faster than the GL renderer. So it’s definitely worth a try.

Regarding Xbox latest Dashboard issues

We have been notified that the latest dashboard updates on the Xbox systems have decreased compatibility of the PCSX2 libretro by a fairly significant amount. This comes as a bit of unfortunate timing with this blog post. We haven’t had the proper time yet to look into this issue, and we don’t know if it will even be fixable in the short term. Nevertheless, we will take a look regardless and move from there.

RetroArch 1.9.8 released!

RetroArch 1.9.8 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here. The next version of Lakka (with an updated RetroArch 1.9.8 version) is scheduled to be released a week from today.

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 to 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!


New RetroFW port

We added support for OpenDingux before for JZ4770-based handhelds. After this, we added support for RetroMini RS-90 devices.

And now thanks to Poligraf, we have a working build for all the JZ4760-based handheld devices running RetroFW. RetroFW is a Dingoo based firmware runnin on the MIPS 4760 which is around 50% the speed compared to other devices running Opendingux.

Which devices does this cover?

  • RS-97
  • LDK
  • RG-300
  • Powkiddy Q80

A full listing can be found here.

  • 29 cores available at launch: Atari800, BlueMSX, Cap32, FCEUmm, fMSX, FreeCHAF, FreeIntv, FUSE, Gambatte, Genesis Plus GX, gpSP, GW, Handy, LRMAME2003, LRMAME2003 Plus, Mednafen PCE Fast, NXEngine, O2EM, Picodrive, Pokemini, Potator, Prboom, Prosystem, QuickNES, RACE, Retro8, SMS Plus, Stella 2014, Vecx

We have been told these cores all run well on the hardware.

All of these low powered handheld devices help us tremendously in optimizing our cores for the low end spectrum of hardware devices. gpSP, PCSX ReARMed and Picodrive are already starting to reap the benefits of it.

Core option categories

We are going to be making a persistent effort now to enhance RetroArch’s UX and lower the acessibility curve. To that end, we now have also implemented core option categories support.

Up to this point, every core option in a core (Quick Menu -> Options) has all been shown in a a flat alphabetical list. Users can quickly get confused if they have to scroll down a massive list of options.

So, 1.9.8 finally adds core option categories. Options assigned to a category will be displayed in a submenu of the main core options menu on supported frontends. For example – here we assign Gambatte’s mulitplayer options to a Game Boy Link category:

If you do not like this new behavior, there are always options to turn it off. Go to Settings > Core > Core Option Categories setting (enabled by default). When disabled, core option categories are ignored, and core options will effectively be displayed using the old v1 format.

Cores that already support core option categories

Core option categories have to be specifically added per core. Some of the cores that already support core option categories are as follows:

  • Final Burn Neo
  • Mupen64Plus Next
  • Beetle Saturn
  • Beetle PSX
  • Beetle PCE
  • Beetle PCE Fast
  • Genesis Plus GX
  • Snes9x 2010/2005/2002
  • DOSbox Pure
  • DOSbox Core
  • UAE (Amiga)
  • VICE (Commodore 64)
  • Have you ever noticed RetroArch starting a game in windowed mode and then blowing up the window to ridiculous sizes that exceeds the boundaries of your desktop? Well, we now have a solution for that!

    At present, when RetroArch is in windowed mode with Remember Window Position and size disabled, the window size will be equal to the core provided base_width/base_height multiplied by the Windowed Scale. This is potentially ‘catastrophic’: if a core has a very large base_width/base_height (e.g. PPSSPP with a x7 internal scale factor) and Windowed Scale is set to the default x3, then the window size can be enormous – potentially exceeding the capacity of the host GPU and causing RetroArch to crash.

    1.9.8 adds two new options:

    • Settings > Video > Windowed Mode > Maximum Window Width (default: 1920)
    • Settings > Video > Windowed Mode > Maximum Window Height (default: 1080)
      …which can be used to cap the maximum window size to a ‘sane’ value.

    The PR also cleans up the Settings > Video > Windowed Mode menu, auto-hiding options where required, and re-initing drivers when toggling Remember Window Position and size. Also, since the ‘remember’ part of Remember Window Position and size is only enabled for Windows, an alternate Use Custom Window Size is provided on other platforms.

    Auto-updating core option menu visibility updates without toggling Quick Menu

    Cores are able to show or hide their options via the RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY callback on supported fontends. A significant shortcoming here is that if a change to one core option (via the frontend) affects the visibility of another option, the frontend cannot update the menu state until the core has run for at least one frame. So with the core options menu open, visibility updates cannot happen in real-time – instead, the user must toggle the quick menu off then on before the menu will change. This is ugly and confusing.

    1.9.8 adds a new RETRO_ENVIRONMENT_SET_CORE_OPTIONS_UPDATE_DISPLAY_CALLBACK environment callback which allows the core to register a function that enables the frontend to (a) force a core-side option visibility update and (b) allows the frontend to check whether option visibility has changed. This means all show/hide operations can now generate real-time menu updates.


    Plenty of important fixes for Windows users.

    If you experienced lockups in the past when disconnecting an audio device while using the WASAPI audio driver, well, rejoice, this will no longer happen.

    Simultaneous shift sticky fixes were made to the DirectInput input driver. Dinput would not send WM_KEYUP for both Shifts if they were pressed together and released, resulting in sticky Shifts
    = Pinball games ruined in DOSBox.

    The following fix was made to the Windows RawInput driver – the Left Alt key could get stuck when Alt-Tabbing. No more. The keyboard can now also be mapped to analog input axes, meaning you can bind the left and right analog stick on the RetroPad to your keyboard keys.

    PlayStation2 version

    1.9.8 solves the flickering issues that appear in the cores that use the FRAME_SKIP as Snes9x2002 does.

    Also, 1.9.8 basically mounts HDD partition if RetroArch actually started from the HDD unit.
    In this way, we skip the mount partition if the user just wants to use USB.

    macOS/OSX version

    Plenty of important fixes for macOS users this time!

    There were several serious memory leaks with the Metal video driver. These have now been fixed.

    Serious bugs related to the input autodetection subsystem have finally been fixed. Now when you connect a gamepad, it will no longer try to attach the same pad to two controller ports simultaneously. This has been a longstanding bug that we’re glad has finally been consigned to the dustbin of history thanks to the help of a generous contributor who did quite some work to delve deep into this issue. We also made sure everything still works across a wide variety of macOS machines (from a PowerPC Mac running OSX 10.5 to an Intel and ARM Mac running more recent macOS versions).

    WiiU version

    Lots of improvements have been made once again to the WiiU port.

    All the libretro RPX cores are now compressed. Not only do they load faster (leading to faster startup times), but it means you have a lot more space left on your SD card.

    L3 and R3 buttons have been fixed on several gamepads, they were previously completely nonfunctional.

    Furthermore, promising work is underway for a PlayStation1 emulator core running on RetroArch WiiU. More on that later once more news is forthcoming.

    UWP/Xbox versions

    We have been fixing several bugs with the UWP port, many of these affecting in particular RetroArch users on Xbox One/Series.

    Microsoft recently released a new Dashboard update that caused some breakage for existing RetroArch installs.

    We have managed to fix the startup problem that occurred on the latest dashboard. We also fixed the onscreen keyboard display which was previously completely glitched out.

    Note that on the latest Dashboard, some compatibility problems still persist. For instance, it has been reported that several games on PCSX2 no longer work as of the recent update. This will require investigation and it is our guess if anything can be done about this, we will have to determine this after more investigation has occurred. For now, you might experience scaling issues with some of the ANGLE/GL powered cores like Mupen64Plus Next and Flycast because of the Dashboard update. We hope that we will be able to transition from ANGLE to something like GLon12 soon. What this would buy us is full desktop OpenGL support instead of just OpenGLES. This would mean a more complete superset of OpenGL (up to 3.3 from what we can hear), more cores that would work out of the box instead of custom cores made to work with ANGLE, etc. We will see if we succeed in this, but that’s something for a later version.

    In the meantime, we have also enabled Translation features. Note that we haven’t been able to implement the Text-to-Speech accessibility feature yet, but all other features should be there now for experimentation.

    We have also re-enabled the “Explore” tab on the Main Menu. We haven’t found any issues with this anymore after the recent bugfixes/improvements we made to the underlying database code, but let us know if there are any more issues on that front.

    Several cores that used the libretro VFS subsystem and/or CHD loading previously no longer worked. Examples include the Beetle cores. This has been fixed.

    Screen resolution settings improvements

    Currently the “Screen Resolution” list wrongly alters also video_refresh_rate to the rounded value, as in 59.940 Hz becomes 59.000.

    This change makes sure all the 59.94 multiples (59/119 etc) result in the proper float value instead of integer.

    Also, previously notifications when setting the refresh rate would repeat itself twice. This has been fixed.



    • AUDIO/WINDOWS/WASAPI: Stop deactivating audio on fast forward
    • CHEEVOS: Hide challenge indicators when resetting
    • CHEEVOS: Support for more than 64 memory regions
    • CHEEVOS: Automatically retry ‘http error code -1’
    • CONTENT INFORMATION: Show content info label+path rows always
    • CORE OPTIONS: Core option categories implemented
    • CORE OPTIONS: Add option to disable core option categories
    • D3D10/11/12: Fix gfx_display_draw_texture – fixes OSK (On-Screen Keyboard) issues
    • DATABASE: Fix heap-buffer-overflow when fetching CRC values
    • DATABASE/EXPLORE: Fix CRC32 reading in explore menu
    • DATABASE/LIBRETRODB: Fix writing of numerical values
    • DATABASE/LIBRETRODB: Fix libretro-db loading on big endian platforms
    • DUMMY CORE: Skip state_manager_event_{deinit/init} when core type is dummy, should skip warning spam ‘Implementation uses threaded audio. Cannot use rewind..’ when using rewind
    • INPUT/UDEV: Limit udev device scan to subsystem ‘input’
    • INPUT/SDL2/WINDOWS: Fix keyboard event keycodes
    • INPUT/WAYLAND: Fixes a bug where the first player’s mouse, pointer, and lightgun are echoed to the other ports. Now, those other ports correctly report zero. In the future support for multiple mouselike devices will need to be added, which is a bigger project
    • INPUT/WAYLAND: The driver now respects keyboard_mapping_blocked
    • INPUT/WAYLAND: When possible, deprecated lightgun defines are replaced with the new ones. The coordinates are still using the old relative callbacks
    • INPUT/WINRAW: Trigger joypad driver reinit on DEVICECHANGE – avoids fullscreen toggle
    • INPUT/WINRAW: Alt sticky fix
    • INPUT/WINRAW: Prevent Alt getting stuck when Alt-Tabbing
    • INPUT/WINRAW: Add pointer status
    • INPUT/WINRAW: Add missing analog keybinds
    • LIBNX/SWITCH: Fix poll missing for controller 2-8
    • LIBNX/SWITCH: Fix layout not applied correctly and hangs when splitting joycons
    • LIBRETRO: Core options category API implemented
    • LIBRETRO: Add environment callback for enabling core option menu visibility updates without toggling Quick Menu
    • LOGGING: Starting logging and verbose mode before first config load
    • LINUX: In some Linux Desktop Environments, like Budgie, task bar feature is unable to pin applications. With StartupWMClass= present in .desktop file, it is possible to pin the application
    • LOCALIZATION: Fetch translations from Crowdin
    • MENU: Relocate ‘Manage Playlists’ to top
    • MENU: Fullscreen resolution width/height settings no longer require ‘advanced settings’
    • MENU/REFRESH RATE: Fix double notifications with refresh rate settings
    • MENU/OZONE: Ensure the existence of values used in selection calculation
    • MENU/OZONE/VULKAN: Casting to unsigned caused an integer overflow and after float promotion would lead to ‘x’ being a garbage value, leading to problems when this value was passed to vkCmdSetViewport. This stops Vulkan validation layers from complaining about it
    • METAL: Fixed font driver memory leaks
    • MOUSE: Change default mouse index to port index
    • MOUSE: Friendly names for mice where available
    • OSX: Fix some memory leaks
    • OSX: Fix controller duplication bug
    • PS2: Implement alpha for the video driver
    • PS2: Aspect ratio handling
    • RETROFW: Initial port
    • UWP/XBOX: Enable Explore tab by default – seems to work fine
    • UWP/XBOX: Fix startup issues with latest Xbox Dashboard updates – ANGLE cores still show up wrong
    • UWP/XBOX: fix issue where files where opened as OPENALWAYS instead of OPENEXISTING this fixes beetle cores
    • UWP/XBOX: fix issue where filesizes where not returned properly, this fixes loading arcade dat files
    • UWP/TRANSLATION: Enabled translation services for both UWP MSVC2017 and 2019. No TTS speech yet.
    • VIDEO: Fix refresh rate 59Hz rounding
    • WINDOWS: Remember original refresh rate
    • WINDOWS/VULKAN: Refresh rate fixes + cleanups
    • WIIU: Fix L3/R3 buttons
    • WIIU: Compress RPX libretro cores
    • WIIU: Add ICInvalidateRange (necessary for JITs)
    • WIIU: Slight filesystem optimisation
    • WIIU: Add option for running without core info (emscripten-style)

    What’s next

    It has been often requested during our project’s history, but yes, we finally want to do something on the UI/UX front. We have been considering introducing an ‘Easy Mode’ that should aim at making things much less of a maze to navigate for non savvy users.

    Stay tuned for more info!

Miniretro: testing emulators at scale

This is a guest article written by David GF Net republished with his authorization. Original blog article can be viewed here.

Last year I got involved in Libretro/Retroarch development after buying an Odroid Go Advance. During this time I’ve been working mainly on gpsp and porting it to new devices and such.

One of the main issues about working in software is testing, and as you can probably imagine there’s no tests in most emulators. Partly due to bad practices and because it’s hard to write tests for them. That’s why I came up with miniretro. It is a libretro frontend designed for headless operation, so that it can be used for end-to-end/integration testing. The frontend runs a core and a rom with fake inputs and grabs the output.

Cross platform testing

Some of the emulators (like gpsp) feature a dynamic recompiler (aka dynarec), which have platform specific (CPU, OS and/or device specific) backends targeted at them. These can translate original console instructions into your device’s instruction set (for speed). Since this is device specific, it’s hard to write, debug and test. One needs a toolchain for the platform and a physical device to test it. Or at least that’s the theory!

With miniretro it gets easier to test other platforms like for instance ARM and MIPS devices. Since it is simple (almost no dependencies) and just a Linux binary, we can use Qemu userspace emulation to run our tests! This way there’s not need for a physical device, nor manual testing.

The following diagram shows how it works: miniretro and the libretro core are built for the specific device/architecture and they run under qemu. Qemu takes care of translating syscalls into host syscalls, so there’s no need for a whole OS to run the program. Miniretro can open pipes and other IPC communication channels to input/output any data.

Diagram of Miniretro running under Qemu

Just as an example, let’s build picodrive, gpsp and pcsx for armv6 and mips32. To do this you will need a toolchain. In my case I’ve been using some Linux-generic toolchains for a variety of platforms, such as ARM, MIPS, x86 and PowerPC, freshly built using Buildroot (you can find them at my Copr if you use Fedora, see this repo). This, coupled with the regular Qemu userspace emulators (available in most Linux distros), enables us to test our emulators on a bunch of platforms effortlessly.

# Build the three emus for arm and mips
git clone –recurse-submodules && cd picodrive
make platform=armv CC=/opt/buildroot-armv6el-eabi-uclibc/bin/arm-linux-gcc -j10 -f Makefile.libretro all && \
mv && make -f Makefile.libretro clean
make platform=unix CC=/opt/buildroot-mipsel32-o32-uclibc/bin/mipsel-linux-gcc -j10 -f Makefile.libretro all && \
mv && make -f Makefile.libretro clean

git clone && cd gpsp
make platform=armv CC=/opt/buildroot-armv6el-eabi-uclibc/bin/arm-linux-gcc -j10 all && \
mv && make platform=armv clean
make platform=mips32 CC=/opt/buildroot-mipsel32-o32-uclibc/bin/mipsel-linux-gcc -j10 all && \
mv && make platform=mips32 clean

git clone && cd pcsx_rearmed
make platform=armv CC=/opt/buildroot-armv6el-eabi-uclibc/bin/arm-linux-gcc -j10 -f Makefile.libretro all && \
mv && make -f Makefile.libretro clean
make platform=unix CC=/opt/buildroot-mipsel32-o32-uclibc/bin/mipsel-linux-gcc -j10 -f Makefile.libretro all && \
mv && make -f Makefile.libretro clean

# Build miniretro fro arm and mips too
git clone && cd miniretro
PREFIX=/opt/buildroot-mipsel32-o32-uclibc/bin/mipsel-linux- make && mv miniretro miniretro.mipsel && make clean
PREFIX=/opt/buildroot-armv6el-eabi-uclibc/bin/arm-linux- make && mv miniretro miniretro.arm && make clean

And finally, let’s run a full matrix of tests, choose your favourite ROMs of course!

export ARCHS=”arm mipsel” EMUS=”pcsx_rearmed picodrive gpsp”
export FRAMES=”10000″ OUTPUT=”output/” SYSTEM=”$HOME/.config/retroarch/system/”
declare -A SYSROOTS=([“arm”]=”/opt/buildroot-armv6el-eabi-uclibc/arm-buildroot-linux-uclibcgnueabi/sysroot/” \
declare -A ROMDIR=([“gpsp”]=”gbaroms/path/” [“picodrive”]=”mdroms/path”)

mkdir -p ${OUTPUT}

for emu in $EMUS; do
for arch in $ARCHS; do
echo “Running $emu for $arch”
./ –core ../${emu}/${emu}_libretro_${arch}.so –system ~/.config/retroarch/system/ \
–input ${ROMDIR[${emu}]} –output ${OUTPUT}/${emu}-${arch} –threads=`nproc` –frames=${FRAMES} \
–driver “qemu-${arch} -L ${SYSROOTS[${arch}]} ./miniretro.${arch}”

./ compare –results ${OUTPUT}/${emu}-* –output ${emu}-report.html

This will produce a comparison report for every emulator, where you can see a screenshot (plus some info) for each rom and each platform. It will compare any different screenshot and report it in a red background. This is very useful to compare devices but can be also be used to compare across versions of the emulator (say, on a new commit or PR).

Reports: HTML and video!

It is also possible to produce video output directly using miniretro (if ffmpeg is installed on the system). It will output BMP and RAW PCM frames to ffmpeg which will encode them as video and audio tracks. Unfortunately there’s a bug in ffmpeg which prevents using two pipes to feed data and we are forced to produce separate streams (which can then later be muxed easily without reencoding).

I ran the above example with gpsp and arm, mips and x86 (+interpreter on x64) and got the following video (after a bit of editing with ffmpeg :P)

Likewise I ran a full test for picodrive, running 32x games:

Bonus content: dualretro

Tooling is better than debugging for sure. I’d rather spend 1 hour creating some tool rather than manually debugging something and digging too deep. Perhaps it’s part of becoming an adult 🙂 While doing a small code change I found some weird bug in gpsp that didn’t make any sense. Instead of debugging it, I tried to compare the emulator before and after my changes. Usually this involves finding the smallest change that triggers the bug and then, compare them. Thanks to miniretro I managed to found a couple of games that would trigger the error and a small test case that caused it.

Next step was to create a tool that allows us to compare emulator cores: let me introduce you to dualretro. This simple tool takes two cores and a rom and runs them side by side in lockstep. On each frame it will create a savestate and compare them, letting you know when it found a difference. This allowed me to find the bug in a matter of minutes.

Diagram of Dualretro running under Qemu

This concept can be generalized to compare frames, memory regions, audio, etc. libretro’s API provides a lot of information in a standarized way that can be used.

RetroArch 1.9.7 released!

RetroArch 1.9.7 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here. The next version of Lakka (with an updated RetroArch 1.9.7 version) is scheduled to be released a week from today.

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!

NOTE: We will update this notice as soon as we have uploaded the 1.9.7 version for UWP/Xbox as well to our server. For now, these still point to the previous version (1.9.6). We thank you for your understanding.

Release notes

A brand new platform port has been added for RetroMini RS-90 (and similar devices). These are low-powered mass-produced MIPS handheld devices that are sold for very cheap. To us, it is yet another opportunity to optimize our cores for low-end devices.

PlayStation2 users are in for a treat. gpSP (Game Boy Advance emulator core) has been optimized and tuned for PS2 to the point where it should run most games at fullspeed. RetroArch should also have a bitmap font driver implemented now instead of relying on gsKit like before.

WiiU users benefit from many improvements to file I/O optimizations (faster loading/startup times), network speed, and menu/font rendering.

Switch users should benefit from the 7zip compatibility added to this release.

Many improvements to the CRT SwitchRes feature have been made. For more details, see ‘Changelog’ below.


New RetroMini RS-90 port

Following on from the success of our OpenDingux port for JZ4770-based handhelds, we are pleased to announce official support for RetroMini RS-90 devices running OpenDingux Beta. This tiny console has one of the weakest CPUs we have ever targeted; it has just 32 MB of RAM, an ultra-low resolution 240×160 display and is available for as little as $20 – but still it provides an enjoyable RetroArch experience.

  • All regular frontend features are working (excluding rewind and runahead support)
  • RGUI offers surprisingly comfortable performance at 240×160 (even thumbnails are supported – with a fullscreen toggle mapped to the start button)
  • Content can be displayed with integer scaling, or nearest neighbour and semi-linear software filters are provided for fullscreen viewing

Given the limited specifications of the hardware, a modest section of cores are available. The following generally run at full speed:

  • Gambatte: All GB games (GBC games have mixed success)
  • Genesis Plus GX: Master System & Game Gear games
  • Pokemini
  • QuickNES

…while these offer varying degrees of playable content with frameskipping enabled via core options:

  • Mednafen PCE Fast
  • Picodrive: Genesis
  • Potator
  • RACE
  • gpSP

For the best results, we recommend applying a per-application CPU overclock for the RetroArch application: highlight RetroArch on the device’s home screen, press the select button > Edit RetroArch, and set Clock Frequency to 420 MHz (depending on the chip, a lower value may be required, or even higher may work correctly).

PlayStation2 – playable Game Boy Advance emulator added

gpSP should now be available for RetroArch PS2 starting as of version 1.9.7. This is a Game Boy Advance emulator core. Davidgf has been working hard on this core for the past few months and the results speak for themselves – this should be the first time that a PlayStation2 is able to run Game Boy Advance games at fullspeed.

WiiU improvements

In addition to the improvements listed for WiiU previously, there’s also the following to mention:

Fix inputs breaking when connecting/disconnecting remotes
When a KPAD controller (Wiimote, Pro Controller, etc.) gets disconnected or has its accessory changed, the Wii U’s API gives nonsensical results for a little while, even while claiming these results have no errors whatsoever. This was wreaking havoc in the input system and ended up leaving the controllers useless.
1.9.7 attempts to work around the console’s API by filtering out some of the unknown results.

Download progress indicator fixed for large transfers
An important bug was fixed that was causing issues while downloading the Assets from within the program. When downloading a large file on a 32-bit platform, the progress indicator will get pinned to 100% after downloading roughly 40MiB. This causes a lot of stress for, where the 40MiB mark is about halfway. This bug has been fixed. Note that this improvement is not only beneficial for WiiU but should benefit other 32-bit platforms in general.

Linux / xdg-screensaver improvements

1.9.7 provides a workaround for the long-standing issue of “protocol error” messages being written to stderr whenever the “Suspend Screensaver” option is enabled and the X11 context driver is used. These messages don’t actually come from RetroArch – they’re xdg-screensaver’s, which is a script for cross-DE screensaver suspending that RetroArch calls to do its job.

It turns out, the script has a problem with title-less windows. See the related bsnes issue for analysis – kudos to Screwtapello for figuring this out. The proposed solution is to check if there’s already a title, and if there isn’t, to set it to a single “space” character, which is surprisingly enough for xdg-screensaver to work. The space character is picked so that there’s no visible difference between the bogus title and no title at all. The alternative is to make sure that RA’s window has a title at all times – too much of a hassle for something this trivial.



  • 3DS: Add unique ID’s
  • CRT/SWITCHRES: Fixed some Monitor index bugs ad updated to the latest SR2
  • CRT/SWITCHRES: Fixed monitor index corruption on Windows and added correct fractal scaling. Only used when required
  • CRT/SWITCHRES: Updated log defines to match SR upstream.
  • CRT/SWITCHRES: Added new SR_CONFIG_PATHS for non Windows and Linux systems. Not that SR works on them but to fix RA compile issues
  • CRT/SWITCHRES: Updated SR2 code base to latest. Added supprt for windows monitor indexing. Fixed monitor index bug where index 1 was not being used correctly and “auto” was not being sent.
  • CRT/SWITCHRES: Updated swithres for x86 windows fix
  • CRT/SWITCHRES: fixed SR2 auto issue
  • CRT/SWITCHRES: Fixed auto monitor bug
  • CRT/SWITCHRES: Fixed monitor index corruption on Windows
  • CRT/SWITCHRES: Fixed buffer size bug
  • CRT/SWITCHRES: Added correct fractal scaling. only used when required.
  • CORE INFO: Automatically disable core info cache when core info directory is read-only
  • EMSCRIPTEN: add MAME2003 / MAME2003-plus to web.libretro
  • INPUT/UDEV: udev fixes add pointer pressed to pointer device to allow udev users to access this device
  • LIBNX/SWITCH: Enable 7zip support
  • LINUX/XDG: Prevent xdg-screensaver’s “Protocol error” messages
  • LOCALIZATION: Fetch translations from Crowdin
  • LOCALIZATION: Add missing languages for the first startup
  • MENU/XMB/WIDGETS: Add workaround for FPU bug that breaks scale factor comparisons on certain platforms (fixes XMB thumbnails on 32bit Linux/Windows)
  • MENU/RGUI: Enable fullscreen thumbnail toggle using RetroPad ‘start’ button
  • MENU/RGUI: Fix sublabel length when menu clock is disabled
  • NETWORK/HTTP: Fix HTTP progress indication for large files on 32-bit systems
  • NETWORK/NATT: implement natt fix from void()
  • OPENDINGUX: Fix display when cores ‘drop’ frames
  • OPENDINGUX BETA: Use ALSA audio driver by default
  • OPENDINGUX BETA: Fix IPU scaling when running 256×224 (SNES/Genesis) content
  • PATHS: Fix garbled path string
  • PS2: Implement proper ps2_font driver instead of using the font driver from gskit
  • PS2: Use BDM for increasing up USB stability
  • PS3: First basic RSX driver for PSL1GHT
  • RS90: Initial port
  • RS90: Fix offset of OSD text
  • RS90: Disable menu clock by default
  • RS90: Hide ‘Bilinear Filtering’ video option
  • RS90: Move appdata (retroarch) base directory to external MicroSD card
  • RS90: Add optional approximate ‘semi-linear’ scaling filter
  • SHADERS: Max Shader Parameters increased to 1024
  • VIDEO: Add ‘Integer Scale Overlay’ – Force integer scaling to round up to the next larger integer instead of rounding down
  • VIDEO: New ‘Full’ aspect ratio added. This aspect ratio is useful when used with a shader which has a border in it. The aspect ratio is set to the full window area, so that the viewport spans the whole viewport. When using a border type shader like the Mega Bezel this allows the graphics to span the whole window regardless of the user’s monitor aspect ratio
  • VITA: Wrong flags for not piglet version
  • UNIX: Correct backlight max_brightness path
  • UWP/XBOX: Default to Direct3D11 driver on UWP builds
  • UWP/XBOX: Do not use windowed mode on UWP/Xbox by default, set default resolution to 1920×1080 by default. Should fix display issues with Dolphin/PCSX2 on Xbox
  • WIIU: Fix inputs breaking when connecting/disconnecting remotes
  • WIIU: Input – ignore some bogus KPAD results
  • WIIU: Font rendering fixes – render font lines with correct spacing, and only sample alpha channel when rendering fonts
  • WIIU/NETWORK: Network speed optimisations – WINSCALE, TCP sACK, large buffers
  • WIIU/LIBFAT: Increase cache size on WiiU
  • WIIU/FILE IO: Filesystem optimisations – add fast path for already aligned buffers
  • WIIU/FILE IO: Use 128K vbufs for WiiU – we have loads of RAM and large vbufs are very beneficial
  • WIIU/MENU/OZONE: Fix Ozone rendering error (scissor fix)
  • WIIU/MENU/OZONE: Use Ozone icons instead of XMB Monochrome

Obituary – Near

Hi there community,

last Sunday a tragedy befell the emulation community, when Near tragically took their own life. While we feel Near needs no introduction, we feel it is only right to let people know of the extent to which Near’s work laid the foundational framework of Libretro/RetroArch, and what other great projects they worked on, including of course bsnes (which needs no introduction at this point).

Among Near’s other great accomplishments: libsnes (which later turned into our fork, libretro), libco (a cooperative multi-threading library), Higan (a multi-system emulator), Ares, and various other auxiliary projects.

Out of respect for Near’s untimely passing, we have delayed the release of the next RetroArch by a full week. You won’t be seeing us doing any promotional material or coverage for it until then, and who knows, we might even skip going into it at all. We feel this right now is more important and should get front and center coverage.

We asked three people familiar with Near to provide their own eulogy. Recognize that we speak from the heart and that our purpose in doing this is to pay proper respect and tribute to a great programmer in the emulation scene, the likes of whom we might never get again.

Hunter Kaller

About 15 years ago, I was just getting into open-source software and the Super Nintendo was always my favorite console, so I was excited to find a relatively new open-source emulator that ran even the weird, unpopular games. The author of the emu had a forum where they posted their releases and all the cool stuff they were working on, and that forum was home to a tight community of other smart, creative folks.

That forum was the old bboard, and that emu author was, of course, Near. As we all know, Near was extremely prolific, driven in their pursuit of perfection, and generous enough to share their many accomplishments with the world at large. In addition to their work on bsnes, Near also documented their relentless reverse engineering escapades on the bboard, along with their efforts to understand the entirety of as many facets of software development as they could, top to bottom. The bboard was home to some pretty epic (in the classical sense) threads in which Near would dive head-first into topics–like the fundamentals of signal resampling–that most of us outside of graduate-level computer engineering programs consider black magic.

It is no exaggeration when I say: without Near and the community they cultivated on the bboard, there would be no libretro and no RetroArch.

Libsnes (which would serve as the basis for libretro) was Near’s design to decouple their backend code from the endless frustrations of frontend coding. The bboard is where Themaister first developed and released SSNES, which would become RetroArch. They met Twinaphex while attempting to port bsnes to the PS3 via libsnes+SSNES on Near’s behalf. To this day, many of our cores depend on Near’s libco cooperative threading library. I could go on.

With that said, we did not always agree or even get along. Near’s perfectionism frequently put them at loggerheads with individuals who felt some thing or other was already “good enough” (that is basically the tl;dr of how libsnes became libretro), and, on a personal level, I do not presume Near considered me a “friend” (or even thought of me much at all, for better or for worse). Like most of the people reading this, I suspect Near had a much larger effect on my life than I had on theirs.

Nevertheless, I hope Near understood the immense positive effect they had on my life and the lives of countless other individuals, not just through their numerous accomplishments but also as a compassionate and insightful human being. The world is a less-interesting place now, without Near.


We were never the closest friends; I was around for a while, but I was always more interested in bsnes than you, Near.

I now realize I was wrong. Too many open source maintainers are valued only for their contributions and otherwise taken for granted, leading to tragedies like this.
May you finally have the peace you were denied in life.

Daniel De Matteis

I have been a bsnes fan since the very beginning when it was first announced. I remember running Mega Man X2 on an Pentium 4 PC at the time in 2005 with a premature version of bsnes and feeling that finally there was an emulator that could get the sound exactly right, and it played exactly right. Those are memories and experiences that I will always cherish.

I was not even really involved in programming until around half a decade later. I had a chance meeting with Themaister around 2010 when Near was trying to see if bsnes could run acceptably well on a PlayStation3. This was my first introduction to Near back then as a non-user and to me this meant a lot. We pretty much got stuck at the 50fps mark, but what that chance occurrence did show me was the massive potential of libsnes as an emulation abstraction layer and how easily software could be ported across platforms so effortlessly without having to maintain multiple copies of a codebase per platform. I was sold there and then on the entire potential of libsnes and SSNES. And one thing lead to another.

Fast-forward to 2021 and it’s been well over a decade since the project started and I’ve been running it now for all this time. You now know of libsnes as libretro and SSNES as RetroArch but the core concept has remained fundamentally the same, right down to the same API. Where there was in 2010 only one emulator implemented as a core (bsnes), now there is nearly 200 implementations, and not all of them even emulators. The only credit I can take in this is that I have put an inhuman amount of time in building the road so that people will come with daily maintenance and coordinating of projects so that everything works well within Libretro/RetroArch as an ecosystem. But Near absolutely deserves the credit for coming up with the foundational pillar on which this all stands.

For what it’s worth, I regret that for a long time, we did not see eye to eye, and at one point there was a fair bit of animosity between us. Thankfully in 2017 we were able to shake hands and leave the past for what it was. There were hurt feelings, disgruntlement and disillusion on both sides about the emulation scene, the way it was becoming more commercialized and co-opted by commercial interests [from private correspondences I can confirm this bothered Near deeply too], the sides people took in that while it was happening, and people getting in the middle trying to amplify those grievances and wounds. I apologized then, but I will also apologize in the present for how things went before.

Like indicated earlier, I was a fan of Near’s work before I got involved myself in the scene, and going into this had nothing but the highest admiration and apprecation for Near’s work. Ultimately the last thing I wanted was for there to have been a falling out. I tried reaching out many times before trying to squash this situation since ultimately I regretted that it had come to this and felt it should not be like this. Ultimately without a mediator I was getting nowhere with this.

In 2017, thankfully all of this we were able to put aside forever thanks to the help of a mediator, and both sides assumed good faith from that point forward. I was hugely relieved by this and took this very seriously on my side. I was committed from this point on to show that not only was there always appreciation and respect, but even more importantly, I wanted to show this not in words, but by action. Since then, I worked together with Near on many occasions. This includes involving them in a Eurogamer article about emulation licensing and helping them with license abuses from third parties. Various email correspondences centered around emulation and the libretro project have been exchanged and we had been active supporters of Near’s Patreon. Additionally contributors upstreamed libretro support into bsnes in 2018 sparking various collaborations and friendly terms. Another example is the libretro-backed Parallel RDP project where we encouraged themaister to help integrate it into the N64 emulation in ares for accurate graphics emulation. I am grateful and thankful we were able to do all these things together. To date, my biggest regret is that we had that unfortunate initial falling out in late 2010. But, I am grateful to Near that there was the willingness to leave the past behind in 2017 and start over again. Ultimately, it could have all been so easily avoided and the things that divided us were ultimately so minuscule as to not even matter.

While I won’t profess to be a brilliant coder myself, I do recognize brilliance and potential where I see it. And projects like hiro, libco, and libsnes definitely show that raw genius that was in Near. Hiro for instance was a crossplatform GUI wrapper that would wrap complicated OS-dependent windowing APIs around one common abstract interface. There exist other examples like this but it was well designed and versatile, and used to full effect in Higan/bsnes. I would be remiss not to point out another great invention, libco. It’s a cooperative threading library, very small in size, that allows one to jump from one place to the next without resorting to actual real ‘threading’. Libco’s legacy (and thereby Near’s legacy) lives on in many libretro cores today. And libsnes needs no introduction, it morphed into libretro and has largely stayed fundamentally the same.

Near’s last few projects were equally as important. Ares was a multi-system emulator that covered all sorts of classic game computer and handheld computers from the ’80s to the early ’00s. One contribution that came from us was the aforementioned Parallel RDP Vulkan-powered plugin which would allow fullspeed accurate video emulation of the N64, as well as Parallel RSP. But Near also had spent nearly a decade or more on a translation of the videogame Bahamut Lagoon, which they considered their magnum opus. This was a painstaking work of passion with the kind of attention to detail few other localizations can boast. Near actually started this translation before even creating bsnes itself, as the Bahamut Lagoon translation was the catalyst for bsnes to emerge as a project. Current SNES emulators at the time had a lot of issues that were difficult to work around, with Near preferring a more clean approach without resorting to all the hacks.

I’m afraid it will be highly unlikely we will ever see a programmer as gifted involved in open-source emulation again, certainly not one with as much commitment and passion. Everyone with an appreciation for the Super Nintendo (yes, even Nintendo themselves) owes a huge amount of debt to Near for doing the near impossible in documenting and preserving this system and its back catalogue for all of posterity. It is very rare that you see someone with such selfless commitment dedicating themselves towards fully preserving a system.

Person who wishes to remain anonymous

Near was a very kind and sweet person, who cared for others. They were very talented and was amazing at what they did. I hope that they have found peace.

RetroArch 1.9.4 released!

EDIT/UPDATE 31/5/2021: We have pushed a new 1.9.4 version. Specifically this fixes a bunch of regressions in the Vita port which unfortunately snuck into the initial 1.9.4 version. If you are using RetroArch on a PS Vita, we highly recommend you redownload the stable again. There are no real changes for other platforms.

RetroArch 1.9.4 has just been released.

Grab it here.

If you’d like to learn more about upcoming releases, please consult our roadmap here. The next version of Lakka (with an updated RetroArch 1.9.4 version) is scheduled to be released a week from today.

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!

Release notes

Be sure to also read our Libretro Cores Progress Report – lots of work has gone into all of the various cores that are maintained (either by us or elsewhere), and it’d be a shame if the work goes unnoticed. Read it here.

There were some issues with RetroArch on PlayStation TV devices which should now be resolved. Additionally, it’s possible to run RetroArch at 720p now on a PSTV if you use the Sharpscale plugin.

Just like in version 1.9.3, we have been going back and improving code in RetroArch to improve file I/O performance, something that is very important for systems suffering from slow disk storage. Most game consoles would fall in this boat because all file I/O tends to be typically unbuffered on homebrew SDKs. In the process, we have discovered some parts where RetroArch was being inefficient when loading files from compressed files (such as .zip or .7z files). In the past, it would extract this file first to a temporary directory on the disk, and then it would read from this file and load it into the RAM buffer. Now we load it into the RAM buffer directly from the compressed file without first extracting it to disk. As if that wasn’t bad enough, on any platform that supports runahead, we would have to create another copy – even when runahead is disabled. And if cheevos are enabled, that’s another copy. All things combined, it would take 128MB of RAM to load one 32MB GBA ROM. As of 1.9.4, this RAM usage is severely cut down for cores that set ‘need_fullpath’ to false.

PlayStation2 users get a new core, prboom (a Doom 1/2 game engine). Thanks to a new and improved toolchain for PS2, this runs at a very impressive framerate, targeting 60 frames per second with stock settings. There might be some minor dips to the 50s in the busier scenes but nothing too serious, and disabling settings like ‘Wiggle Geometry Fix’ might help alleviate that.


Prevent unnecessary extraction (to disk) of compressed content files

In previous versions, when loading content from compressed files, RetroArch always extracts the archive to a temporary file – even when cores specify need_fullpath = false. This is incorrect behaviour. If a core does not explicitly need to load a file from disk via some internal mechanism, the frontend should merely provide it with a data buffer. RetroArch was doing this, but in absurd fashion, i.e.:

  • Content is extracted to a temporary file on disk
  • Temporary file is loaded into a memory buffer and passed to the core
  • Temporary file is deleted when core is unloaded
  • This is a huge unnecessary performance overhead, and it causes significant unnecessary wear and tear on flash storage devices…

1.9.4 fixes the issue. Now if compressed content is loaded into a core that sets need_fullpath = false, the file will be loaded directly into memory – no disk writes will occur.

Additional notes:

Previously, it was in fact impossible to load content inside zip files directly into RAM. This has now also been resolved.

The end result? Less read/write on disk storage, which will make a big difference in terms of game content loading time on systems with slow file I/O (typically game consoles).

Option to select between ‘touched’ elements and physical controller inputs when showing inputs on overlays

The ‘Show Inputs on Overlay’ option was previously ‘broken’ when using remaps: the mapped button is highlighted rather than the pressed button, which is confusing for users and at odds with every other application (in existence) that has on-screen touch controls.

1.9.4 remedies the situation by changing the ‘Show Inputs on Overla’y option from a bool to an enum, with the following settings:

  • OFF: No inputs will be highlighted
  • Touched: The overlay element that is touched/clicked will be highlighted, regardless of which RetroPad button it corresponds to (default setting on mobile platforms)
  • Physical (Controller): Actual inputs passed through to the core will be highlighted (including remaps). This is the default setting on non-mobile platforms, and can be used by streamers, speedrunners and suchlike to show the actual controls they are using

When Show Inputs on Overlay is set to Physical (Controller), the index of the ‘physical’ device to be monitored can be set via a new Show Inputs From Port option (this option did in fact exist already, but was hidden/disabled by a long standing bug)



  • CHEEVOS: update rcheevos to v10.0.0
  • CONTENT LOADING/FILE IO: Prevent unnecessary extraction (to disk) of compressed content files when need_fullpath is false
  • CORE INFO/FILE IO: Enable core info cache by default now for all platforms
  • CORE INFO/REGRESSION FIX: Fix regression caused by core info file caching – Downloads was no longer showing up in Load Content
  • FILE IO/COMPRESSED: Ability to load content inside ZIP files directly into RAM
  • INPUT/OVERLAYS: Add option to select between ‘touched’ elements and physical controller inputs when showing inputs on overlays
  • INPUT REMAPPING/OVERLAYS: Prevent duplicate inputs when using remaps with input overlays
  • LAKKA: Add brightness restore hook
  • LOCALIZATION: Fetch translations from Crowdin
  • MENU/OZONE: Added simple playlist entry enumeration
  • MENU/XMB: Fix display of ‘Maximum Users’ menu entry dropdown list
  • PS3/PSL1GHT: Joypad driver works again
  • PSTV: Fix Vita input driver for PSTV
  • PSTV: Support for 720p on PSTV when using ‘Unlock framebuffer’ in Sharpscale plugin
  • RPNG: Fix some memory corruption if processing broken input PNG file
  • SECURITY: Fix CVE-2021-28927

Libretro Core Updates/Progress Report – April/May 2021


* Added widescreen, speedhacks options and some userhacks, some code refactoring and cleanup
* Added core option to force widescreen
* Refactoring of core options based on libretro standard
Added option to set pcsx2 Accurancy/Speed presets
* Added bios list at runtime to libretro options
* Fixed speedhacks presets option
Added fallback to default safe preset if speedhack option is disabled
Code cleanup
* Added userhack options: Align Sprite and Merge Sprite
* Fixed a problem which prevented to select the correct HW renderer
Fixed null renderer problem that, if selected, freezed the frontend
* Fixed the rumble issue where it doesn’t stop when triggered
* Add CHD support
* Added option to disable gamepad rumble
* Added option to set rumble intensity
* Replace “Force Widescreen” option with “Aspect Ratio” option
* Add ‘Enable Widescreen Patches’ option
* Added option to set System Language per game
* Added support for scph39001 bios
* Added function for sending message notifications to frontend
* Added notification to frontent about widescreen patches found or not found for the loaded content
* Improved reliability of BIOS detection for language injection
* Added language support for all EU and NA BIOS
* Fixed a memory access violation during init
* CDVD: Adjust read speed depending on if in inner/outer edge. This fixes a number of CDVD timing issues, e.g. the missing sound in Klonoa 2.
* GameDB: Remove SkipmMPEG patch for Arctic Thunder. Removes a GameDB hack for Arctic Thunder as it’s no longer needed thanks to the above CDVD improvement.
* IPU: Return contents of the bottom of the FIFO in CMD except FDEC/VDEC. Fixes the FMVs in Shox.

Update policy for this core
This core is maintained by libretro.

DuckStation core

The DuckStation core is back! This is the upstream version authored by Stenzek.
DuckStation is a PlayStation1 emulator core.

Update policy for this core
This core is maintained by upstream.

SwanStation core

This is a fork of DuckStation maintained by others. It is based on slightly older code. Libretro is not directly involved in this as an entity.
SwanStation is a PlayStation1 emulator core.

Some things that were added recently to this include software rendering upscaling support.

Update policy for this core
Up to the authors of this core, Libretro does not have an official policy on this core.


FCEUmm is a Nintendo Entertainment System / Famicom emulator core.

Some update notes (from NewRisingSun):

A number of submappers have been assigned to mapper 176 ( based on real-hardware tests. This update rewrites the mapper 176 emulation accordingly and adds all affected ROM images knownst to me to the ines-correct.h database. I made sure that I have every mapper 176 ROM file that previously was in ines-correct.h.

UNIF files remain a problem, since the UNIF file loader does not use that database, and the four UNIF MAPRs (BMC-FK23C, BMC-FK23CA, BMC-Super24in1SC03, WAIXING-FS005) do not neatly correspond to the actual hardware variants. For example, several BMC-FK23C(A) are actually FS005. The heuristic that I used works for all UNIF files that I had in my possession.

Another issue is the DIP switch. Some carts act quite erratically when the address mask changes on every soft reset, and the old code to decide that did not work well for .NES files. (And “BMC-FK23CA”, previously described as explicitly denoting a DIP switch, is used for a few carts that do not like DIP switch changes between resets at all.) I introduced a new heuristic that worked for all files in the database. The problem remains that the code does not know up to which value the address mask should shift, so that “76 in 1 CHEER – TECH” acts strangely from the fourth to the eighth reset. I see no way of solving this short of creating a database of valid DIP switch positions for every known file hash. (I have done such a thing for NintendulatorNRS.)

Finally, a small number (I counted two) homebrew multicarts from nesbbs no longer work with the newer, more hardware-accurate emulation. “Homebrew multicarts” here refers existing multicart ROMs modified to replace one or two games, and make make changes to the menu code to work better in some other emulators.

* A Pixel Perfect (PAR 1:1, DAR 16:15) option was added.

* Should now handle paths with special characters when using Windows.


FreeIntv is an Mattel Intellivision emulator core.

Several major improvements have been made to this core recently thanks to nanochess.

* Corrected bug in Overflow flag for SUB/CMP.
* Corrected scrolling visuals for several games (adding timing count for STIC).
* Corrected several instruction timings and interruption timing.
* Now the following games look and/or scroll correctly:
– Cloudy Mountain
– Tower of Doom
– Mountain Madness Skiing
– Super Pro Decathlon
– Stadium Mud Buggies
– Hover Force
* Solved bug in border color. Implemented STIC screen disable.
* Shows explanation if GROM and EXEC are missing.
* HALT and undefined instructions shows a message instead of exiting.
* Corrected position of messages for cartridge load.
* Solved bug in STIC border collision and optimized it

Update policy for this core
This core is maintained by libretro.


prboom is a Doom 1/2 game engine core.

* PS2 support has been added.

Update policy for this core
This core is maintained by libretro.


FUSE is a ZX Spectrum Emulator core.

* Fix ‘Some +3 .dsk don’t load if they use more than 40 tracks’ issue – fixes Sword of Ianna.
* Do not autoload tapes on Scorpion – fix for the issue of autoloading tapes freezing the Scorpion 256 machine type.

It basically disables autoload when loading a tape image (TAP or TZX) with a Scorpion machine. The tape has to be loaded manually by entering the BASIC interpreter and typing load “”

Update policy for this core
This core is maintained by libretro.

Beetle PSX

Beetle PSX is a PlayStation1 emulator core.

* Dynarec updates

Update policy for this core
This core is maintained by libretro.


O2EM is a Magnavox Odyssey 2 emulator core.

Standalone O2EM can emulate The Voice expansion module using wav sound samples that the user must place in a specific folder, similarly to what happens with the bios. The libretro port, however, didn’t include The Voice support, as the corresponding code was simply disabled.

The Voice emulation has now been ported to work in a libretro context, using libretro-common’s own audio mixer to load and play the sound samples, which should be placed in a voice folder under the usual System folder.

NOTE: This feature has not been enabled for every platform, but most non-memory constrained platforms should incorporate it now.

External RAM is now exposed through RETRO_MEMORY_SYSTEM_RAM, right after the internal RAM. This memory map is virtual, as the console itself accesses the two RAMs using specific instructions instead of mapping them to a single address space.

Update policy for this core
This core is maintained by libretro.


Before, the core has a Turbo A button with a fixed rate of four presses per second. Now, the turbo period is configurable via a new Turbo Button Period core option. Increasing the period to 0.5-0.75 seconds makes it much easier to speed through rounds of Pokémon Zany Cards without accidentally triggering unwanted input.

Update policy for this core
This core is maintained by libretro.

DOSbox Pure

DOSbox Pure is an MS-DOS/Windows 9x emulator core.

General updates along with a PS Vita port now.


Dolphin is a GameCube/Wii emulator core.

* Add Fast Depth Calculation option

This option is useful for certain games for which having Fast Depth Calculation enabled causes texture issues. For example, disabling Fast Depth Calculation restores the missing text in Def Jam: Fight for NY.

Update policy for this core
This core is maintained by libretro.


gpSP is a Game Boy Advance emulator core.

Tons of updates:

* Fix palette writes in MIPS –

Was not writing to the right address (but decoded memory was working).
Most game worked well except those that depend on modifying the existing
palette bits (instead of copying from ROM/RAM). Fixes several games.

* Fix RTC support for MIPS

* Fix Vita port and likely some Linux/Android hidden issues –

Using an invalid SP makes Vita crash (for an unkown reason) and makes
things like C signal handlers crash (luckily Retroarch doesn’t use
them). It is also a violation of the ABI and not a great idea.
Recycled some little used registers to free SP. Perf should be roughly
the same.

* Fix invalid memory map entries

* Adding Code Breaker cheat support –

This works on both interpreter and dynarec.
Tested in MIPS, ARM and x86, still needs some more testing, some edge
cases can be buggy.

* Fix aligned32 reads in interpreter mode –

An address check was missing to read aligned 32 (stm/ldm) data from
high mem areas (0xX0000000). This fixes SM4 EU that for some reason has
some weird memory access (perhaps a bug?)

* Small optimization (~2-4%) and whitespace cleanup! –

Cleans up a ton of whitespace in cpu.c (like 100KB!) and improves
readability of some massive decode statements.

Added an optimization for PC-relative loads (pool load) in ROM (since
it’s read only and cannot possibily change) that directly emits an
immediate load. This is way faster, specially in MIPS/x86, ARM can be
even faster if we rewrite the immediate load macros to also use a pool.

* Add dedicated RetroPad fast-forward button

* Fix ARM dynarec unaligned 32 bit loads –

This might make a handful games slightly slower (but on the upper side
they work now instead of crashing or restarting).
Also while at it, fix some minor stuff in arm stubs for speed.

* Add ROM mirroring and fix mult. cycle count –

This should correct some minor issues in some games.

* Add turbo A/B buttons

Update policy for this core
This core is maintained by libretro.

Beetle Saturn

Beetle Saturn is a Sega Saturn emulator core.

* Backport VDP2 render thread ‘busy wait’ performance fix
* Fix hang on boot when rewind or runahead is enabled
* Prevent hang when launching Blast Wind

Update policy for this core
This core is maintained by libretro.


bsnes is a Super Nintendo/Super Famicom emulator core.

* Refactor and upgrade Core Options (version 1.3) with sublabels and translation support

Update policy for this core
This core is maintained by libretro.


SMSPlus GX is a Sega Master System/Game Gear emulator core.

* SMS: Center the image when remove border option is enabled
* Merge recent changes from upstream

Update policy for this core
This core is maintained by libretro.


LRMAME2000 is an arcade emulator based on an old version of MAME circa 2000.

* Changed /samples dir to be in the system directory (parity with other MAME cores)


LRMAME2003 is an arcade emulator core based on the original MAME 0.78 source code base .

Contra protection improvements –

furrtek Added Konami 007452 multiplier/divider fixes rolling mines trajectories in contra

Rather than add a whole new device im just hooking it directly into the Contra driver for this core. Combat School Flak Attack and WACLeMans also use this but for now im focusing on Contra as the game improvements are known

Whereas with the others the benefits over the original simulations are not as yet known if indeed there are any.

Update policy for this core
This core is maintained by the LRMAME2003 Plus team.


Mesen is a Nintendo Entertainment System/Famicom emulator core.

* Fix Twin Dragons support. Also fixes Mystic Origins.

Update policy for this core
This core is maintained by the Libretro team.

Stella 2014

Stella is an Atari 2600 emulator core.

Before, the core supported analog paddle input when using gamepads (#71), with relative paddle motion corresponding to analog stick displacement.

Unfortunately, this is incompatible with real, physical paddles (Stelladaptor, iCode, etc.) , which require absolute positioning to function correctly.

Now, it enables support for these devices by adding a new virtual controller type. In Quick Menu > Controls > Port x Controls, Device Type can be set to Gamepad for regular input, or Paddles (Stelladaptor) for real paddle input.

When Paddles (Stelladaptor) is selected, inputs are mapped as follows (this is the normal convention for Atari controller adaptors):

Port 1:

P1 Fire: RetroPad A
P1 Wheel: RetroPad Left Analog X
P2 Fire: RetroPad B
P2 Wheel: RetroPad Left Analog Y
Port 2:

P3 Fire: RetroPad A
P3 Wheel: RetroPad Left Analog X
P4 Fire: RetroPad B
P4 Wheel: RetroPad Left Analog Y

Note that 4-player games are now supported.

Update policy for this core
This core is maintained by the Libretro team.

FBAlpha 2012 CPS3

This is a cut-down version of FBAlpha 2012. Only CPS3 emulation support has been kept in this core. It is mainly meant to be used with Capcom Play System III games.

* (3DS) Use custom memory allocator

Re-implement custom memory allocator initially from FBAlpha 2012 Neogeo.

Update policy for this core
This core is maintained by the Libretro team.

Other updates

* Atari800 (Update strategy: Maintained by Libretro)
* bsnes HD (Update strategy: Upstream)
* DOSbox Core (Update strategy: Maintained by RealNC)
* EasyRPG (Update strategy: Upstream)
* FBNeo (Update strategy: Upstream)
* LRMAME (Update strategy: Maintained by Libretro – updated to 0.330)
* LRMAME2003 Plus (Update Strategy: Maintained by LRMAME2003 Plus team)
* Mupen64Plus Next (Update Strategy: Maintained by m4xw)
* Picodrive (Update strategy: Maintained by Libretro)
* PPSSPP (Update strategy: Upstream)
* PX68K (Update strategy: Maintained by Libretro/NegativeExponent)
* Kronos (Update strategy: Upstream)
* Stella (Update strategy: Upstream)
* UAE (Update strategy: Maintained by Libretro)
* VBA-M (Update Strategy: Maintained by Libretro/NegativeExponent)

If we forgot any updates to any core during this period, let us know and we will update this article. Thanks.

RetroArch 1.9.3 released!

RetroArch 1.9.3 has just been released.

Grab it here.

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!

Release notes

We have a roadmap now (see here), and you can expect more frequent releases from this point on. We are aiming for a new version every two weeks. We were initially aiming to have the Lakka version ready to be released concurrently with this version, but had to postpone it. We are definitely aiming to have a new Lakka version ready with future releases of RetroArch though.

We have implemented core info file caching and enabled this by default for the console platforms. This should lead to significantly reduced startup times and content loading after the first initial startup. The first time RetroArch starts up (and/or new core info files are added), it will need to build/rebuild the cache. After that though, it only has one cached file it has to load at startup instead of having to sequentially read every single core info file. This used to take a very long time on platforms with slow disk I/O (such as game consoles). PSP/Vita and 3DS users in particular will definitely notice these improvements.

WiiU users get a couple of new cores, such as bk (the Oberon RISC emu), xRick (the Rick Dangerous game engine reimplementation), and REminiscence (the Flashback game engine reimplementation).


Core info file caching

It seems that on platforms with slow disk I/O (mostly all game consoles), it takes the same amount of time to load a file no matter how large it is (within reason) – so ~300 ms to load one info file, and the same ~300 ms to load everything stored in one cache file. Loading ~80 info files takes forever – and basically constitutes almost all the startup time on these systems. This reality is what has led to a new feature called ‘core info file cache’. An anecdotal report from the person who implemented this – previously without core info file caching t took 29 seconds just to boot XMB. With the core info file cache, it only takes 12 seconds. On RGUI, it boots in 3 seconds or less. Significant reductions to be sure.

Things you should know about the core info file caching

  • Core info cache can now be enabled/disabled on all platforms via a new Settings > Core > Cache Core Info Files option
  • Core info cache file are stored as core_info.cache
  • The core info cache file is compressed (rzip) to further reduce disk I/O
  • The presence of a core_info.refresh file in the core info directory will force a one-time refresh of the info cache. This file is generated automatically when toggling on the Cache Core Info Files option, and we will also add it to core info file packaging such that updating info files (either manually or via the online updater) will force a refresh
  • The core info cache no longer contains ‘core is locked’ and ‘firmware missing’ data fields; these are ‘dynamic’ properties that must be determined at runtime
  • The ‘core is locked’ status is now determined on core info initialisation by parsing the core directory listing, rather than by performing individual ‘lock file exists’ checks. This minimises file I/O, and greatly improves performance on devices with slow storage
  • While parsing the core info cache file, we now avoid unnecessary strdup()s when adding entries to the resultant cache list

(Static Platforms) Add option to not restart RetroArch when launching content with the currently loaded core

Before, whenever content was loaded using a static build of RetroArch (i.e. most of the console ports), a new process is forked. This basically means that RetroArch in it’s entirety is reloaded, which can be quite slow.

This kind of ‘reload’ is required when changing cores (since each is a stand-alone application) – but if the core we want to launch is already loaded, then it’s wasted effort.

1.9.3 adds a new Always Reload Core on Run Content option under Settings > Cores on statically built platforms. When enabled (by default on consoles), the current existing behaviour is maintained. When disabled, launching content with a core that is already loaded will skip the process fork/reinitialisation and just load the content directly.

On an o3DS testing setup, this reduces content load times by 60%-70%, depending upon the core.

Important caveats:

  • There is a significant annoyance in the way that static builds work. If you run the ‘top level’ RetroArch app, then everything works as you would expect – but if you run a core directly (e.g. a specific core cia on 3DS), RetroArch doesn’t actually have any way of knowing which core is currently loaded. It ‘assumes’ you are running the last loaded core – which may not be the case. If it isn’t, the first ‘run content’ operation with Always Reload Core on Run Content disabled will cause an unnecessary fork (but the next ‘run content’ will behave correctly). Unfortunately there is nothing we can do about this…



  • 3DS: Disable menu screensaver animations in XMB/GLUI
  • COMMAND: Initialize netcmd->cmd_source_len before recvfrom()
  • CONTENT LOADING/STATICALLY LINKED: Ensure ‘Always Reload Core on Run Content’ setting is applied when loading content via the file browser
  • CONTENT LOADING/EMSCRIPTEN: Fix content loading via file browser on platforms with ‘broken’ core handling (i.e. emscripten)
  • CORE INFO: Skip whitespace when writing compressed core info cache files
  • CORE INFO/FILE IO: Core Info cache; significant file I/O performance improvements on systems with slow disk file I/O
  • CORE INFO/FILE IO: Enable core info cache by default on all ‘console’ platforms
  • FREEBSD: FreeBSD build fix
  • LAKKA: Support for tweaking CPU governors/scaling policies
  • LAKKA: This adds managed policies and settings to store them and reload them at startup
  • LIBRETRO API: Add API extension for cores to override frontend fast-forward state
  • MENU/RGUI: Fix saving of config files/overrides when ‘Lock Menu Aspect Ratio’ is enabled
  • SHADERS: Fix ‘Auto-Shader Delay’ functionality
  • UWP/D3D11: Disable mipmap generation
  • UWP/XBOX: Add ‘Force 4K resolution’ option (Force the resolution to the fullscreen size on Xbox, if set to 0, a fixed value of 3840 x 2160 will be used)

Final Burn Neo release

Final Burn Neo (FBN/FBNeo) is the follow-up of Final Burn Alpha (FBA/FBAlpha), an alternative to MAME for arcade emulation. It’s more focused on playability than on accuracy/preservation. The team is composed of dink, iq_132, JacKc, kev and me. It supports most libretro features (netplay, runahead, retroachievements, …).

Some words about accuracy & FBNeo

Regularly, I see misunderstandings about our playability focus. It doesn’t actually mean we don’t care about accuracy, when we add a new system we usually make it as accurate as possible, and we also revisit old systems for accuracy improvement purpose. In some edge cases we even end up being more accurate than MAME, it’s always a bit funny when someone comes reporting that “something is different from MAME, so that must be a bug”, and after investigating about the actual cabinet, we learn that FBNeo is actually the one emulating the game properly (in those cases, we let the MAMEdevs know, so I believe the inaccuracies are fixed shortly after on their side).

I can only remember of a few occurrences where we are intentionally inaccurate:

  • Samples vs Netlist emulation : we prefer keeping samples for now, netlist is a nice feature, but ultimately we don’t think samples sound bad (we even have some systems where we offer alternative sound emulation through samples while the actual sound device is also emulated), so enforcing the emulation to be twice slower for this didn’t seem right to us. From time to time I see people saying “yeah but I’m missing sounds because of those samples” : that shouldn’t be the case, most likely they are just using the wrong samples pack.
  • CPS3 emulation : Around 2 years ago, we noticed a frame on SF3-1’s VS screen had wrong colors, after more investigation & tests we learnt that the fix would involve making the emulation twice slower on every CPS3 games, so since there was no evidence that fixing this single frame would improve anything else on CPS3, we decided to leave things like this for now.
  • ZX Spectrum emulation : We didn’t like the original sound from the buzzer, so we re-made it to our liking.
  • Garbage noise : Sometimes, we notice garbage noise that actually happens on real hardware, since we consider this noise as an unpleasant game bug, we filter it out, i remember “Burger Time” and “Narc” being in that list.

New supported games and other emulation improvements


Our tms340x0 cpu core got rewritten, which allowed to add support for pretty much any midway game that was missing and not running on 3D hardware, the more recent additions include “2 on 2 Open Ice Challenge”, “Judge Dredd”, “NBA Hangtime”, “NBA Jam”, “NBA Jam TE”, “NBA Maximum HT”, “WWF: Wrestlemania”, “High Impact Football”, “Super High Impact”, “Narc”, “Smash TV”, “Strike Force”, “Terminator 2 – Judgment Day”, “Total Carnage”, “Trog”, “Revolution X”, and the recently dumped “Power-up baseball”.


Support for Sega System 32 was added : “Air Rescue”,  “Arabian Fight”, “Golden Axe: The Revenge of Death Adder”, “Dark Edge”, “Spider-Man: The Videogame”, “Dragon Ball Z V.R.V.S.”, “Holosseum”, “SegaSonic The Hedgehog”, “Alien3: The Gun”, “Burning Rival”, “F1 Super Lap”, “F1 Exhaust Note”, “Jurassic Park”, “Rad Mobile”, “Rad Rally”, “Slip Stream”, “Super Visual Football: European Sega Cup”, “Soreike Kokology”, “Soreike Kokology Vol. 2 – Kokoro no Tanteikyoku”, “Hard Dunk”, “OutRunners”, “Stadium Cross” and “Title Fight”. One of the hightlights of our emulation is the controls on racing games like “Rad Mobile”, they are very playable (apparently, the controls are a bit tricky on MAME).


Support for Jaleco Mega System 32 was added : “Tetris Plus”, “Tetris Plus 2”, “P-47 Aces”, “Best Bout Boxing”, “Desert War”, “The Game Paradise – Master of Shooting!”, “Gratia – Second Earth”, “World PK Soccer V2”, “Hayaoshi Quiz Grand Champion Taikai”, “Hayaoshi Quiz Nettou Namahousou”, “Idol Janshi Suchie-Pai II”, “Ryuusei Janshi Kirara Star”, “Mahjong Angel Kiss”, “Vs. Janshi Brandnew Stars”.


Support for Namco NA-1/NA-2/NB-1/NB-2 systems was added : “Bakuretsu Quiz Ma-Q Dai Bouken”, “Cosmo Gang the Puzzle”, “Emeraldia”, “Exvania”, “Fighter & Attacker”, “Super World Court”, “Tinkle Pit”, “Knuckle Heads”, “Numan Athletics”, “Nettou! Gekitou! Quiztou!!”, “X-Day 2”, “Nebulas Ray”, “Point Blank / Gun Bullet”, “Great Sluggers”, “Great Sluggers 94”, “Super World Stadium”, “Super World Stadium ’96”, “Super World Stadium ’97”, “J-League Soccer V-Shoot”, “The Outfoxies” and “Mach Breakers”


Support for Seibu SPI system was added : “Senkyu / Battle Balls”, “E Jong High School”, “Viper Phase 1”, “Raiden Fighters”, “Raiden Fighters 2 – Operation Hell Dive”, “Raiden Fighters Jet” and “E-Jan Sakurasou”

Sinclair ZX Spectrum

While the driver had been there since 2018, because of how bad it was (a parting gift from a certain person…) it was basically rewritten from scratch, nowadays I believe it’s a very nice alternative to FUSE. Also, I mentioned it above, we intentionally decided to be inaccurate on buzzer emulation.

Fairchild ChannelF

Another home console gets emulated.


Thanks to the efforts of an external contributor (eziochiu), the last 2 unplayable pgm games (and their clones) finally became playable : “Dragon World 3” and “Photo Y2K 2 (3-in-1)”.


We now support “Gladiator”, “LSA Squad” and “Daikaiju no Gyakushu”

Electronic Arts / Rare

“Battletoads” is now supported, this game is actually the main reason our tms340x0 cpu core was rewritten.


“Exterminator” is now supported, that’s yet another game using tms340x0 (actually, 2 of them !), this is an odd game to say the least.

Art & Magic

Yet another system using tms340x0, their games – “Cheese Chase”, “Stone Ball” and “Ultimate Tennis” – are actually pretty cool.

Improvements to the Libretro port

Some features that were left over from standalone until now got implemented in the Libretro port :

  • LowPass Filter : It’s available from the core options, I know something similar is available from RetroArch’s DSP plugins but you might want to check out this one too. Technically it’s a 2x resonant lowpass filter which is set-up to mimic the amp section found on most PCB’s. For a good 95% of games, it makes the sound a bit more rich/bassy, and for the remaining 5% let us know so that we can fix them. You’ll probably never want to turn this option off after getting used to how nice it sounds.
  • Cheats : They have been supported through the Libretro API for some time, but now you can also directly use a cheat.dat from MAME, more information about this here.
  • Macros : First, some words about macros, the reason macros from standalone aren’t supported is because there can be dozens of them for a single player on a single game, however you currently can’t map that many actions with the Libretro API (and this is not only a problem for macros, handling service menu when it involves several buttons can be tricky too) because all inputs need to be assigned to a button from the get go. In the past, there was some workaround for this through core options, but it had its own share of issues so it was removed later. I recently decided to re-implement support for a select few macros, for now it only includes 3xPunchs and 3xKicks on SF-like games but implementing a few more could be done if I can get some help sorting out the ones that’ll be the most useful so that they’ll fit within the RetroPad model.


And much more! This article is far from being exhaustive.
If you want to help FBNeo, keep sending us bug reports when you see something wrong.
Our forum :
Our github :
Our discord :

RetroArch 1.9.2 released!

RetroArch 1.9.2 has just been released.

Grab it here.

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!

Release notes

PlayStation Vita users will be happy to learn that the issues with gpSP (Game Boy Advance emulator) are now resolved, and it should work as reliably as it did before 1.9.1 (and perhaps even better now thanks to increased performance). We hope you get a lot of mileage out of this core as a lot of work and effort went into it to really optimize the performance of this core over the past few months!

Text To Speech support is now enabled for the macOS Universal build. You can access this by going to Settings -> Accessibility and enabling ‘Accessibility Enable’.

Some nice changes under the hood that are more technical in nature: config file loading performance has been improved immeasurably which should help out with initial startup times of RetroArch, loading config files as well as loading shader presets. Core info file loading itself has also seen many performance improvements. We are aware that despite all this, loading all the assets in the more feature-rich menus like MaterialUI/XMB/Ozone can still take a long time on systems encumbered by slow disk I/O, but we have some special things in store for future versions that should increase asset loading performance significantly.

There is now multi soft-patching file support. We will explain this in more detail below.


Multi soft-patching support

If an IPS/BPS/UPS patch is found, will replace the last character in the filename with a counter and loop until another patch is found (in any format).

Example matching filenames:

Contra (Japan).nes
Contra (Japan).ips # Applied first
Contra (Japan).ips1 # Applied second
Contra (Japan).ups2 # Applied third

Notice that if one filename breaks the loop, the following patches won’t be applied too. e.g.:

Contra (Japan).nes
Contra (Japan).ips # applied
Contra (Japan) (Translation).ips1 # Partial name match, not applied
Contra (Japan).ups3 # Not applied either

Enhanced ‘Load Content’ file browser search functionality

1.9.2 adds the same search filter functionality that currently exists for playlists to the file browser when selecting Load Content. This means:

  • When navigating the filesystem via the file browser, the user can press RetroPad X (or /, etc.), and enter a search term
  • This becomes a filter – all matching entries will be displayed
  • The user can then perform another search to further refine the results. Up to 8 filters may be stacked in this fashion
  • Pressing ‘cancel’ clears the last entered filter

For example:

In order to support file browser navigation, the search filter implementation had to be rewritten. Instead of having a single menu-driver-level search filter, independent search terms are now stored for each menu list. This is a far more robust solution, and means that filters can be enabled for other menus far more easily (and without any hacks). To demonstrate this, 1.9.2 also enables search filters when selecting shader presets/passes via the file browser (I will try to add this in more places as time permits):

Finally, 1.9.2 makes the following changes to existing search functionality:

  • Entering a search term consisting of a single Latin alphabet character will now always jump to the first entry whose first character matches – i.e. we no longer apply search filters in this case, since a single alphabet character filter is not useful. This means single character searches can be used for fast alphabet navigation
  • When searching file browser lists, the ‘utility’ entries (e.g. Parent Directory) are ignored, since they have no bearing on the actual list content (i.e. searching for p will now jump to the first p file – previously, it would always jump to Parent Directory…)
  • When performing non-filter searches, the entry labels used in each comparison now exactly match what is printed on screen by the menu driver. Previously, raw file_list values were used, which are often the same, but not always (e.g. in a number of cases, this is the difference between searching against full file paths vs. path basenames, which can produce erroneous results)

In addition to all this, 1.9.2 also enables search filter support when using the file browser to select cheats and overlays.

Optional menu screensaver animations

At present, when using XMB/GLUI/Ozone, enabling the menu screensaver will cause the screen to be blanked when the screensaver timeout has elapsed. 1.9.2 adds three optional animations that may be displayed instead – these can be selected via the new Settings > User Interface > Menu Screensaver Animation entry; animation speed may be adjusted via Settings > User Interface > Menu Screensaver Animation Speed. The options are as follows:

OFF: Screen will be blanked




These effects are rendered using font glyphs; the performance overheads of all the animations are therefore low. This should also give you some indication as to how we are planning to reduce file I/O overhead across the board when it comes to asset loading, but that is something that we will be unveiling for a future release!

When using GLUI/Ozone, the screensaver will be tinted (somewhat) according to the current menu colour theme (XMB uses a fixed screensaver colour, since it does not have a ‘proper’ colour theme implementation).

OpenDingux beta: Add 50Hz support

All devices running OpenDingux Beta have native support for both 60 Hz and 50 Hz display modes. 1.9.2 enables 50 Hz functionality in RetroArch. The refresh rate can be toggled between 60 Hz and 50 Hz via the Settings > Video > Output > Vertical Refresh Rate menu entry; the value can be saved on a per-core/content directory/game basis via regular config overrides.

This makes OpenDingux devices (running the Beta OS) pretty much the only affordable/easily available handhelds that can run both NTSC and PAL content smoothly. The VICE core in particular benefits enormously from this addition.

OpenDingux beta: Fix IPU scaling when running GB/GBC/GG/NGP-resolution content

Further testing of the OpenDingux Beta port has revealed several more resolutions which are mishandled by the IPU hardware scaler. 1.9.2 updates the resolution blacklists accordingly, fixing scaling for the following content:

  • Gameboy (+ Color)/Game Gear at native, x2 and x3 resolutions
  • Neo Geo Pocket (+ Color) at x2 resolution



  • 3DS: Enable graphics widgets / overlays
  • 3DS: Load texture images as BGR colors
  • 3DS: Change default asset directory
  • CHEEVOS: Allow rcheevos_patch_address to be called on game without achievements
  • CHEEVOS: Update achievement memory maps (add Supervision)
  • CONFIG/FILE: Use hash map to optimise key/value lookups
  • CORE INFO: Performance optimisations + code clean-ups/refactors
  • CRT/SWITCHRES: Fixed CRTSwitchRes framebuffer bug
  • DISCORD/RPC: Fix regression
  • DRM: set the correct video mode
  • FASTFORWARD: Enforce minimum fastforward_ratio of 1.0
  • FONTS/FREETYPE/STB_UNICODE/BITMAPFONT: Prevent texture bleed when rendering text at non-integer scales
  • INPUT: Ensure that ‘retro_set_controller_port_device’ is called when updating ‘Max Users’
  • INPUT/XEGL/MOUSE: Fix xegl_ctx.c mouse activation
  • INPUT/SDL: Fix crash in SDL input driver when analogs are bound
  • INPUT/POINTER: Add scaling to pointer input
  • INPUT REMAPPING: Fix regression on loading file
  • INPUT REMAPPING: Fix regression where disabling input remapping would disable input
  • IOS: Disable system button gestures on iOS 14
  • IOS: Prevent potential crash on controller connect – randomly would get a crash when connecting a game controller while RA was running
  • LAKKA: Add menu for time zone setting
  • LOGGING: RARCH_LOG_V checking for verbosity level is not necessary and can cause issues; removed said check.
  • LOGGING: Silence inappropriate cheatfile logging
  • IOS/MAC: Add CPU VFP unit detection for Darwin
  • MAC: Swallow ‘escape’ key being pressed – would previously make the game toggle between fullscreen and windowed
  • MAC: Intel and ARM64 timer change proposal.
  • MAC/ARM64: run_fast_mode disabled for 64 bits invalid instructions.
  • MAC/OPENGL: Fix codesigning issue
  • MAC/UNIVERSAL: Add TTS translation service support.
  • MENU: Add optional menu screensaver
  • MENU: Add search filter support to cheats and overlays file browser menus
  • MENU/FILEBROWSER: Enhanced ‘Load Content’ file browser search functionality
  • MENU/INPUT: Block accidental diagonals in menu navigation
  • MENU/RGUI: Add option to disable menu transparency
  • MENU/RGUI: Fix display of ‘Video > Scaling’ menu when ‘Lock Menu Aspect Ratio’ is enabled
  • MENU/MATERIALUI: Add icon to ‘Turbo Fire’ menu entry
  • MENU/OZONE: Ozone Dracula theme
  • OPENDINGUX/BETA: Fix IPU scaling when running GBA-resolution content
  • OPENDINGUX/BETA: Add 50Hz support
  • OPENDINGUX: Enable ‘SaveRAM Autosave Interval’ by default
  • PATCHES: Added multi-softpatching support + OSD messages for patches
  • RHMAP: Track the complete string in rhmap
  • VITA: Align VM block size to 1MB – should fix one of the issues with gpSP
  • WINDOWS/GDI: Fix non-ASCII text rendering
  • XEGL: Fix mouse not working when using OpenGLES with X11

Libretro Cores Updates – PCSX2 Alpha release for Windows and more!

PCSX2 Alpha core available for Windows now!

Today we’re releasing an alpha version of the PCSX2 libretro core on the buildbot. It’s available for Windows only right now, but the same core has been tested to work on Xbox One/Series systems as well.

Important things to know

  • Create the following directory in your system directory – “pcsx2”. You can put all the asset files there from your regular PCSX2 install. See pic below for an example.

    You need a working BIOS inside /pcsx2/bios. PCSX2, unlike Play!, will not work without a real BIOS.

  • It’s still an alpha version. Things are rough around the edges. Expect bugs and things to be incomplete.
  • There’s a working OpenGL renderer and a Direct3D11 renderer option. Direct3D 11 renderer can be faster than OpenGL but also has less features. Pick whichever works best for you. On Xbox you will only be able to use Direct3D11 anyways.
  • This core uses the x86_64 dynarec which was added to PCSX2 a year ago. It is still less compatible than the 32bit x86 dynarec in PCSX2, so keep that in mind. It’s for similar reasons that the software renderer right now won’t work (it’s not compatible yet with x86_64, not in upstream either).
  • There’s a bug that can happen right now upon closing content or exiting RetroArch with the PCSX2 core on Windows – the RetroArch process might not completely cleanly shut itself off and you might still be able to see a 0% CPU process remaining in the Task Manager. We have not been able to figure out how to fix that yet as the PCSX2 codebase is a definite case of ‘here be dragons’, but for now when this happens, you can just bring up the Task Manager and close it manually. It shouldn’t have a real detriment on performance but it is of course far from ideal and hopefully something we can fix soon with the help of some contributors. We have found this happens the most with the Direct3D 11 renderers.
  • Switching resolution at runtime right now can be a bit unstable, so does switching fullscreen resolution. We might just make resolution switching require a restart since this tends to be too unstable for now.

Update policy for this core
Hard-forked core for now. Govanify is going through many (necessary) refactors in PCSX2 upstream to make the code more portable, and he has also expressed his interest in an upstreamable libretro core somewhere down the line when the final refactoring of the GUI is complete. So either of two things can happen when that happens, if this is more closely aligned to upstream core is better in every way including performance, this will be replaced. If not, we will likely have two cores, one being the upstream-friendly core and this being the hard-forked one. As of this moment a lot of work remains to be done on PCSX2 to sort out all the internals that are chockful of nonportable code. Therefore, for now, the experimental PCSX2 core kinda is doing its own thing. PCSX2 still has a lot of inherently nonportable code in it, from WxWidgets to libglib. It’s for that reason that we don’t have a Linux core yet on our buildbot. We hope that we will be able to figure out a proper portable core for Linux users soon.

Expect a lot of Quality of Life enhancements to this core soon. We wanted to share this with you now rather than sit on it for even longer, now that it’s on the buildbot we can at least push regular updates to it, people can report issues and developers can contribute. Everyone wins.

Play! (experimental PlayStation2 emulator) is back on the buildbot!

The Play! libretro core is back on our buildbot! It took some time for this to be readded to our modern new buildbot but here it is!

Available right now for: Android (AArch64/ARMv7/x86), macOS (Intel), Linux (32bit/64bit), and Windows (32bit/64bit).

Update policy for this core
Upstream. Updates are pulled straight from the upstream repository.

DuckStation/SwanStation core updated

The DuckStation/SwanStation core has been updated to a build from a week ago.

Update policy for this core
This will remain a shallow fork and attempts are being made to make the surface area for patches small so that we can easily pull in updates. Some new contributors have jumped onboard and they want to ensure this core remains updated.

Mainline MAME available for iOS11 and up/tvOS !

The mainline MAME core is now available for iOS and tvOS users! It is also available for Mac Intel x64 users, and we hope that we can make it available for ARM Mac users soon as well.

Also important to note we will be updating to version 0.330 soon.

Update policy for this core
This is pretty much a shallow fork. It just attempts to pull in the latest changes from upstream without making many changes.

gpSP (Game Boy Advance emulator)

Many changes have been made under the hood to significantly increase performance of gpSP. One of the big changes that led to at least a 5-6% performance improvement was the removal of libco (a library used for cooperative threading). 3DS users especially should be in for a treat with gpSP, but realistically everyone benefits across the board, whether you’re on an ARM or x86 system. We can quite comfortably state you will be hard pressed to find a better and more well performing version of this emulator anywhere else right now.

* Support for generic MIPS (including Dingux)
* Built-in BIOS that ships internally and requires no external files/dependencies
* Removal of libco (5-6% perf or so) and some performance fixes for x86/arm/mips (for perf)
* Fixed the x86 dynarec and the ARM dynarec, that were pretty much broken. Good speedups (or power savings on portable devices)

Immediate roadmap for gpSP: PS2 support (coming soon (TM)), rumble and tilt sensor support, AARch64 dynarec (mid-term goal)

One caveat right now is that these changes have unfortunately caused it to no longer work on PS Vita. However, the plan is to fix this soon, and for this to be only a temporary thing.

Update policy for this core
Hard fork, self-maintained.

Picodrive (Sega Mega Drive/Master System/Sega CD/32X emulator)

This has received many speed improvements and enhancements courtesy of irixx, 32X support has seen plenty of improvements, and the results speak for themselves. Works wonderfully on OpenDingux-based devices and PS Vita, some of the lower end systems out there.

A separate blog article might be written about all the changes soon.

Update policy for this core

Hard fork, self-maintained

FCEUmm (Nintendo Entertainment System emulator)

Some important new updates from New Rising Sun that adds more mapper support (PR notes are his):

Add features to mapper 332/BMC-WS:

  • implement additional outer bank bit to support multicarts twice as large as WS-1001 (“Super 40-in-1”)
  • implement CNROM-128/-256 mode using two or four inner banks switched via CNROM-like latch at CPU $8000-$FFFF
  • implement solder pad/DIP switch change via soft-reset, resulting in different multicart menus
  • soft-resetting resets to menu as on real hardware, not just the currently-selected game.
    Tested with the HH-xxx series of multicarts, some of which available on LIBG, as well as the previously-supported WS-1001.
  • I wanted to add a couple of multicart mappers that use the J.Y. Company ASIC and fix a few bugs while doing so. I ended up rewriting the whole thing by porting the code from NintendulatorNRS. This improves the modularity of the code by wrapping the PRG and CHR sync functions with mapper-specific ANDs and ORs, which is necessary for multicart use, and hopefully improves the readability (though I understand that’s a matter of taste). Previous save states had to be invalidated in any case since the previous code only saved four of the eight CHR LSB registers.

    Source organization changes:

    Combine duplicate code from 90.c, bmc13in1jy110.c and sc-127.c into one new file jyasic.c.

    Window text not shown at the beginning of Tiny Toon Adventures 6 (“Baabs is dreaming about becoming an actress”).
    Bad cursor sprite on “Mighty Morphin’ Power Rangers III”‘s title screen.
    Some mapper 295 multicarts not working, such as SC-126.
    Added Adder to ALU (not used by any game).
    Add IRQ mode 3 (writes to CPU address space).
    Save all eight CHR LSB registers (previous code only saved the first four).
    Ignore writes to x800-xFFF except 5800 and C800, needed for Final Fight 3 on SC-128.
    Allow DIP setting to be read from all possible locations: 5000, 5400, 5C00, necessary for a few multicarts.
    Adds the following mappers: 282, 358, 386, 387, 388, 397, 421.

    Remaining issues:

    IRQ timing is not as perfect as the NintendulatorNRS code from which it was taken, which had been verified against real hardware. This is due to there not being a true “PPU Read Handler” in the mapper interface (as far as I can see), and PA12 timing in the core PPU emulation being not accurate enough to replace the “clock IRQ eight times per horizontal blanking” solution that I kept from the previous code.
    There remains one J.Y. ASIC-using mapper: 394, which mounts both the J.Y. ASIC and an MMC3 clone and uses extra register bits to switch between the two. That is a bit difficult to code and will be for another day.
    Successfully tested with:
    Mapper 35:
    Warioland II (JY039)

    Mapper 281:
    (晶太 JY-052) 1996 Super HiK 4-in-1 – 新系列阿拉丁雙Ⅲ组合卡
    (晶太 JY-052) 1997 Super HiK 4-in-1 – 新系列叢林泰山組合卡
    (晶太 JY-053) 1996 Super HiK 4-in-1 – 新系列獅子王超强组合卡
    (晶太 JY-054) 1996 Super HiK 4-in-1 – 新系列快打旋風Ⅱ组合卡
    (晶太 JY-054) 1997 Super HiK 4-in-1 – 超級新系列大金鋼4代組合卡
    (晶太 JY-055) 1996 Super HiK 4-in-1 – 新系列阿拉丁Ⅲ.致命武器組合卡
    (晶太 JY-066) 1996 Power Rangers HiK 4-in-1 – 新系列金鋼戰士專輯組合卡
    (晶太 JY-066) 1997 Power Rangers HiK 4-in-1 – 新系列金鋼戰士專輯組合卡
    (晶太 JY-068) 1996 Super HiK 3-in-1 – 新系列阿拉丁Ⅲ.激龜Ⅲ組合強卡
    (晶太 JY-080) 1996 Super HiK 3-in-1 – 新系列中國兔寶寶全輯組合卡
    (晶太 JY-088) 1996 Super HiK 5-in-1

    Mapper 282:
    (晶太 JY-062) 1996 Super Mortal Kombat Ⅲ Series – 新系列真人快打三代組合卡 18-in-1
    (晶太 JY-064) 1996 新超強 18-in-1 阿拉丁組合系列卡 – Super Aladdin Ⅲ Series Card
    (晶太 JY-069) 1996 Super HiK 4-in-1 – 新系列忍Ⅲ.沼澤怪獸組合卡
    (晶太 JY-070) 1996 Super HiK 3-in-1 – 新系列眞人Ⅲ.兔寶寶組合強卡
    (晶太 JY-071) 1996 Super HiK 3-in-1 – 新系列眞人Ⅲ.小新2.明王組合卡
    (晶太 JY-079) 1996 Super HiK 3-in-1 – 新系列眞人Ⅲ.金鋼4.蜜蜂組合卡
    (晶太 JY-084) 1996 Photo Gun 9-in-1
    (晶太 JY-098) 1997 Super HiK 6-in-1
    (晶太 JY-101) 1997 Super HiK 18-in-1
    (晶太 JY-105) 1997 Super HiK 21-in-1
    (晶太 JY-114) 1998 Super HiK 5-in-1
    (晶太 SC-128) Super 25-in-1 Final Fight
    (晶太 SC-130) Super Photo-Gun 13-in-1

    Mapper 295:
    (晶太 JY-010) Super Ball Series 18-in-1
    (晶太 JY-014B) 1996 Soccer 7-in-1 – 足球專輯 (rev0)
    (晶太 JY-014B) 1996 Soccer 7-in-1 – 足球專輯 (rev1)
    (晶太 JY-050) 1997 Super HiK 8-in-1 (rev1)
    (晶太 JY-095) 1997 Super HiK 4-in-1
    (晶太 JY-096) 1997 Super HiK 7-in-1
    (晶太 JY-097) 1997 Super HiK 8-in-1
    (晶太 JY-099) 1997 Super HiK 4-in-1
    (晶太 JY-100) 1997 Super HiK 5-in-1
    (晶太 JY-109) 1997 Super 9-in-1
    (晶太 JY-110) 1997 Super 13-in-1
    (晶太 SC-126) 方塊專集 HiK Block 14-in-1

    Mappers 90/209/211:
    (晶太 CK-124) Super HiK 8-in-1
    (晶太 JY-118) 1998 Super 3-in-1
    (晶太 JY-120A) 1998 Super 45-in-1
    (晶太 JY-122) 115 超強合卡
    Aladdin – 阿拉丁
    Aladdin III, Popeye II꞉ Travels in Persia
    Contra Spirits (1995)
    Donkey Kong Country 4
    Final Fight 3
    Mickey Mania 7
    Mighty Morphin’ Power Rangers III
    Mighty Morphin’ Power Rangers IV꞉ The Movie
    Mike Tyson’s Punch-Out!! (JY021)
    MK3 – Special 56 Peoples
    Mortal Kombat 2-in-1
    Mortal Kombat II Special
    Super Aladdin꞉ The Return of Jafar
    Super Mario & Sonik 2 (rev1)
    Super Mario World
    Super Mortal Kombat 2-in-1
    Tiny Toon Adventures 6
    中國兔寶寶 Rabbit
    真 Samurai Spirits 2꞉ 覇王丸地獄変
    鉄拳 – Tekken 2

    mappers 358/386/387/388/397/421:
    (晶太 JY-016) 1997 Super Game 7-in-1
    (晶太 JY-056) 1996 Super HiK 4-in-1 – 新系列真人快打Ⅱ特別版 (rev0)
    (晶太 JY-056) 1996 Super HiK 5-in-1 – 新系列眞人快打Ⅲ56人特別版 (rev1)
    (晶太 JY-082) 1996 Soccer 6-in-1
    (晶太 JY-087) 1996 Super HiK 4-in-1
    (晶太 JY-089) 1996 Super HiK 4-in-1
    (晶太 JY-090) 1996 Super HiK 5-in-1
    (晶太 JY-093) 1996 Super HiK 4-in-1
    (晶太 JY-094) 1996 Super HiK 4-in-1
    (晶太 JY-113) 1998 Super HiK 5-in-1
    (晶太 JY-117) 1998 Super HiK 6-in-1
    (晶太 SC-129) 98 街頭快打格鬥 15-in-1

    bSNES HD Beta/bsnes mainline available for iOS/tvOS/ARM64 Mac

    Widescreen SNES emulation on your iDevice and ARM Mac is now available!

    Update policy for this core
    Upstream, gets built straight from DerKoun’s upstream repository.

    Genesis Plus GX Wide available for iOS/tvoS/ARM64 Mac

    Another welcome addition to the Apple fold – the widescreen-enhanced version of Genesis Plus GX! For more on that, read this article here.

    Update policy for this core
    Hard fork, as it makes many sweeping changes to Genesis Plus GX to achieve widescreen support, which would make resyncing with upstream very hard to do.

    Other cores which have received updates

    Here is a list of other cores that have received updates, but for which we cannot post any changelogs due to lack of time. We might go into some more of the changes here later on.

    Beetle PSX
    FB Neo
    MAME 2003 Plus
    P-UAE (Amiga emulator)

RetroArch 1.9.1 – shines brightly on OpenDingux

Written by jdgleaver

This is a followup article to our main release blog post, which can be read here.

Official support for OpenDingux devices such as the RG350M, RG280V and GCW-Zero was added last December; a full round-up of features and highlights can be found in the original announcement here. Version 1.9.1 represents the first stable release for this platform.

As an integrated member of the RetroArch family, the OpenDingux port benefits from all frontend development work – but a major addition for this release is a separate, optimised build for OpenDingux Beta (link here). This is an updated, modern firmware (compatible with many devices) which offers significantly improved performance. RetroArch is one of the first applications on OpenDingux Beta to enable configuration of the hardware IPU (Image Processing Unit), with menu-based control of aspect ratio/integer scaling and image filtering method (available on Beta releases after 16/03/2021). Users who prefer to remain on stable operating systems need not fear, however: RetroArch will always be optimised for both beta and stock firmwares.

Aside from RetroArch itself, expanding the library of available cores has been a major focus of this release. Launching initially with 20 hand-picked cores, a further seven have been added to the list:

  • Mr.Boom
  • O2EM (Magnavox Odyssey2 / Phillips Videopac+)
  • Potator (Watara Supervision)
  • ProSystem (Atari 7800)
  • ScummVM (Note: High resolution games unsupported)
  • Stella 2014 (Atari 2600)
  • TIC-80

All of these cores have excellent performance on OpenDingux devices (with the mild exception of TIC-80, which can be a demanding system on many platforms – yet a number of popular carts run full speed). It should also be noted that when building cores for OpenDingux, we don’t just hit compile and call it a day. This is a curated port, and care is taken to clean up code and add features wherever possible – and these additions improve the user experience on *all* platforms. For example:


  • The model and region of the emulated console (Odyssey 2, Videopac+ G7400) can now be specified via core options
  • A volume control and optional low pass audio filter have been added, along with audio fixes/performance improvements
  • An ‘Interframe Blending’ option has been added, used to simulate CRT ghosting effects
  • A ‘Crop Overscan’ option has been added
  • Gamepad inputs can now be swapped (required for a number of games), and numeric keys have been mapped to gamepad buttons
  • The rendering of the virtual keyboard has been optimised, reducing performance overheads by 44%-63%
  • Save states have been fixed


  • This newly-added core was ported specifically for use on OpenDingux devices!


  • 16 bit colour depth support has been added for improved rendering performance
  • An optional low pass audio filter has been added, along with general audio quality improvements
  • A dual stick controller mode has been added for games such as Robotron: 2084

Stella 2014

  • 16 bit colour depth support has been added for improved rendering performance
  • An ‘Interframe Blending’ option has been added, used to simulate CRT ghosting effects and remove screen flicker
  • An optional low pass audio filter has been added
  • Full analog paddle support is now available


  • Comprehensive support for mouse input via gamepad has been added

And one more gift for OpenDingux users: the gpSP core now has a fully functional dynarec, courtesy of davidgf. This means full speed GBA emulation, with plenty of headroom for video filters, colour correction and inter-frame blending!

(gpSP has also seen many other fundamental improvements, too many to list here – further updates will be covered in a separate post)

RetroArch 1.9.1 released!

RetroArch 1.9.1 has just been released.

Grab it here.

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!

RetroArch back in action!

Today marks an important day for our project. We consider the migration to the new infrastructure to be almost 95% done. We have left the old infrastructure behind, it is done and dusted and a thing of the past.

From now on, you can expect periodic stable releases again for all platforms. Expect our project to be hitting on all cylinders from this point on!

One blog post is not enough to go through all the milestones that have been reached, so expect many followup blog posts in addition to this. In this blog post instead we will try our best to summarize most of the highlights.

What remains to be done:

  • Some cores will still need to be added (mainly cores that require compilation with CMake for iOS)
  • Windows binaries right now are still unsigned and not codesigned. We have ordered an Extended Validation code signing certificate which will allow our Windows binaries in the future to pass through SmartScreen with no issue. This will cost us a pretty penny each year but we consider the additional cost worth it for our users. We hope that by the time the next stable rolls out of the door, these binaries will all be signed, as will the nightlies.
  • Because of this, be aware that while installing RetroArch on Windows with the Installer, you might be greeted by a SmartScreen filter that the application is unsafe. You can safely ignore this.

Here’s some additional new platform releases since this new stable:

  • For the first time ever, we have rolling nightlies and stables for iOS (ARM64/Aarch64), tvOS, and macOS.
  • For the first time ever, we have an Apple Silicon/Mac M1-compatible build of RetroArch. Download the Universal Metal build if you intend to use RetroArch on one of these new Macs.
  • For the first time ever, we also have a new backwards compatible version of RetroArch for iOS 9 users. iOS users can choose between an iOS 9 version (which is 32bit ARM only) and an iOS 11 version (which is 64bit ARM only). We intend to follow this up in the near future with an iOS 6 version. We here at RetroArch believe in the promise of backwards compatibility and we always intend RetroArch to be an omnipresent platform that can be run on any device you want. We love the ability of users being able to turn their obsolete iDevices into capable little RetroArch handheld machines.
  • For the first time, macOS stables and nightlies are codesigned and notarized. So you no longer need to resort to workarounds in order to install them on your Mac.
  • We have nightly and stable releases for OpenDingux now, including a special release for a beta firmware. This version should have significantly better performance. Supported devices for this platform include (but are not limited to): GCW Zero, RG350M, RG280V, and possibly more.
  • There are now nightly and stable releases for Linux available for both 64bit and 32bit x86 PCs in the form of AppImage bundles. These bundles come with a portable home directory with assets included, or you can use them with your existing settings and assets from the typical ~/.config/retroarch location. There are two available packages: one that includes the Qt desktop menu and one without, in case your system-installed Qt libs conflict with the ones it comes bundled with. The AppImage builds should work with most distros that were released in the last three years or so.

Release notes

  • There is no PCSX ReARMed core available for the Switch port as of yet. This will be added later.
  • The Direct3D 11 video driver now defaults to the ‘flip model’. There will be a setting added later that will make it possible to switch between ‘flip model’ and ‘blit model’. Flip model is supposed to be more performant and allow for better performance in windowed/borderless fullscreen modes.
  • As mentioned earlier, Windows installers/executablers are currently not codesigned, so expect SmartScreen to warn you about them. We hope to be able to fix this as soon as our Extended Validation codesigning certificate is fully operational.
  • There is currently no Windows 95/98 version of RetroArch available, or any of the MSVC2003 cores in fact. Expect these to be added back later.

Some highlights

  • Overlay improvements:
    • Full position/scaling configuration, automatic scaling, automatic hiding when a controller is connected
    • A new high quality default gamepad overlay: neo-retropad(-clear)
  • File browser improvements: most menu entries now (optionally) remember last selected directory/file (load content, shaders, etc.)
  • Support for saving per-directory core options and deleting core option overrides
  • Improvements to input configuration: new drop-down lists, proper menu ordering of input binds, cosmetic clean-ups (basically all of sonninnos’s stuff)
  • Option to automatically enable ‘game focus’ mode when running/resuming content
  • Many new video filters for platforms without shader support
  • RGUI: CJK and Russian language support


We can’t possibly list everything since it has been such a long time since the last stable. Nevertheless, here is the changelog broken down as best as we could.


  • 3DS: Graphics widgets support
  • 3DS: On error, only init gfx on salamander build. This prevents graphical issues if the gfx is already initialized. Which should always be the case if called from a running core
  • 3DS: Update error applet
  • 3DS: Enable online Core Updater
  • 3DS: Guard threading
  • 3DS: Allow sideways screen rotation
  • 3DS: Enable threading and add a threaded audio driver
  • ANDROID: Implementation of fullscreen over notch function (for Android 9.0 and up)
  • ANDROID: Add Play Store module support.
  • ANDROID: Add option to switch all installed cores to Play Store versions
  • AUDIO: Memalign audio buffers to 64 bytes. This is the most common cache line size, helps with performance. Also fixes issues with platforms like PSP that wrongly assume that malloc returns aligned buffers (to 16bytes). This recently broke the PSP builds
  • AUDIO/ALSA: Fix float format detection
  • AUDIO/JACK: Deinterleave in the process callback. This allows us to avoid the extra copy to the deinterleave buffer and lets us use only a single jack ringbuffer
  • AUDIO/JACK: (Audio/JACK) Fix non-blocking write. Previously we would wait on the condition variable even in the non-blocking case. This improves fast-forward performance massively and brings JACK in line with other backends in that regard
  • AUDIO/XAUDIO2: Fix threaded audio bugs with cores like Dinothawr
  • CONFIG: Add support for saving per-directory core options and deleting core option overrides
  • CONFIG: Enable saving of changed parameters when ‘#include’ directives are used
  • CONFIG/DIRS: Enable configuration of the directories used for Favorites, History, Images, Music and Video playlists
  • CONFIG/REMAPS: Allow loading core remaps without content
  • CONFIG/OVERRIDES: Fix empty override paths when launching without content
  • CHEATS: Maximum search value corrections
  • CHEEVOS: Generic memory mapping using rcheevos
  • CHEEVOS: Ensure badge textures are released before video driver is deinitialized. Should fix crashes with slang shaders.
  • CHEEVOS: Include achievement runtime state in save states
  • CHEEVOS: Prevent hardcore toggle when emu-handled cheats are active
  • CHEEVOS: Add confirmation submenu to achievements hardcore toggle
  • CHEEVOS: Calculate leaderboard widget spacing based on video resolution
  • CHEEVOS: Show unsupported core message when viewing achievement list for unsupported core
  • CHEEVOS: Allow disabling leaderboard notifications and trackers separately
  • CHEEVOS: Add display widget for active leaderboards
  • CHEEVOS/CORE OPTIONS: Core options blacklist. Disables hardcore mode when certain core options are set
  • CLI: Add option for quitting on close content
  • CONTEXT/DRIVER SWITCHING: Allow context switching from gl to glcore
  • CORE OPTIONS: Add option to reset all core options for current core/content
  • CORE OPTIONS: Add per-folder core options
  • CRT/SWITCHRES: Improvements
  • CRT/SWITCHRES: Low resolution switch bug fix – This allows resolutions lower that 32×224 like 256×224 to work
  • CORE DOWNLOADER: Enhanced core downloader search functionality
  • D3D10: Should now be able to use shaders with hardware-accelerated libretro cores
  • D3D11: Should now be able to use shaders with hardware-accelerated libretro cores
  • D3D11: Skip shader/stock blend when we don’t have a texture. This happens if the core calls video_cb with the frame set to null on the first frame, and was causing black screens/driver resets. The ffmpeg core seems to do this.
  • D3D11: Fix shaders with scaled framebuffers
  • D3D11: Add flip model support – fallback to blit model for OSes where flip model is not supported (windows 7 and earlier). Will add a menu option later allowing the user to switch inbetween the two
  • D3D12: Should now be able to use shaders with hardware-accelerated libretro cores
  • D3D10/11/12: Increase sprite capacity, we need this so that the hardware rendered menu drivers doesn’t glitch out
  • DRM: Fix race condition in drm_surface_set_aspect
  • DRM/KMS: add support for custom HDMI timings / modes
  • DATABASE: Fix crash that could happen when selecting cursor
  • DATABASE/EXPLORE: Fix – Prevent segfault when accessing ‘Explore’ menu
  • EMSCRIPTEN: Only report back one screen pointer for rwebinput, fixes lockup when clicking on an overlay
  • FILEIO/PERFORMANCE: Only attempt to call dir_check_defaults once per runtime session
  • FILEIO/PERFORMANCE/3DS: Increase file buffer size and savestate chunk size. This seems to help with saving large savestates
  • FONTS: Improve handling of Arabic and Persian text
  • FONTS/FREETYPE: Use fontconfig to select fonts if available
  • INPUT: Add hold mode for turbo fire ‘Single Button’
  • INPUT MAPPING: Refresh bind list on device type change
  • INPUT MAPPING/REMAPPING: Minor bugfix – Remap file browsing starts navigation at input_remapping_directory even if the core-subdir (where saved files go) exists Having remaps for many different cores makes finding the active core files cumbersome, especially because remaps are not compatible between different cores (but maybe for cores emulating the same hardware)
  • IOS: Take out ‘Core Downloader’ from iOS 9/iOS 11 builds
  • IOS: IOSApp doesn’t crash anymore when a file is shared to it
  • INPUT: Keyboard device mapper rework
  • INPUT: New input bind order scan/clear fix
  • INPUT: Duplicate key event blocking additions
  • INPUT: Prevent duplicate key events with hotkeys + keyboard device type
  • INPUT: Keyboard LED driver
  • INPUT/AUTOCONFIG: Allow controllers with no/empty names to work.
  • INPUT/GAME FOCUS: Add option to automatically enable ‘game focus’ mode when running/resuming content
  • INPUT/HOTKEYS: Hotkey for Close Content / Unload Core
  • INPUT/LIBCEC: Map libcec-daemon keys to RETROK
  • INPUT/X11: Enable keyboard input when mouse cursor is not inside the RetroArch window but window still has focus
  • INPUT/X11: Fix mouse input when mouse is grabbed
  • INPUT/UDEV/RUMBLE: Fix rumble.
  • INPUT/WINDOWS/DINPUT: Simultaneous shift sticky fix
  • INPUT/WINDOWS/DINPUT: Prevent Win-key from opening Start Menu
  • INPUT/WINDOWS/DINPUT: Option for disabling Windows hotkeys
  • INPUT/WINDOWS/DINPUT: Mouse grabbing/clipping with Alt-Tab
  • INPUT/WINDOWS/DINPUT: Mouse grab fixes
  • INPUT/WINDOWS/RAWINPUT: Key position fixes
  • INPUT/WINDOWS/RAWINPUT: Mouse grab fixes
  • INPUT/WINDOWS/RAWINPUT: Prevent outside window mouse clicks when grabbed
  • INPUT/WINDOWS/RAWINPUT: Option for disabling Windows hotkeys
  • INPUT MAPPING/REMAPPING: Major bugfix – Remap file having a different device type requires manual intervention after loading for the core to register the type properly
  • JSON: New faster json parser/writer library rjson
  • JSON/RJSON: Replace rapidjson parser/writer in discord-rpc with rjson
  • LIBRETRO: Add API extension for cores to query the number of active inputs provided by the frontend
  • LIBRETRO: Ensure RARCH_CTL_CORE_OPTIONS_LIST_GET returns false if no core options are available
  • LIBRETRO: Add API extension for overriding frontend audio latency
  • LIBRETRO: Add API extension for cores to monitor frontend audio buffer occupancy
  • LINUX: Also show /run/media or /run/media/$USER in drives list
  • LINUX: Adjust brightness according to the limit. Seems like some platforms feature non-standard maximums, but the variable is correclty exported for us to use
  • LOCALIZATION: Add Finnish language
  • LOGS/SHADER: Shader log spam reduction
  • LOGS/CONFIG: Config logging cleanup
  • LOGS/SAVESTATE: Config logging cleanup
  • MAC: Apple Silicon/Mac M1 support
  • MAC: Code signing/notarization
  • MAC: Fix a leak with NSTemporaryDirectory() on ARC (Automatic Reference Counting) code
  • MAC: Support bundle assets extraction on macOS
  • MAC: Universal Metal build for both ARM and Intel Macs
  • MAC/UNIVERSAL: Add CoreAudio3 audio driver for Metal Universal build
  • MAC/IOS: Only extract assets once on first install
  • MENU: Add ‘L2 + R2’ menu toggle gamepad combo
  • MENU: Menu text improvements; clarifications, consistency, text mistakes,
  • MENU: Tweak menu scroll initial hold delays
  • MENU: Restrict menu acceleration to navigation buttons
  • MENU: Add ‘Menu Driver’ setting to ‘User Interface’
  • MENU: Relocate ‘Menu Scroll’ settings.
  • MENU: Separate ‘Turbo Fire’ menu.
  • MENU: Dropdown menu for ‘Custom Aspect Ratio’ setting.
  • MENU: Reorder Mouse Index next to Device Index
  • MENU: Submenu for Device Index/Mouse Index
  • MENU: Reorganize User Interface menu
  • MENU: Add ‘Remove DSP Plugin’ menu entry
  • MENU: Hide ‘Auto-Shader Delay’ menu setting when shaders are unavailable
  • MENU/ANIMATIONS: Fix non-smooth text ticker + reduce line ticker code duplication
  • MENU/ANIMATIONS/OZONE: Add cursor wiggle animation
  • MENU/ANIMATIONS/OZONE: Implement wiggling for main menu when wrap-around is disabled
  • MENU/NOTIFICATIONS: On-Screen Notifications’ menu clean-ups
  • MENU/NOTIFICATIONS: Add option to show/hide Refresh Rate notification
  • MENU/FILEBROWSER: Start auto-selecting last used path for more file browser menu entries
  • MENU/INPUT: Input port label adjustments
  • MENU/INPUT/XMB: Proper control port icons
  • MENU/INPUT/OZONE: Proper control port icons
  • MENU/QUICK MENU: Add remap clearing ability under Quick Menu controls
  • MENU/QUICK MENU: Cap ‘State Slot’ drop-down list to a maximum of 1000 (+Auto) entries
  • MENU: Customizable menu scroll hold delay.
  • MENU/DESKTOP: Fix mouse cursor limited by window range on F5 press
  • MENU/DESKTOP: Add simple shader option
  • MENU/DESKTOP/WINDOWS: Remove broken ‘Update RetroArch’ functionality for Windows. We want this to not only be system agnostic if we bring it back, but also work outside of the Qt desktop interface
  • MENU/OZONE: New Theme – Twilight Zone
  • MENU/RGUI: Add 3:2, 5:3 and 3:2/5:3 (centered) aspects
  • MENU/RGUI/TEXT RENDERING: Add Russian language text support
  • MENU/RGUI/TEXT RENDERING: Add support for CJK punctuation glyphs
  • MIDI/WINMM: Recover from MIDI messages not handled by the device
  • MIDI/WINMM: Fix winmm midi driver hanging on content closing
  • NETWORK: Add READ/WRITE_CORE_MEMORY network commands
  • NETWORK: Fix backwards condition in socket blocking behavior
  • NETWORK/NETPLAY: Attempt IPv4 when IPv6 fails
  • OGA/VIDEO: support for OGS
  • OGA: This keeps the tradition DRM driver along with the OGA one. The probe function skips the driver if the screen is non rotated to fall back to the regular DRM driver.
  • OGA: Fix messages from not disappearing
  • OGA: Implement RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER. This is a faster rendering codepath for software rendered libretro cores that some libretro cores use right now. Video drivers in RetroArch have to explicitly implement this for this codepath to work at runtime.
  • OPENDINGUX: Add/Optimise rumble interface
  • OPENDINGUX: Fix frozen video when enabling fast forward
  • OPENDINGUX/SDL: OSD font clean-up
  • OPENDINGUX/SDL: Enable selection of image interpolation method when using ‘sdl_dingux’ gfx driver
  • OPENDINGUX/SDL: Enable integer scaling when using the ‘sdl_dingux’ gfx driver
  • OVERLAYS: Add option to scale overlays automatically (with aspect ratio correction)
  • OVERLAYS: Hide Overlay When Gamepad is Connected. Overlays will be hidden automatically when a gamepad is connected in port 1, and shown again when the gamepad is disconnected.
  • OVERLAYS: New default overlays for mobile (neo-retropad)
  • OVERLAYS: In addition to overlay scale, the user can now set an Overlay Aspect Adjustment factor. Most overlays are designed for 16:9 displays, which means they become stretched/ugly on modern wide aspect phones and suchlike. By changing the Overlay Aspect Adjustment factor, a user can scale the overlay width/height to achieve a uniform appearance regardless of display resolution.
  • OVERLAYS: Since scaling a gamepad overlay can result in buttons being squished too close together (or being pulled too far apart), the user can now adjust the effective spacing of the different ‘halves’ of an overlay via Overlay Horizontal Separation and Overlay Vertical Separation factors. Overlay Horizontal Separation divides the overlay in two vertically (left/right, at the centre point), and applies a spacing offset (positive or negative) between the UI elements on each side; Overlay Vertical Separation does the same, but the split is horizontal (top/bottom)
  • OVERLAYS/FIX: The Overlay X Offset and Overlay Y Offset options have been fixed, and now work correctly
  • OVERLAYS/FIX: All of the above options (and Overlay Scale) are configured and saved independently for landscape and portrait display orientations – so adjusting everything for a nice landscape layout won’t break the portrait display
  • OVERLAYS/FIX: When using the Vulkan gfx driver, memory is leaked every time an overlay is freed
  • OVERLAYS/FIX: When threaded video is enabled, loading overlays with no images (i.e. utility-type overlays, where everything is hidden until the screen is touched) can generate segfaults due to improper usage of realloc()
  • OVERLAYS/FIX: When Show Inputs on Overlay is enabled, ASAN reports bit shift errors due to an incorrect range check when handling turbo inputs – essentially, there is no upper limit to the considered input id range, which means overlay hotkeys (menu toggle, etc.) are incorrectly treated as having turbo support, causing bit shifts using wildly inappropriate id indices
  • PLAYLISTS/PORTABLE: Fixed first load initialization
  • PS2: Added Multitap support (up to 8 players)
  • PS2: Fix for not recognized digital and other non-standard controllers
  • PS2: Fix Quitting from RA
  • PS2: Add Audio mixer
  • REWIND: Prevent ‘Rewind Frames’ from being set to ‘1’ incorrectly on load content
  • RUNAHEAD: Add Run-Ahead Toggle hotkey with notifications
  • RBUF/ANIMATIONS: Simplify gfx_animation by switching from dynarray to rbuf
  • RBUF/CORE UPDATER: Replace static entries array with dynamic array via RBUF library
  • RBUF/M3U: Replace static entries array with dynamic array via RBUF library
  • SENSORS: Android (crash-)fixes/improvements + add option to disable sensor input
  • SDL2/VIDEO: Get the SDL2 video driver to work in Wayland/KMS
  • SAVESTATES: Adding savestate garbage collector for autoincrement stavestates. As some issues indicate, there’s an issue with the autoincrement save slot feature: slot index will increase and very old saves won’t be deleted. This adds support to delete old save states with a user defined save state limit (global). Instead of wrapping around the slot counter it will simply delete the oldest save, since it is simpler. For now there’s a limit of one deletion per save, which ensures a user cannot delete many saves by accident if they set the limit too low.
  • SAVESTATES/SAVEFILES: Ensure save file and playlist compression is disabled by default
  • SHADERS: Add option to remember last selected shader preset/shader pass directories
  • SHADERS: Use last selected shader preset directory when changing shaders via previous/next hotkeys
  • SHADERS: Remove Parameters line
  • SHADERS: Shaders fix for duplicate parameters loading bug
  • SHADERS: Fix Crash change num shader passes in UI
  • SHADERS/SLANG: Fix slang shaders with rotation
  • STREAMING/FFMPEG: Add Facebook Game Stream option (for embedded ffmpeg core-enabled RetroArch builds)
  • SWITCH: Fix input bind icons being off by one line
  • SWITCH: Fix audio issues
  • TLS/SSL: Add BearSSL support, as alternative to mbedTLS
  • VIDEO: AddVariable BFI (Black Frame Insertion)
  • VIDEO/DRM GO2: Dynamic resolution support
  • VIDEO FILTERS: Video filter optimisations
  • VIDEO FILTERS: Add several LCD-effect video filters
  • VIDEO FILTERS: Gameboy/Dot_Matrix video filters: Add XRGB8888 support
  • VIDEO FILTERS: Add Normal4x video filter
  • VIDEO FILTERS: Add ‘Upscale_256x-320×240’ video filter
  • VIDEO FILTERS: Add ‘Upscale1.5x’ video filter
  • VITA: Disable temporarily VitaGL
  • VITA: Fix bubble name
  • VITA: proper handling of boot params
  • VITA: Default menu scale 1.5x to improve readability
  • WIFI/LAKKA: Add a proper WiFi menu, with Enable/Disable & Disconnect options. This also allows WiFi passwords to be remembered. The underlying tool (connman) allows to store passswords (that’s why it auto connects whenever you boot a Lakka device), so we expose this so that the user does not have to re-input the pass when connecting to a saved wifi.
  • WII/HID: Added HID support for HORI mini wired ps4 gamepad
  • WINDOWS: Add support for accelerators to main win32 message loop
  • WINDOWS: Add accelerators for Open (Ctrl+O) and Fullscreen (Alt+Enter)
  • WINDOWS: Fixes some file I/O failures on Windows when paths are longer than 260 characters.
  • WINDOWS: Fix crashing on startup on Windows when using Chinese Simplified language.
  • WINDOWS/XP: The OpenGL 1 video driver is now the default for maximum backwards compatibility upon first startup. It’s of course always possible for the user to change this.
  • WINDOWS/MENUBAR: Load accelerators, Localize Win32 menu items to current language, and display shortcut keys
  • WINDOWS/MENUBAR: Add ‘Reinit’ to Menubar
  • WINDOWS/MSVC: Fix rewind crash on MSVC build when using SSE2
  • UWP: Don’t default to XMB menu by default, default to Ozone instead
  • UWP/VFS: Use Win32 file APIs when possible – better file I/O performance
  • WIIU/FILEIO/PERFORMANCE: Faster startup times – remove the path_is_valid() call when loading textures
  • WIIU: Fix touchscreen mouse emulation

RetroArch for iOS/tvOS nightlies available starting today!

Starting today, we will start offering nightly versions of RetroArch for iOS and tvOS on our buildbot!

In the past, harakari would grace us every month with a pre-compiled version that we then had to manually upload to our buildserver. Now, it’s fully automated, so both iOS and tvOS versions of RetroArch will be built with each nightly and stable cycle!

Where to get it

Our Downloads page links to the latest nightlies for iOS/Apple TV.

The iOS version requires you to have iOS 11 or later installed.

How to install

Installing sideloaded apps on iOS and tvOS devices is a bit more complicated than it is on Macs. If you want to use the binaries on our site, this is what you have to do:

Get a Apple Developer Certificate
Apple asks about $100 per year for individuals. You will then have to re-sign the .ipa file that you download from our site. You can read more on how to do this here.

NOTE: You can use the program on your Mac to re-sign as well, just to list another option.

We’d like to be able to provide a more easy and convenient way to install RetroArch on iOS/tvOS in a legal way in a manner we approve of (no ads, no monetization, etc.).

iOS/tvOS notes

No Core Installer – The Core Downloader is useless for these versions. It will likely be hidden/removed altogether in the future since it currently serves no purpose as cores also need to be individually codesigned.

First-time asset extraction – On first startup, it will extract the assets from You will notice it starting up with low-res assets and telling you to wait until this process has finished. Fortunately, this will only happen once and will not happen again afterwards.

How many cores available at launch?

There should be over 84+ cores available for iOS and tvOS. Just like the ARM Mac version, we are far from done here, and you’ll see this core library rapidly expand as we add more and more cores.

More ARM Mac cores added

In the meantime, we have added even more cores for the ARM Macs. We are now up to 93 cores, up from the 75 we started with a few days ago!

RetroArch for Apple Mac M1 softlaunches today!

We’re happy to announce that RetroArch for Mac M1 will be available for download starting today on our website! Get it here.

We’ve put a significant amount of effort into our new infrastructure to ensure that all the RetroArch binaries for Mac (whether they are nightlies or stables) are now codesigned and notarized. This way, it no longer requires you to disable GateKeeper or start up the program in an obtuse way to get the program to start.

Two versions/where to get it

There are two versions for now:

  • RetroArch with OpenGL (for x86 x64 Macs) (latest nightly here)
  • RetroArch with Metal (for x86 x64 / ARM Macs) (latest nightly here)

As always, you can find these versions on our Download page. If you browse the Download page on a Mac, it will even show a convenient ‘Stable’ and ‘Nightly’ button for both versions.

NOTE: There is no Qt support yet in these versions. This means that the Desktop Mode (triggered with F5) is not available in these builds as of this time. When/if we add this we will inform you of this in a future blog post. Stay tuned for further information on that.

There is also another problem with Qt that pertains to ARM Macs – there is no official support yet. All the stable binaries out right now are for Intel Macs. Hopefully this situation will improve later on so that ARM Mac support comes out of the box.

RetroArch with Metal (for x86 x64 / ARM Mac – Universal app

RetroArch with Metal (for x86 x64 / ARM Macs) is a ‘universal’ version. This means that it will work on both ARM and Intel Macs. It uses the latest technologies available in modern Macs, like a new CoreAudio 3 driver, and a Metal graphics driver. The only disadvantage is that there is no OpenGL support. We might want to include this later on still in the build, but we are not sure yet if this will make sense for the universal build. I guess it all depends on how long Apple will keep it in ‘deprecated’ mode before removing it altogether.

RetroArch with OpenGL (for x86 x64 Mac)

RetroArch with OpenGL (for x86 x64 Macs) will only work on Intel Macs. You will be able to run it on an ARM Mac with Rosetta2, but for a more optimized experience you definitely want to go with the former version (Metal). You might still want to use this version though if you need some OpenGL-based libretro cores to work.

State of the ARM Mac RetroArch port

There are currently 75 Libretro cores available as of this writing. You can get them by going to Online Updater -> Install Cores inside RetroArch. We are going to be adding more as time goes on.

The ARM Mac version uses Metal as the video driver. There is no OpenGL driver. This means that OpenGL-based cores will currently not work on this version. If you want to use a core that requires OpenGL to function, you will have to download and install the x86 x64 version of RetroArch (with OpenGL) on your Mac and rely upon Rosetta2 emulation. Yes, it’s slightly inconvenient to have two versions of the same app installed on your computer. Hopefully later on we can find a solution so that this is no longer necessary, whether it’s through adding OpenGL driver support (assuming OpenGL remains available and won’t be removed altogether as we fear Apple might do) or whether that means going with some middleware wrapper that translates OpenGL to Metal.


In order to install RetroArch on your Mac, you need to make sure that your Mac is configured to allow apps downloaded from “App Store and identified Developers”. Go to System Preferences, Security & Privacy. Go to the tab 'General' and make sure that 'Allow apps downloaded from' is set to 'App Store and identified developers'. If it isn’t, click on the lock to make the necessary changes.

After this, you should have no problem installing RetroArch from our website. Download the zip file from our site, unzip it, this will give you a .dmg file. Mount the dmg file by clicking on it. Now simply drag the RetroArch icon over to the Applications icon. And you should be done!

NOTE: We changed the way assets are dealt with in RetroArch for Mac. Previously, assets were bundled in the .app itself and they would be stored there as well. Now, they are stored in a support directory in your user partition instead.

There is now also a first-time asset extraction process. Be aware that if the file ~/Library/Application Support/RetroArch/configs/retroarch.cfg already exists, it won’t try to extract the assets at first-time startup. Please keep this in mind in case you see low-resolution bitmapped fonts without any icons. Alternatively, you can always just update the assets directly from within the app by going to Online Updater, and selecting ‘Update Assets’.

Final thoughts

Lastly, we can tell you that the ARM-optimized version of RetroArch runs great on current Apple M1-based hardware. We are quite impressed with the overall level of performance on display, and our first priority will be to expand the amount of cores that are supported. Right now we have 75 Libretro cores available but we should be able to reach a number closer to the x86 x64 version.

Special thanks

Special thanks to Xer The Squirrel, kivutar, harakari and others for helping out with the key signing and work on our new infrastructure. We wouldn’t be at this stage right now without them!

Stella 2014 Core improvements – now fullspeed on OpenDingux devices, and more

Written by jdgleaver

Two new core options have been added:

Color Depth (Restart): This allows the user to select between RGB565 and XRGB8888 pixel formats. At present, the core forces XRGB8888, which is very slow on some platforms. Selecting 16-bit colour can significantly improve performance.

Interframe Blending: This enables the (crude) simulation of CRT phosphor ghosting effects. Simple performs a 50:50 mix of the current and previous frames. The Ghosting options accumulate pixels over successive frames, with persistence from 65% to 95%.

The main purpose of Interframe Blending is to alleviate the flickering that is common in many Atari 2600 games, caused when developers used the workaround of toggling sprites on alternate frames to show more simultaneous on-screen objects than the hardware strictly allowed. For example:

  • Setting Interframe Blending to Simple will remove the flashing in Asteroids
  • Setting Interframe Blending to Ghosting (95%) will almost completely remove the flashing in Pac Man

Ghosting can also produce nice effects in games that don’t flash – e.g. Beamrider looks rather special with Ghosting (85%).

Care has been taken to implement these options in a performant manner. With 16-bit colour depth, all Interframe Blending methods run full speed even on an RG350M (OpenDingux) with 2x video filters.

Genesis Plus GX Wide now available for Libretro/RetroArch!

heyjoeway has made a custom fork of Genesis Plus GX with experimental widescreen (16:9) options, called ‘Genesis Plus GX Wide’. We now offer this version on our buildbot, and you can download/install it right now on RetroArch for most platforms!

Available for:

  • Android (on Play Store it’s available on Plus only)
  • macOS
  • iOS
  • Linux
  • Windows
  • 3DS
  • Switch (libnx)
  • GameCube
  • Wii
  • WiiU
  • PlayStation Vita

How to get it

First, make sure you update the Core info files. To do this, go to Online Updater, and select ‘Update Core Info Files’.

There are two ways to install and/or update the Genesis Plus GX Wide 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 ‘Sega – MS/GG/MD/CD (Genesis Plus GX)’ from the list. It will then download and install this core.


This is an experimental feature right now. Some games might already output nicely with widescreen, while others will likely require patches to display properly.

It works only on Sega Genesis/Mega Drive games, and not Sega CD/Mega CD games.

How it works/how to use it

To use the new widescreen feature, go to Quick Menu -> Options.

Extra columns to draw in H40 for widescreen
This determines how many extra columns to draw for a widescreen aspect ratio. ‘0’ means no extra columns will be drawn.

In the previous version, this was always set to 10. Now, you are able to tweak this setting. Some games will require a value lower or higher than 10 to display properly, and some games allow you to set it as high as possible.

Let us run down the list of some games and what the best possible configuration for them is:

Ecco The Dolphin 1/2: Set this to 22 (or lower depending on your preference). See screenshot here. (See default 4:3 image here).

Thunder Force IV: Set this to 22 (or lower depending on your preference).

Streets of Rage 1/Bare Knuckle 1: Set this to 18, minimal pop-in (see screenshot here). Set the value lower to eliminate it altogether at the expense of a reduced field of view (See default 4:3 image here).

World of Illusion: Set this to 18 (for minimal pop-in). Set the value lower to eliminate it altogether at the expense of a reduced field of view.

Thunder Force IV: Set this to 20.

Virtua Fighter 2: Set this to 18. See screenshot here. See default 4:3 image here.

Special instructions for Sonic The Hedgehog 1/Sonic CD widescreen

Sonic The Hedgehog 1 runs well in widescreen but requires you to patch the ROM first. Thankfully, heyjoeway made this rather easy for the user to accomplish. Go to this site here and select your ROM file. It will then spit out a modified ROM with proper widescreen modifications.

With the patched version, you can set extra columns to as high as 12. Any more and you will run into the limits of the game’s plane sizes and see pop-in on the right side of the screen.


Introducing the RetroArch Open Hardware project

So ProjectFuture finally materialises! From the beginning, we have been unsatisfied with the general state of the retrogaming scene when it comes to being able to dump and play your own legally bought game cartridges. Solutions exist like the Retrode. There are some big issues with them though that limits their viability as something an average consumer can just buy readily off the shelf:

1. Super expensive.
2. No longer in production/out of stock
3. Rights to the product changing hands between sellers/store owners
4. Because of 3, usually one or two stores can only sell them.
5. The specs are closed so only a select few can assemble and sell them, limiting the ability of DIY homebrewers to make their own device.

While as a general rule of thumb, developers will always tell people to dump their own game cartridges, in reality there is nobody stepping up to the plate to make this either affordable, to integrate it well with existing software, or to make it possible for your homebrew hardware maker to easily build his own.

RetroArch Open Hardware is our attempt to shake up this sector of the retro games market, and our effort to revitalize the DIY market and shift it away from proprietary solutions. Our first Proof of Concept hardware device is an N64 cartridge adapter that you connect to any device with a USB Type-C cable. It will be relatively cheap to assemble and much faster than any existing competing device out there that does the same task.

RetroArch Integration

We have some high-level goals we aim to achieve with this project. We want seamless integration with RetroArch. When you attach this to RetroArch, it should be hopefully as simple to play the game as it is on a real game console when you plugged in the cartridge. That’s the level of integration we are aiming to achieve with this project, and none of the existing solutions out there really fit the bill.

When we mentioned before that we want RetroArch to be its own game console, we pretty much meant it. And being able to take your own game copies with you and run them with RetroArch seems like an obvious next step to take.

We have come up with a completely custom and lean design so that the person aiming to build this for themselves in DIY fashion will be able to build these relatively cheaply. We are convinced the transfer speeds are far in excess of any other similar product out on the market right now, which is just as well considering the biggest N64 game out there is 64MB in size.

The current transfer speed that we are achieving is ~4MB per second on a prototype device. Our target is a transfer speed of approximately ~ 4.5MB per second give or take.

In addition, Switch dock support will be there from Day One, working out of the box.

How does it work?

Attach it to any device and it will mount itself as a Mass Volume Storage device, mapping the cartridge as a bunch of files on the filesystem.

You insert the N64 cartridge into the cartridge reader and you connect it to a PC (or some other device) with a USB Type C-cable. The device will then map the contents of the cartridge itself as a Mass Storage device volume. EEPROM, Flash, ROM, and SRAM are mapped as separate files on this volume. (*)

Playing the game should be as easy as just loading the ROM from this device. So already even without the aforementioned RetroArch integration, it already works. But our hope is that with the RetroArch integration, we finally get the promise of a true cross-platform game console where you can take your games library with you, whether it’s digital or physical, and just use it across the devices that you already have RetroArch on. This is the dream and promise we have been slowly building towards – the power lies in the user’s hands, not that of any corporation or organization.

* – This might be subject to change. We are still considering whether to change this to a dedicated protocol to allow using cartridge hardware in an emulator core without just reading all of the cart as one big contiguous ROM file.


This project has been ongoing now for the better part of a year. We have some internal prototypes and so far we can definitely confirm high success rates with our own cartridge collection. SRAM support already works in the firmware, but no EEPROM/FlashROM support yet. Your SRAM should work as long as your SRAM battery is not dead yet anyway. Some of these cartridges are over 20+ years old by now after all so an SRAM battery being dead is not an unlikely prospect at this point.

Some cartridges will need their cartridge connectors cleaned in order to work properly with this device. It’s a common problem among N64 game preservationists that I’m sure should not be news to anyone at this point.


I’m sure there will be many questions in response to this article. We will remain tight lipped for now until we feel the time is right to release more details. We hope that RetroArch Open Hardware will be a contagious project that will see many contributors and participants working towards one common goal – being able to interface with the games media they’ve bought for all these decades and just being able to make it work with the software they’re already using without having to buy new closed-spec proprietary devices that lock you out of the software you’re already using. Free software is one thing, but it’s only as good as the hardware you’re running it on. Consider this our valiant effort of trying to get both sides in order.

For now, here is a gallery of screenshots to a few of our prototypes, brought to you by Sasa and m4xw.