RetroArch 1.8.8 released!


RetroArch 1.8.8 has just been released.

Grab it here.

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

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

Highlights

Add option to sort playlists after name truncation (Ozone)

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

Localization – big updates and crowdsourced

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

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

Improved shader preset dirs

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

Input Remapping Fixes

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

1.8.8 fixes the issue.

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

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

RetroArch P2 – New SDK/toolchain – big improvements

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

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

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

fjtrujy also added Theodore to the list of cores supported.

Changelog

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

1.8.8

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

Libretro Cores Progress Report – May 27, 2020

Yesterday marked RetroArch’s 10 Year Anniversary date. Today, we’re not only releasing a new RetroArch version, but we’re letting you know all the changes that have been made to the libretro cores since the last progress report.

Our last core progress report was on April 2, 2020. Below we detail the most significant changes to all the Libretro cores we and/or upstream partners maintain. We are listing changes that have happened since then.

How to update your cores in RetroArch

There are two ways to update your cores:

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 the core from the list that you want to install.

Final Burn Neo

Description: Multi-system arcade emulator

  • Add Neo Geo Pocket Color support
  • Latest updates from upstream

Flycast

Description: Sega Dreamcast/NAOMI emulator

  • Naomi/AW widescreen integrated cheats (KNIGHTS OF VALOUR THE 7 SPIRITS, Metal Slug 6, Toy Fighter, Dolphin Blue)
  • DSP: Proper MIXS input shift. Fixes Grandia 2 missing sound effects
  • DSP: fix output shift. Fix wrungp ear rape (NAOMI game)
  • Fix for: [Bug]Super Street Fighter II X for Matching Service (Japan) – Disable BIOS region patching
  • Fix for: Samurai Spirits – Frame-skipping issues before reset or changing the option – don’t reset frameskip to 0 at init
  • Haiku: Fix build
  • Rewrite nvidia jetson nano build
  • Make threaded rendering the default on all platforms. Synchronous mode enabled unless LOW_END is defined
  • Info and warning for xBRZ upscaling core option
  • ARM64: check CpuRunning at end of each timeslice. fix hang when exiting service menu in kofnw (NAOMI game)
  • NAOMI: wrungp inputs. support inverted axis for NAOMI
  • Libretro: Improve context request
  • Libretro: fix input descriptor L2/R2 mixup
  • NAOMI: Add Tokyo Bus Guide support
  • Log VMU files loading
  • CUSTOM TEXTURES: support JPEG format. Get rid of libpng and use stb_image log error if naomi eeprom save fails
  • Fix mouse state not being updated
  • PVR/NAOMI: update palette when PAL_RAM_CTRL is updated – fixes wrong palette in Gun Survivor 2 score screen
  • REND: Use original palette data to compute palette hash
  • PVR: textured background plane – fixes Who Wants To Be a Millionaire

DOSbox Core

Description: DOSbox core

  • Latest updates from upstream
  • Add option for using 2axis joystick even when only one port is connected – this fixes input problems in “Super Off Road”, but other games might also need this.
  • Add option for controlling log verbosity level – Since we can log to stdout now, it makes sense. Also, some frontends might not have configurable log verbosity levels.
  • Add option for printing log output to stdout/stderr –
    Useful if the frontend’s logging output is unreliable or too noisy (or
    both) and we only want to see log output from the core. RetroArch does
    have a configuration option for controlling frontend and core log output
    seperately, but it’s bugged.
  • Enable Voodoo on all platforms and regardless of fakesdl – Software-based Voodoo emulation doesn’t require SDL anymore so it should build fine everywhere.
  • Don’t claim there’s Voodoo2 emulation – Oops. 12MB doesn’t actually mean Voodoo2. The current code only emulates the original Voodoo. The 12MB setting is just a non-standard memory configuration for the Voodoo 1.
  • Add support for changing current core option values programmatically.
    This is a hack. The libretro API does not actually support this. We
    achieve this by replacing all current values with a bogus one to force
    the frontend to forget the currently selected value, since it doesn’t
    match the bogus one. We then submit the correct values again, but with
    the default value set to the value we want to switch to. This forces
    the frontend to switch to that value because the bogus value is now
    gone and thus not a valid value anymore. Finally, we submit the values
    again but with the initial default value (we only want to change the
    current value, not set a new default.) The frontend will not switch the
    current value, as the values themselves have not changed, just the
    default has.

    RetroArch seems to be well-behaved here and does the correct thing.
    Other frontends might not play ball though.

  • Hook up 3dfx core options
  • Vita: Fix dynarec, fix build
  • Add build options to make bassmidi and fluidsynth optional
  • Fix ARM dynarec
  • Correct cdrom sector size field length according to docs.
  • Refactor input mapper –
    Code should be simpler to understand now. This also fixes a bug where
    inputs on the second port weren’t working before. Mouse emulation is now
    possible on both ports and the default emulated mouse buttons have been
    swapped with the speed modifier buttons (L/R are now mouse buttons,
    L2/R2 the speed modifiers.) This is a saner default since not all
    controllers have L2/R2 buttons.
  • GHA: Support macOS 10.13 by building with GCC instead of XCode Clang
  • Fix floppy image file size detection oopsie
  • Improve disk control related code and move it to its own source file
  • Make image file extension comparisons case-insensitive –
    This fixes the issue where loading an image that has an upper-case
    extension (like “.CUE” instead of “.cue”) results in dosbox mounting the
    image itself without going through the libretro disk control interface.

    We add new case conversion funtions for this (in the new util.h/util.cpp
    files) because the existing conversion functions provided either by
    dosbox or libretro-common are crap and we’re smarter than everybody
    else.

  • Add libretro disk control interface disk labels support –
    Only retro_get_image_label_t for now. Leave retro_set_initial_image_t
    and retro_get_image_path_t undefined as it’s not clear what the use
    would be in case of DOS games, especially since we don’t handle m3u
    files yet.
  • Fix disk_replace_image_index always reporting failure –
    This silly mistake caused the “Failed to append disc” error message in
    RetroArch.
  • Add core option for setting the free space when auto-mounting drive C
  • Ensure overlay mount path ends with a dir separator –
    Otherwise dosbox will write data in bogus directories in the overlay.
  • Add option for mounting the executable’s parent dir as drive C –
    Some pre-installed games expect to be installed in C:\GAMEDIR rather
    than directly in C:\. This option allows these games to run without
    having to modify their configuration files first.
  • Enable PC speaker by default
  • Fix direct content loading of DOS executables
  • Fix BASSMIDI crashing during startup on 32-bit Windows
  • Add BASS/BASSMIDI libs to core info file
  • Add BASSMIDI MIDI driver –
    The bass and bassmidi libraries are looked for in the frontend’s system
    directory and loaded at runtime. This allows the core to work and be
    distributed in a GPL-compliant way without those libraries.

DOSbox SVN

Description: DOSbox

  • Add SALC and XLAT to the dyn_x86 core. Improve LOCK handling a bit.
  • change new to new(std::nothrow) (vogons 73603) and some formatting
  • QNX: Adjust flags to msync based on libretro-common –
    I didn’t notice any bug before but this stuff is very difficult to trigger
  • QNX: Add support
  • Allow unaligned memory only on x86
  • Determine CPU based on actual running platform rather than build one –
    This allows to closs-compile on x86 linux into arm linux

    Endianness is determined in retro_endianness.h and dynarec is determined
    in dynarec.h

  • Correct cdrom sector size field length according to docs
  • memory: Add missing std::nothrow –
    Given subsequent check for NUL it was obviously intended for use with
    std::nothrow
  • Catch exceptions in dosbox –
    Right now an exceptions ends up killing cothread which is against libco
    recommendations and is more difficult to debug. Instead log and exit normally
  • Fix button mappings and wrong port assignment when using both ports –
    This maps B/A/Y/X to DOS buttons 1/2/3/4 by default. Also corrects the
    issue of input not working correctly when using two controllers.
  • Fix Windows x64 hang/crash by updating libretro-common
  • Don’t submit mouse emulation descriptors when no ports are connected
  • Fix new gamepad emulated mouse defaults being swapped
  • Map mouse buttons to L/R, modifiers to L2/R2, not vice-versa –
    Many gamepads don’t have L2/R2, which were needed to press mouse
    buttons with the gamepad using the default mapping. This change
    maps mouse buttons to L/R by default. The modifiers to speed up
    or slow down mouse motion are moved from L/R to L2/R2, since they
    are less essential. All of this can be remapped via quick menu
    using the input mapper.
  • Fix gamepad emulated mouse inputs not showing in mapper sometimes
  • Vita: Fix dynarec
  • Vita: Build fix
  • Switch to libco provided by libretro-common –
    libco embedded here crashes on vita. So let’s use the common one
  • Use RETRO_CALLCONV for disk control callbacks –
    It’s surprising that there were no crashes so far on x86 32-bit…
  • Fix disk_replace_image_index always reporting failure –
    This silly mistake caused the “Failed to append disc” error message in
    RetroArch.
  • Correct an oversight of r4186 when floppy disks are mounted.

Beetle PSX

Description: Sony PlayStation1 emulator

  • Load bios from path that was checked
  • sanitize gl context requests
  • Add more detailed error messages for mmap, unlink sooner
  • Allow Solaris 11 build
  • Cleanup warnings: snprintf truncation, strncpy->memcpy, memset
  • Lightrec: Cleanup/deduplicate mmap code
  • Lightrec: Improve homebrew support
  • Fix inverted check for dma-only invalidation
  • Fix OS X compile
  • Lightrec: fix more games –
    These games now work:
    – Need For Speed: V-Rally
    – Alone In The Dark – One-Eyed Jack’s Revenge
  • Lightrec: Fix SWL/LWL using wrong mask
  • When HAVE_SHM always use global memfd so it can be closed properly on exit –
    LGTM found this once the default was to compile in lightrec
  • Keep track of mmap failing –
    If mmap failed it should prevent crashing when closing and disables
    lightrec memory mirrors so as to not use an incorrect code path
  • Update to latest lightrec and extract PGXP from lightrec –
    PGXP functions are now called from within beetle
  • Compile in Lightrec support by default –
    Specify HAVE_LIGHTREC=0 if you don’t want it compiled
  • Improve DualShock calibration reference
  • Fix disk control interface when running single-disk PBP content

Mupen64Plus Next

Description: Nintendo 64 emulator

  • Only set WITH_DYNAREC based on ARCH if not set
  • Update GLiden64
  • Add support for loading GL symbols using dlsym() instead of libretro API –
    * Required for platforms with EGL version < 1.5 * To enable, use new compile-time define: `-DGL_USE_DLSYM` Currently only enabled for Raspberry Pi platforms that use the legacy Broadcom driver.
  • Add nasm variable
  • Assign variable and reference nasm
  • Bump Version to 2.0.5
  • Update Mupen64Plus INI
  • Add fbInfoDisabled to Ini parsing
  • Update GLideN64 INI

Yabause

Description: Sega Saturn emulator

  • Enable Solaris build

Kronos

Description: Sega Saturn emulator

NOTE: This core requires you to use the ‘glcore’ video driver right now. There is no software renderer and it won’t work properly yet with the regular ‘gl’ driver.

  • Activate openGL program precompilation
  • Precompile some shaders directly at boot time to have a smoother BIOS animation
  • Emit a callback at each frame for synchronizing need on ports
  • Swap the buffers at each frame
  • (libretro) framerate pacing + CDROM support + m3u extension
  • Implement a database & rework cart auto-detect
  • Add support for BIOS language
  • Fix Assault Leynos 2 black screen
  • Fix mesh improved image unit usage
  • Fix blinking in Sega Rally, CS Mode
  • Add support to remove banding when using gouraud shading
  • Modify the handling of improved mesh handling to prepare improved banding support
  • fix pause in Daytona USA
  • fix Sega Rally USA boot – might introduce other improvements or regressions
  • Prepare the SH2 threading
  • ST-V I/O is reading words
  • (libretro) fix resolution mode change
  • Rebase the openGL on Yabause since compute CS has a better rendering and openGL rework created new issues
  • (libretro) improve rendering loop
  • Better horizontal upscaling
  • Depending of vertical flip, sprite reading is not the same – Improving Sega Rally
  • (libretro) use cpu_tesselation as default for polygon mode
  • Use CPU tesselation by default
  • (libretro) make the frame rendering more libretro-friendly
  • Reintroduce some required variable for color calculation – fix Cotton Club
  • Software renderer supports 4 threads at maximum
  • Consider that only old card compatible only with OpenGL 3.3 are limited in variables and need to reduce VDP2 blitting program
  • Reintroduce software renderer
  • Reduce the VDP2 register texture width
  • Do not initialise unsupported openGL functions. Fixing some openGL Core 3.3 errors
  • For openGL do not call to much the rendering loop – Better to maximize cache texture impact
  • Add ignition line to VDP1 commands
  • Do not flush the cache texture at each HBlank – only flush when needed
  • In case of draw every 2 frames, do not consider CMD that has already been displayed
  • We have to update the texture before the evaluated startupline, not at the end of the first line… Fixing Skeleton tearing
  • allow STV rom loading to be CRC based
  • Trigger the VDP1 rendering as soon as we consider the draw command list has executed
  • Take care of effective starting line of VDP1 command to evaluate if the core has to regenerate the textures
  • Remove NVidia related pragma – Might impact other GC
  • Calculate VDP1 cycles requested by draw commands
  • Fix some STV loading –
    Fix batmanfr, thuntk & thunt boot without breaking dnmtdeka gfx (and maybe other’s ?)
    Also got sanjeon to boot.
  • Load the BIOS file of the right entry – Fixing Die Hard boot
  • Setup EEPROM directory at the same location than STV ROM
  • Fix “heap-use-after-free” on exit –
    YglGenReset can’t be called after _Ygl is freed
  • fix some STV loading issues –
    suikoenb, thunt, thuntk, batmanfr & znpwfvt now boot, however only thuntk seems playable at the moment
  • Support EEPROM save & load for STV
  • Update the rotation window before the rotated layer are using the values
  • Preliminary support for STV’s Kick Harness
  • Fix horizontal RBG offset in Final Fight Revenge
  • Allow openGL 3.3 since openGL without tesselation should work on most of the games
  • Fix the RBG vertical misalignment when upscale is on – Still horizontal tearing
  • Some minor fixes for RBG CS
  • Fix VDP1 mapping on highest upscale ratio
  • Fixing coin setup on ST-V
  • Backup RAM can be accessed in word and Long – STV is doing this
  • Better handling of the upscale
  • PTRM = 0x3 corresponds to PTMR 0x2 – Fixing Skeleton Warriors startup
  • Fix the special color condition in case sprite is cc enabled, not active as first screen, but activable as second
  • For color mode other than 2, read coefficient table on the upper part of the color RAM
  • Do not handle prohibited setting on PTMR – Fix Skeleton
  • Writing lower part of Color RAM in mode 0 is overwriting upper part
  • When VDPRAM mode is 0, color from RBG is read on the upper part since lower part is for color offset
  • If the code is checking EDSR, just wait for VDP1 processing to finish – avoid changing VDP1 texture while it is changing
  • Do not try agressive optimization yet – Fixing Disc menu performance
  • Fix Quad upscale in Compute shader
  • Fix the regeneration of the VDP1 surfaces – Fix Guardian Heroes
  • Add a compilation flag to enable/disable VDP1RAM update – enabled by default
  • LDCSR is changing the SR mask, so interrupt shall be handled as soon as it is changed – Fixing Princess Maker 2 boot
  • Fix the deinit of YGLTM
  • Fix libretro fullscreen switch – Implement a destroy of all openGL objects when openGL context is reset
  • (libretro) fix upscaling weirdness
  • (libretro) try at fixing scaling weirdness
  • On Libretro, do not execute the last resizing. It is required that the libretro framebuffer always provide a FB of size _Ygl->widthx_Ygl->height
  • (libretro) updates
  • Issue on IST cleaning. Princess Maker 2 is now crashing on master SH2 issue. Might be due to SH2 interrupt handling – Fixing Skeleton boot
  • SH2 interrupt mechanism is not accurate – Do not try to make it precise – Fix Capcom Generations 5
  • Compute the VDP1 buffer in threads
  • Double the VDP1 structure to avoid stall between frames
  • Big rework of SCU Interrupt handling – Fix Princess Maker 2 boot while fixing Nanatsue Kaze after the start screen – might introduce regressions
  • Reenable the support of asynchronous preparation of RBG layers
  • Do not enable RBG async preparation
  • Fix BIOS HLE interrupt usage
  • Fix sysclip size for rotation
  • Check if we need to send a SSH2 interrupt each time we are sending a MSH2 interrupt from SCU
  • Purge all the SCU interrupt and do not stack them
  • Changing SCU HIRQMASK can generate an interrupt
  • NMI interrupt has a specific handling and does not exit using a standard RTE command
  • Handle in priotity interrupts on SH2 core
  • Rework a bit the SCU interrupt handling
  • Reintroduce interrupt removal – Fix Princess Maker 2 – might impact Sakura Wars
  • Fix Sakura Taisen video
  • Fix line color offset on RBG compute
  • Fix Highway 2000
  • In case of rotated FB, increase the system clipping by twice the offset – It looks like a workaround – It is fixing Hang On ’95 blue line on the right
  • Better to use VDP2Ram access function
  • Fix VDP1 rotation for Hang on and Power drift. It looks like a scale might be still needed for Capcom Generations 4

PCSX ReARMed

Description: Sony PlayStation1 emulator

  • Android: Support for new lightrec API
  • Update lightrec to latest upstream
  • Minimize logs when loading a cheevos-compatible content
  • Cleanup retro_run() –
    – move input query into separate functions
    – move internal fps display to separate function
  • Hide other inputs from core options –
    – This adds a core option to hide some input options like multitaps, player ports 3-8 and analog-related fine-tuning options.
    – also combine dynarec-only options in one #define directive
  • More core option fixes –
    – This PR fixes core options and moves them to the related dynarec modes where they are implemented.

    LIGHTREC = relates to platforms that supports the new Lightrec mode
    NEW_DYNAREC = relates to previous dynarec implementation that is still used for some 32bit devices

    – Dynarec Recompiler core option, both dynarec implementation can be enabled or disabled

  • Move guncon options to update_variables –
    – This should stop unnecessary RETRO_ENVIRONMENT_GET_VARIABLE callback and log spamming
  • Fix some edge case where core can freeze upon loading content
  • Automatically disable Lightrec when no BIOS is present, take 2
  • cdriso: fix a disk switching deadlock when closing a CD image
  • ARM NEON: Fixed bug where MSB of a 15-bit BGR color could corrupt green value.
  • cdriso: fix a disk switching deadlock
  • unai: Add ARM-optimized lighting / blending functions

Addendum on UNAI ARM-optimized lighting/blending improvements –

“Looking at the generated ASM on 3DS, I thought I could squeeze out some extra performance by moving the inner lighting and blending functions to handwritten A32 assembly. This gives a medium improvement generally (3-5fps faster on the beach in Crash 1) and a large improvement when doing lots of blending (46-48fps before, 57-60fps after, behind the waterfall in Water Dragon Isle in Chrono Cross).

Some other notes:

  • I used the ARM11 MPCore (3DS CPU) timings for pipelining.
  • I had a few stall cycles during lighting, so I used them to preserve the MSB for lighting and blending, which saved a store, load, and orr later on. ~3-6 cycles saved overall by doing that.
  • I switched from u16 to uint_fast16_t, which is 32-bit on this platform. This saved a few useless uxth instructions for another few cycles. This shouldn’t affect other platforms, but I don’t know for sure. Could typedef if necessary.
  • A lot of the speed improvement in blending comes from not using two instructions per and. For example, & 0x8000 — the compiler preferred to mask out bytes using bic 0x7F00 and bic 0x00FF. Both slower and seemed less correct for what we’re trying to do.”

LRMAME 2003

Description: 0.72 version of LRMAME

  • Fix cheat input dip switch option

LRMAME 2003 Plus

Description: 0.72 version of LRMAME with updates/enhancements

See CHANGELOG for all updates/enhancements on top of LRMAME 2003

  • New working game Gulun.Pa! CPS1 prototype
  • sample pause support for journey –
    uses pause instead of the mute hack implemented.
  • TANK III Joystick bootleg
  • Update samples.c
  • fix big samples dynamic loading when not an OST item
  • Update mcr2.c –
    Sepways.wav sample support for journey
  • Update inptport.c
  • Update foodf.c –
    Allows the player to face in the direction last applied.
  • A fix for Midway MCR3 game saving

LRMAME 2010

Description: 0.139 version of LRMAME

  • Fix Selecting “Inputs (this game)” crashes Retroarch on Android (should also affect other ARM builds)
  • backport 12-bit wrapping fix

    Fix 12-bit wrapping behavior in YM2608/2610 ADPCM_A decoding, fixes some glitches in certain samples in the metal slug series, and likely other games. [Lord Nightmare, madbr]

Dolphin

Description: Gamecube/Wii emulator

  • Fix build for Windows x64
  • Request glcore context when video driver is gl

ParaLLEl N64

Description: Nintendo 64 emulator

  • Sanitize GL context requests
  • Update ParaLLEl RDP – about a ~10fps speed increase on Nvidia over previous version
  • Should fix Mega Man 64 graphics glitch (electric fence not visible)
  • Add ParaLLEl RDP
  • Add SI DMA Duration hack for Tetris 64
  • Use separate cache for DRAM and hidden DRAM.
  • Add DRAM flush and fix VI_REGISTER_OUTPUT.
  • Dump the hidden RDRAM as well.
  • Fix Seg Fault on Game Unload –
    When commit 11c1ae3 split r4300_execute into r4300_execute and r4300_init, it continued to check the “stop” variable, but this is undefined. Removing these checks resolves the seg fault and does not affect functionality.

O2EM

Description: Magnavox Odyssey 2 emulator

  • Fix YES/NO keys and set 0 as default key
  • Change Action button to B to be more consistent with other cores, and remove the shortcuts to 1/2/3/4 keys (useless with the new virtual keyboard)
  • Add option for virtual keyboard transparency
  • Add graphical virtual keyboard

Opera

Description: 3DO emulator

  • Fix Haiku build
  • Remove NVRAM file and try rename again on initial failure –
    Windows doesn’t like renaming over files? This logic accomidates for both
    without needing platform specific behavior.

VirtualJaguar

Description: Atari Jaguar emulator

  • Add Haiku build

XRick

Description: Game engine implementation for Rick Dangerous

  • Add Haiku build

vitaQuake 2

Description: Quake 2 game engine core

  • Add GLES Support and initial Rockchip platform
  • Fix intermission screen being unskippable.
  • Put on par with Vita build (Bump to v.2.3).
  • WiiU: Add build
  • PSL1GHT: Add build

vitaQuake 3

Description: Game engine implementation for Quake 3: Arena

  • Add Haiku build

mGBA

Description: Game Boy Advance emulator

  • Libretro: Add cheevos support for GB/GBC
  • PS2: Update to newest toolchain

QuickNES

Description: 8bit Nintendo Entertainment System/Famicom emulator

  • PS2: Update to newest toolchain
  • Fix potential free(NULL); problems

FCEUmm

Description: 8bit Nintendo Entertainment System/Famicom emulator

  • PS2: Update to newest toolchain
  • user-adjustable Zapper tolerance
  • reduce max Zapper tolerance to 20
  • MMC1 overrides are treated as ines 2.0, so its needs at least default values for prgRam and chrRam columns.

    Fixes FF1 pink screen due to unmapped CHRRAM.

  • Use proper geometry when switching NTSC filter on or off –
    – Width changes previously was not respected when using NTSC filter. With full use of overscan, NES width
    is 602 px when NTSC filter is used and 256 px on normal
  • Fix build when compiling without NTSC filter support
  • fixed 3DS build
  • Adjust Zapper tolerance; make Zapper input tolerance circular rather than rectangular by default
  • Fix timing when changing from PAL/Dendy to NTSC –
    – Happens when starting with PAL/Dendy region and changing to NTSC can cause frame to get stuck in 50 Hz
    – using RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO should remedy this.
  • NTSC: Remove height doubling/scanline effect –
    – We just use shaders for scanline if needed. NTSC + height doubling causes performance hit
    for some slow devices. Any decent platform should be able to handle scanline effect shaders at least.
  • ines.c: Simplify rom info logs and cleanup
  • Fk23c: Fix chr issues for some games –
    – Affects mostly waixing using mixed chr rom/ram modes (bit 2 of ram config register $A001)
  • Update ines-correct.h –
    – Add overrides for FK23C
    – Move MMC1 overrides
    – Move MMC5 overrides
  • Move overrides out of some mappers –
    Move mapper-based overrides out and use ines-correct.h if possible. Affects the following mappers below:
    – Move Cnrom database to ines-correct.h
    – Mapper 201 update
    – Mapper 91: Add Street Fighter III (Submapper 1) to ines-correct.h
    – Add dipswitch notes to m237
    – Update mapper9 (PC10 version of Mike Tyson’s Punch-out)
  • Move battery-backed prg ram override to ines-correct.h
  • Start expanding internal override database (ines-correct.h)

2048

Description: 2048 game implementation

  • PS2: Update to newest toolchain
  • PS2: Apply color correction
  • DOS: Add platform support

Picodrive

Description: Sega Megadrive/Genesis/32X/CD emulator

  • PS2: Update to newest toolchain

Snes9x 2010

Description: 16bit Super Nintendo/Famicom emulator

  • libretro: added granularity in SuperFX overclock –
    There doesn’t seem to be any benefit of overclocking above 15 MHz
    (150%). The user should be allowed to be more precise with their
    overclock setting now.
  • Fix MMC reg for 64bit builds –
    Fixes a segmentation fault when playing large ROM games.
  • Fix MMC bank register bit 7 (FuSoYa) –
    Fixes the 64Mbit ExLoRom map.
  • ROM: fail if ROM is invalid –
    Fixes an issue whereby a non-SNES file would cause a segmentation fault.
    This may occur if the selected ROM is corrupt, or a file has an
    incorrect extension.
  • APU: remove unused SoundSync –
    Additionally modified the resampler to use buffer size as a parameter
    instead of the number of samples within the buffer. Previously, the
    buffer size was being changed to the number of samples, and then changed
    back within the resampler.
  • snes9x: add defines for unused multi-cart support –
    The compiler was already optimising these unused functions out. The
    libretro core can define SNES_SUPPORT_MULTI_CART 1 to re-enable support
    for multi-cart in the future.
  • snes9x: refactor defines and remove overscan –
    Out of bounds memory fix from
  • snes9x: APU: Fix buffer overrun –
    Additionally:
    This fixes linking with LTO.
    Disable audio if an error occurs in init instead of continuing and
    segfaulting.
  • snes9x: reduce APU buffer to 64ms –
    I believe this to be a more sane setting than a 1000ms buffer.
  • snes9x: backport config from upstream –
    Most options were not available in English, despite it being the default
    language. All the options that were available in Turkish are now
    available in English.
  • snes9x: fix headercount increment
  • libretro: fix pitch measurement

Prboom

Description: Game engine core for Doom 1/2, Ultimate Doom, Final Doom

  • Switch from ad-hoc endianness handling to retro_endianness.h

Vecx

Description: Vectrex emulator

  • Fixed colour conversion (7 bit mono to RGB1555).
  • support analog controllers
  • Make line drawing code more efficient by doing RGB conversion once per line only
  • Nicer point shape
  • Allow scaling of vector display
  • more flexibility in adjusting display – allow for scaling and shifting to fit overlays

NeoCD

Description: SNK Neo Geo CD emulator

  • CD-ROM controller logic split into a separate file
  • Y Zooming don’t need a ROM file anymore
  • New system to identify and patch BIOS, should allow unknown BIOS to run.
  • BIOS files don’t need to have a specific name anymore they are identified by contents
  • Support for Universe BIOS 3.3
  • BIOS name in the menu now includes filename
  • Add synchronous CD operation mode
  • Vita: Use synchronous CD operation mode
  • Vita: Add build
  • 3DS: Add build
  • WiiU: Add build
  • PSL1GHT: Add build
  • Emscripten: Add build
  • Implemented horizontal interrupt masking (not verified on real hardware)
  • Fix CDROM music endianness
  • Fix big-endian support

PocketCDG

Description: MP3 Karaoke audio player

  • Properly send logging to proper place –
    use logging interface as much as possible with stderr as fallback
    rather than being inconsistent
  • Swap frame before passing it to audio_batch_cb on bigendian –
    audio_batch_cb expects native-endian frames and libmad gives little-endian
    frames. Hence on big-endian we need to swap
  • libmad: Fix big-endian support

FreeChaF

Description: Fairchild Channel F emulator

  • Switch from ad-hoc endianness to retro_endianness.h
  • separated CHANNELF HLE code

ECWolf

Description: Wolfenstein 3D game engine core

  • Latest updates from upstream
  • iOS/TVOS: Add build
  • WiiU: Add build

UAE4Arm

Description: Commodore Amiga emulator

  • Libretro improvements
  • Two joystick support with automatic switching
  • Define controls close to PUAE default. Use right analog stick as mouse and L2-R2 as mouse button.
  • Add working virtual keyboard support
  • Emulation resolution handing is better (especially change). 2nd mouse button working.
  • Solve right mouse button non working
  • Solve different video resolution
  • Solve audio glitches

P-UAE

Description: Commodore Amiga emulator

  • Disable waiting blits by default
  • Remapping fixes + clarifications
  • Zoom mode horizontal croppings + cleanups
  • Prefixes for hidden core options
  • Better sorting in M3U generation
  • Geometry fixes, Keymap update, Cleanups
  • WHDLoad fixes –
    – Custom parameter not working on many cases
    – Error messages and copy skips if Kickstart filesizes are not correct
  • Model preset overrides, Optional region search
  • Core option for D-Pad joystick/mouse switching
  • Model config overhaul
  • NTSC fixes
  • Optional region forcing with No-Intro tag support
  • WHDLoad update
  • Sort generated M3Us, Statusbar + glue updates
  • Fix android build
  • New defaults for CPU and Drive Sound Emulation, Sound cleanups
  • User-friendly warning messages for Kickstarts and CAPSImg
  • Attempt to fix crash when reloading core on static builds
  • Fix ZIP Browse Archive
  • M3U ZIP fix
  • Hor+Ver positioning fixes
  • Add “Remove Interlace Artifacts” core option
  • Backport interlaced double line field mode to replace old frame mode
  • Fix sound filter from effectively being always Automatic at startup
  • Fix filter type update, Improve zoom
  • Add core option for CD startup delayed insert, Remove previous disc change detect trickery
  • Change model force hierarchy, Option label updates
  • Android unzippings yet again
  • Core option for muting floppy sound when drive is empty
  • Automatic horizontal centering improvement
  • ANDROID X86: Fix build
  • Fix amd64 compilation –
    m68kops for amd64 is empty, use generic exactly how it was before the rewrite
  • Rewrite libretro m68k.h and m68kops.h to use non-libretro variants –
    They encapsulate per-cpu optimizations. There is no reason to
    have a version for libretro
  • Rewrite maccess.h using new retro_endianness
  • Automatic zoom improvements
  • Control improvements:
    – Enabled D-Pad as mouse in analog joystick mode to help out menu traversing, otherwise D-Pad does nothing unless toggled to mouse mode
    – Added core option for inserting RetroPads to joystick ports in different order (for Arcadia, Dyna Blaster etc.)
  • Fix vertical touch alignment on keyboard while zoomed
  • Global conf file, MultiDrive via Disk Insert
  • CDTV core option
  • Statusbar finetuning
  • Disk Control additions:
    – Transparent ZIP support in M3U parsing
    – Insert Disk support for M3U/ZIP/etc

VICE

Description: Commodore 64 home computer emulator

  • Keymap core option + rework
  • Autoloadwarp enhancement, Core option label tweaking
  • Remapping fixes + clarifications
  • Fix Plus4 cartridge launching, Statusbar fixes
  • Autoloadwarp fix for D81s, Statusbar cleanups
  • Freeze cartridge to reset types
  • More robust floppy autoloadwarping
  • VIC-20 updates:
    – RAM block set tidying
    – Fixed starting carts in M3Us
  • Achievements environment
  • Core option for 2nd SID, Warp mode rework
  • Automatic Load Warp core option
  • NBZ support
  • Dump available and not yet core optionized resources for easier ‘vicerc’ usage
  • Disk Control finetuning –
    – Fallback to drive 8
    – Remove “.” from image type detection extensions to also match cases like “.hidden-d64”
  • Fixed and enabled printer
  • Better sorting in M3U generation
  • Disk Control updates –
    – Allow CRTs & PRGs in M3Us
    – Removed redundant short pathname label fallback in widget
  • Automatic region fixes
  • Zoom mode honing –
    – Changed manual mode operation from automatic to optional
    – Corrected non-wide calculations
    – Added VIC-II/VIC/TED border info to sublabels
  • Core option reorganizing –
    – Separated VICE option variables from core option variables
    – Prevented updating VICE variables to the same variable
    – Simplified palette options
    – Fixed CBM2 embedded palettes & added missing PLUS4 embedded files
    – Removed & disabled non-working CBM2 models (510 not selectable in standalone, therefore no point fixing embedded files)
    – Fixed Super VIC memory expansion
    – Fixed CBM2 crash on higher resolution models
  • Work disk improvements –
    – No need to reset
    – Fixed start content
  • Automatic model core options for x64 & x64sc –
    – Scans for “NTSC|(USA)” and “PAL|(Europe)” tags
    – Both PAL/NTSC and C64/C64C can be preferred
    – Default is “C64 PAL Automatic”
  • Sync finetunings –
    – GetTicks returns a ticker from get_time_usec instead of fake microSecCounter
    – Bypassed internal frameskips and delays
    – Warp mode speed improved
    – Statusbar updates FPS in 1 second intervals instead of 2 & shows real FPS from both warp and fastforward
  • Work disk core option with device selection
  • Fix for autostart detection of D71
  • Work disk core option with device selection
  • Fix QNX build
  • Zoom improvements –
    – Presets for usual suspects (16:9, 16:10, 4:3, 5:4)
    – Hardcode exceptions minimized, math maximized with science
  • Fix Emscripten build
  • Switch from adhoc endianness handling to retro_endianness.h
  • Sort generated M3Us
  • Better retro_get_region, Embedded additions
  • Include NIBTOOLS for automatic NIB->G64 conversion
  • Manual cropping core options
  • Remove border stuff
  • Zoom overhaul, Reorganizing, Cleanups
  • JiffyDOS & GO64 for C128
  • Direct hotkey for joyport switching, TDE + DSE enabled by default
  • Disable JiffyDOS with tapes also on static platforms
  • Rename mouse_x to retro_mouse_x in retrostubs.c to avoid confusion with mousedrv.c
  • Fix compilation on Vita
  • PET fixes (embedded data, keyboard layout) + Cleanups
  • Extended ZIP+M3U Disk Control
  • Fix model change not triggering geometry change with borders disabled
  • PSL1GHT: Add build

Frodo

Description: Commodore 64 emulator

  • Disable compilation of CmdPipe.cpp on libretro
  • Add safeguard in case of thead allocation failure
  • Resync libco
  • Add logging
  • 3DS: Add build
  • PSP: Add build
  • Vita: Add build
  • QNX: Add build
  • QNX: Fix cmdpipe
  • Exclude cmdpipe on PSP1 and Vita
  • Don’t use sigaction on PSP1 and Vita
  • Don’t use chdir and getcwd on PSP1 and Vita
  • Change pulsehandler not to use signals on libretro

Quasi88

  • Fix declaration of INLINE on Android
  • Support for big-endian Linux
  • Switch from ad-hoc endianness to retro_endianness

Nestopia

Description: 8bit Nintendo Famicom/NES emulator

  • Fix scratchy audio in Super Mario Bros. 3 and others

Uzem

  • 3DS: Render at half-width
  • PSP: Render at half-width
  • Android: Fix build
  • Gamecube: Add build
  • PSL1GHT: Add build
  • WiiU: Add build
  • Big-endian support
  • avr8: Fix initial memory cleaning –
    Current code zeores-out only part of intended array
  • Disable av8::idle on libretro –
    It’s not used by libretro
  • Disable recording code on libretro –
    It’s not used by retroarch but it links with popen that is not
    available on many of retroarch platforms
  • Support compilation with g++ 4.6

GME

Description: Game Music Emulator core

  • Gamecube: Add build
  • Wii: Add build
  • WiiU: Add build
  • PSP1: Add build
  • Vita: Add build
  • Use retro_endianness.h instead of ad-hoc endianness defines

Cap32 / Caprice

Description:

  • Fix video glitch on big-endian
  • Replace ad-hoc MSB_FIRST with retro_endianness.h
  • QNX: Fix build
  • PSL1GHT: Add build

CrocoDS

Description:

  • PSL1GHT: Add build
  • WiiU: Add build
  • Wii: Add build
  • Gamecube: Add build
  • Filter-out identical calls to SET_GEOMETRY
  • Fix disk-reading routines on big-endian –
    Current approach of swapping after reading/before writing is sound
    in theory but in current codebase it’s difficult to track and leads easily
    to double-swaps. Just swap the values right before use and at assignment
  • Optimize byteswap
  • Fix big-endian video rendering
  • Disk endianness fix
  • Fix arguments to ReadPort/WritePort –
    Passing 32-bit value instead of 16-bit has undefined results. It works
    on some platforms and fails on other. Fix it properly
  • Support big-endian systems
  • Use retro_endianness instead of SDL_BYTEORDER
  • PSP: Add build
  • Vita: Add build

blueMSX

Description: Home computer MSX emulator

  • Remove leftover endiannness defines
  • Fix arguments for coinDeviceCreate –
    Argument mismatch is fatal on emscripten
  • PSL1GHT: Add build
  • Fix non-smooth scrolling in PAL 50Hz

meowPC98

Description:

  • Move from adhoc endianness to retro_endianness
  • PSP and Vita fixes
  • QNX: Add build
  • PSL1GHT: Add build

NP2Kai

Description:

  • Latest updates from upstream

Bk Emulator

Description: BK-0010/0011/Terak 8510a emulator

  • Wii: Add build
  • Gamecube: Add build
  • Use unsigned int instead of uint –
    For mingw compatibility
  • PSL1GHT: Add build

FUSE

Description:

  • Emscripten fixes

Lutro

Description:

  • Vita: Fix build
  • QNX: Add build

PX68k

Description: Sharp X68000 Emulator

  • Vita: Add build
  • QNX: Add build

Craft

Description:

  • Emscripten: Fix build
  • Fix path to auth database.
    Current path ends up in current working dir which might be anywhere,
    unwritable or not even exist as a concept.
  • Don’t attempt to run main loop after failure.
    It only clouds what errors have occurred
  • Android: Now goes ingame and no longer crashes at startup, doesn’t render blocks yet though

Mr. Boom

Description:

  • QNX: Add build
  • Emscripten: Fix build
  • support big-endian linux
  • PSL1GHT: Add build

Xmil

Description: X Millennium Sharp X1 emulator

  • Android: Fix compilation
  • Wii: Add build
  • Gamecube: Add build
  • Add big-endian support
  • PSL1GHT: Add build
  • Add iOS arm64 build support
  • PSP1 scaling messes when source is larger than psp horizontal resolution,
    hence render at quarter resolution
  • PSP: Add build
  • Fix QVGA support: Code for rendering at quarter of resolution is broken for libretro files
    altogether as it was never really implemented.

    Highres QVGA rendering forgot horizontal offset resulting in single-color lines,
    fix it as well

  • Vita: Add build
  • QNX: Add build

Atari800

Description: Atari 800 emulator

  • Support big-endian linux
  • PSP: Fixes
  • config: don’t use unaligned access on RISC –
    configure.ac enables it only on x86 and m68k. Mirror it in our manual config
  • Use frame counter instead of real clock

SMS Plus GX

Description:

  • Allow enabling or disabling FM sound (YM2413)
  • Prevent potential crash and cleanup –
    – set max geometry height to 240
    – remove some unnecessary functions and variables
    – move some callbacks from retro_init to retro_load_game
  • Add core option (Remove Border) –
    – removes left border (overscan). Works on SMS only.
    – General video renderer cleanups
  • Add core options for region and hardware type overrides
  • Add proper support for PAL content –
    – timing/region is detected using internal database
    – fix to rom names on rom info log
  • Improve performance when using NTSC filters –
    – Removes Sony decoder core options
    – Removes doubling of height when using NTSC filters
    – Use standard integers where applicable
  • Allow core to safely close when a required bios is not found –
    – For coleco rom content, it requires the colero bios to exists. So if none is found,
    just allow core to safely exit. SMS roms does not require bios to be playable, so no check is necessary for it.
  • Add support for colecovision roms (Experimental)

RACE

Description: Neo Geo Pocket (Color) emulator

  • Fix input mapping typo

TGB Dual

Description: Game Boy (Color) emulator with splitscreen link cable support

  • 3DS: Update target

FreeIntv

Description:

  • Fixes graphics issues – Intellivania not working on emulator
  • Correctly detect MTE Test Cart
  • Fixes #40 – Intellicart roms w/o A8 –
    Detects Intellicart roms using a different method for files that don’t begin with 0xA8
  • Expose RAM for Retroachievements
  • OSD, Keyboard keypad controls –
    keys 0-9 as expected. [ and ] replace C and E
    OSD updated, real messages replace cryptic “colored pixel” loading error feedback

TyrQuake

Description:

  • 3DS: Fix build
  • PSL1GHT: Add build

LRMAME

Description:

  • Update to 0.220
  • add 4-way joystick simulation option
  • Correct 4way support

Theodore

Description:

  • PS2: Add build
  • Auto load BASIC 1 cartridge instead of BASIC 128 cartridge on TO7/70
  • Add virtual keyboard transparency option
  • Add TO8/9 keyboard
  • Update TO8 keyboard image and add TO7&TO7/70 virtual keyboards
  • Add virtual keyboards for all models
  • First version of on-screen virtual keyboard

gpSP

Description: Game Boy Advance emulator

  • Fix cheevos support

RetroArch 1.8.7 released!


RetroArch 1.8.7 has just been released.

Grab it here.

We will release a Cores Progress report soon going over all the core changes that have happened since the last report. It’s an exhaustive list, and especially the older consoles will receive a lot of new cores and improvements.

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

Highlights

There are many things this release post will not touch upon, such as all the extra cores that have been added to the various console platforms. We’ll spend some more time on that in a future Cores Progress Report post. We’ll go over some of the other highlights instead.

Netplay bugfixes

Some major netplay regressions snuck into version 1.8.5 and has remained a problem ever since. 1.8.7 finally fixes these issues.

New desktop-style Playlist View mode for MaterialUI

1.8.7 adds a new Desktop Thumbnail View to Material UI, available when using landscape display orientations. This is similar to Ozone’s playlist view. Above is a random screenshot showing what it looks like.

Notes:

  • The status bar at the bottom can be hidden by disabling Settings > Playlists > Show Playlist Sub-Labels
  • Touching/clicking the thumbnail bar toggles the fullscreen thumbnails view

This also represents a major refactor of MaterialUI’s menu entry handling code, which will make other kinds of playlist view mode easier to implement in the future.

Finally, this fixes two small existing issues:

  • Entry dividers now fade correctly during menu transition animations (this is subtle, and I only just realised that is wasn’t working!)
  • The ‘missing thumbnail’ placeholders now fade into view, just like normal thumbnails (previously, they were always displayed instantly, which was quite jarring)

Disable ‘Use Global Core Options File’ by default

1.8.7 changes the default setting of Use Global Core Options File to OFF.

This was only set to ON by default for consistency with legacy setups. There is no material benefit to this – in fact, a global core options file has the following downsides:

More file I/O – all options have to be read/written every time content is loaded or options are saved

Difficulty in editing option values by hand – e.g. sometimes this is necessary if a particular setting causes a core to crash, and if options for all cores are bundled together then sifting through them to find the one you need becomes a chore

Obsolescence – settings for old/unused/outdated cores hang around forever, and bloat the global options file without purpose. With per-core options, it is easy to remove settings for unwanted cores

Since settings are automatically imported from the legacy global file on first run when per-core files are enabled, changing the default behaviour will not harm any existing installation.

Don’t perform unnecessary cheevos initialisation when cheevos are disabled

Before, on all platforms with cheevos support rcheevos_load() is called each time content is loaded. This means the following happens even when cheevos are disabled:

  • If the core does not require the full content path (i.e. if RetroArch passes a data buffer directly), then a copy of the content data is made (up to 64 MB in size)
  • If the content is an m3u file, the file is opened and parsed to get the extension of the first file listed inside
  • A checksum is calculated for the content file extension
  • A task is pushed
  • A mutex is locked/unlocked several times

When Cheevos (Achievements) are disabled, all these things are unnecessary work, causing increased loading times and memory usage. On platforms with low memory (i.e. consoles) the unnecessary content data duplication is potentially harmful and may cause crashes.

1.8.7 very simply adds an ‘early out’ to rcheevos_load() which prevents the above unnecessary work when cheevos are disabled.

Cheevos: option to start a session with all achievements active

Adding an option to allow the players to start a gaming session with all achievements active (even the ones they have as unlocked on RetroAchievements.org).

When cheevos_start_active = true, instead of You have X of Y achievements unlocked, the player will see a message like this:

How the option looks in XMB:

And in Ozone:

Fallback directories for shader presets

This allows us to use the Menu Config and config file directories as fallback to store shader presets when the Video Shader directory is not writable by the user, thus following the same behavior shown by the “Save shader as” menu option.

This allows users to handle their own presets without having to mess with the directory configuration on distros such as ArchLinux, where shaders (among other assets) are managed through additional packages. But it also goes a bit further and changes the order of the preset directories, searching first on the Menu Config path, then on the Video Shader path, and finally on the directory of the config file.

This would improve the portability of the configuration for Android users, because they cannot explore the default shaders directory without rooting their devices. Moreover, I think it makes more sense, as regular configuration overrides are already being stored on the Menu Config path by default.

Testing
Assuming these directory values:

  • menu_config: /home/user/.config/retroarch/config/ (non-writable for testing purposes)
  • video_shaders: /home/user/.local/share/libretro/shaders/ (non-writable)
  • retroarch.cfg: /home/user/.config/retroarch/retroarch.cfg
  • The following menu options have all been successfully tested (see appended log output).

    Save options

    Save Shader Preset As

    [WARN] Failed writing shader preset to /home/user/.config/retroarch/config/foobar.glslp.
    [WARN] Failed writing shader preset to /home/user/.local/share/libretro/shaders/foobar.glslp.
    [INFO] Saved shader preset to /home/user/.config/retroarch/foobar.glslp.

    Save Global Preset

    [WARN] Failed to create preset directory /home/user/.config/retroarch/config/presets/.
    [WARN] Failed to create preset directory /home/user/.local/share/libretro/shaders/presets/.
    [INFO] Saved shader preset to /home/user/.config/retroarch/presets/global.glslp.

    Save Core Preset

    [WARN] Failed to create preset directory /home/user/.config/retroarch/config/presets/Snes9x/.
    [WARN] Failed to create preset directory /home/user/.local/share/libretro/shaders/presets/Snes9x/.
    [INFO] Saved shader preset to /home/user/.config/retroarch/presets/Snes9x/Snes9x.glslp.

    Save Content Directory Preset
    [WARN] Failed to create preset directory /home/user/.config/retroarch/config/presets/Snes9x/.
    [WARN] Failed to create preset directory /home/user/.local/share/libretro/shaders/presets/Snes9x/.
    [INFO] Saved shader preset to /home/user/.config/retroarch/presets/Snes9x/SNES.glslp.

    Save Game Preset
    [WARN] Failed to create preset directory /home/user/.config/retroarch/config/presets/Snes9x/.
    [WARN] Failed to create preset directory /home/user/.local/share/libretro/shaders/presets/Snes9x/.
    [INFO] Saved shader preset to /home/user/.config/retroarch/presets/Snes9x/Legend of Zelda, The – A Link to the Past (USA).glslp.

    Apply Changes option
    [WARN] Failed writing shader preset to /home/user/.config/retroarch/config/retroarch.glslp.
    [WARN] Failed writing shader preset to /home/user/.local/share/libretro/shaders/retroarch.glslp.
    [INFO] Saved shader preset to /home/user/.config/retroarch/retroarch.glslp.

    Run content log output
    Game specific shader preset found on fallback directory
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/config/presets
    [INFO] [Shaders]: preset directory: /home/user/.local/share/libretro/shaders/presets
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/presets
    [INFO] [Shaders]: Specific shader preset found at /home/user/.config/retroarch/presets/Snes9x/Legend of Zelda, The – A Link to the Past (USA).glslp.
    [INFO] [Shaders]: game-specific shader preset found.

    Folder specific shader preset found on fallback directory
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/config/presets
    [INFO] [Shaders]: preset directory: /home/user/.local/share/libretro/shaders/presets
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/presets
    [INFO] [Shaders]: Specific shader preset found at /home/user/.config/retroarch/presets/Snes9x/SNES.glslp.
    [INFO] [Shaders]: folder-specific shader preset found.

    Core specific shader preset found on fallback directory
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/config/presets
    [INFO] [Shaders]: preset directory: /home/user/.local/share/libretro/shaders/presets
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/presets
    [INFO] [Shaders]: Specific shader preset found at /home/user/.config/retroarch/presets/Snes9x/Snes9x.glslp.
    [INFO] [Shaders]: core-specific shader preset found.

    Global shader preset found on fallback directory
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/config/presets
    [INFO] [Shaders]: preset directory: /home/user/.local/share/libretro/shaders/presets
    [INFO] [Shaders]: preset directory: /home/user/.config/retroarch/presets
    [INFO] [Shaders]: Specific shader preset found at /home/user/.config/retroarch/presets/global.glslp.
    [INFO] [Shaders]: global shader preset found.

    Remove options

    Remove Global Preset
    [INFO] Deleted shader preset from /home/user/.config/retroarch/presets/global.glslp.

    Remove Core Preset
    [INFO] Deleted shader preset from /home/user/.config/retroarch/presets/Snes9x/Snes9x.glslp.

    Remove Content Directory Preset
    [INFO] Deleted shader preset from /home/user/.config/retroarch/presets/Snes9x/SNES.glslp.

    Remove Game Preset
    [INFO] Deleted shader preset from /home/user/.config/retroarch/presets/Snes9x/Legend of Zelda, The – A Link to the Past (USA).glslp.

    Some other noteworthy things

    • RetroArch WiiU now has working graphics widgets. OSD notifications are no longer just plain yellow-colored text.
    • RetroArch 3DS now has basic networking and Cheevos (RetroAchievements) support.
    • With RetroArch 1.8.7 and overclocking, NeoCD reaches fullspeed on RetroArch PSVita. Even audio playback doesn’t stutter any more

    Changelog

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

    1.8.7

    • 3DS: Add IDs for Frodo
    • 3DS: Enable basic networking / cheevos
    • CHEEVOS/BUGFIX: Opening achievements list would crash RetroArch with badges enabled (on new games)
    • CHEEVOS: Option to start a session with all achievements active
    • CHEEVOS: Don’t perform unnecessary cheevos initialisation when cheevos are disabled. Should reduce startup times when loading content.
    • CORE OPTIONS: Disable ‘Use Global Core Options File’ by default
    • DOS/DJGPP: Add 32bit color support for cores
    • GLCORE: Switch to glcore video driver when requested by a core
    • LINUX/XDG: Use GenericName correctly in desktop entry
    • MAC/COCOA: Fix mouse cursor tracking
    • MENU/MATERIALUI: Add desktop-style playlist view mode
    • MENU/MATERIALUI/DESKTOPVIEW: When scrolling playlists, show last selected thumbnails while waiting for next entry to load
    • MENU/MATERIALUI: Limit tab switch rate when input repeat is active
    • MENU/OZONE: Fix sidebar playlist sort order when ‘Truncate Playlist Names’ is enabled
    • MENU/RGUI: Adjusted menu defaults, adjusted default scrolling speed
    • MENU/RGUI: Enable custom wallpaper when menu size is reduced at low resolutions
    • MENU/XMB: Limit tab switch rate when input repeat is active
    • NETPLAY: Fix regressions introduced in 1.8.5
    • RGUI: Add option to always stretch menu to fill the screen
    • WIIU: Enable graphics widgets

Reviving and rewriting paraLLEl-RDP – Fast and accurate low-level N64 RDP emulation

Over the last few months after completing the paraLLEl-RSP rewrite to a Lightrec based recompiler, I’ve been plugging away on a project which I had been putting off for years, to implement the N64 RDP with Vulkan compute shaders in a low-level fashion. Every design of the old implementation has been scrapped, and a new implementation has arisen from the ashes. I’ve learned a lot of advanced compute techniques, and I’m able to use far better methods than I was ever able to use back in the early days. This time, I wanted to do it right. Writing a good, accurate software renderer on a massively parallel architecture is not easy and you need to rethink everything. Serial C code will get you nowhere on a GPU, but it’s a fun puzzle, and quite rewarding when stuff works.

The new implementation is a standalone repository that could be integrated into any emulator given the effort: https://github.com/Themaister/parallel-rdp. For this first release, I integrated it into parallel-n64. It is licensed as MIT, so feel free to integrate it in other emulators as well.

Why?

I wanted to prove to myself that I could, and it’s … a little fun? I won’t claim this is more than it is. 🙂

Chasing bit-exactness

The new implementation is implemented in a test-driven way. The Angrylion renderer is used as a reference, and the goal is to generate the exact same output in the new renderer. I started writing an RDP conformance suite. Here, we generate RDP commands in C++, run the commands across different implementations, and compare results in RDRAM (and hidden RDRAM of course, 9-bit RAM is no joke). To pass, we must get an exact match. This is all fixed-point arithmetic, no room for error! I’ve basically just been studying Angrylion to understand what on earth is supposed to happen, and trying to make sense of what the higher level goal of everything is. In LLE, there’s a lot of weird magic that just happens to work out.

I’m quite happy with where I’ve ended up with testing and seeing output like this gives me a small dopamine shot before committing:

122/163 Test #122: rdp-test-interpolation-color-texture-ci4-tlut-ia16 ………………………….. Passed 2.50 sec
Start 123: rdp-test-interpolation-color-texture-ci8-tlut-ia16
123/163 Test #123: rdp-test-interpolation-color-texture-ci8-tlut-ia16 ………………………….. Passed 2.40 sec
Start 124: rdp-test-interpolation-color-texture-ci16-tlut-ia16
124/163 Test #124: rdp-test-interpolation-color-texture-ci16-tlut-ia16 …………………………. Passed 2.37 sec
Start 125: rdp-test-interpolation-color-texture-ci32-tlut-ia16
125/163 Test #125: rdp-test-interpolation-color-texture-ci32-tlut-ia16 …………………………. Passed 2.45 sec
Start 126: rdp-test-interpolation-color-texture-2cycle-lod-frac
126/163 Test #126: rdp-test-interpolation-color-texture-2cycle-lod-frac ………………………… Passed 2.51 sec
Start 127: rdp-test-interpolation-color-texture-perspective
127/163 Test #127: rdp-test-interpolation-color-texture-perspective ……………………………. Passed 2.50 sec
Start 128: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac
128/163 Test #128: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac ……………… Passed 3.29 sec
Start 129: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac-sharpen
129/163 Test #129: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac-sharpen ………. Passed 3.26 sec
Start 130: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac-detail
130/163 Test #130: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac-detail ……….. Passed 3.48 sec
Start 131: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac-sharpen-detail
131/163 Test #131: rdp-test-interpolation-color-texture-perspective-2cycle-lod-frac-sharpen-detail … Passed 3.26 sec
Start 132: rdp-test-texture-load-tile-16-yuv

151/163 Test #151: vi-test-aa-none …………………………………………………………. Passed 21.19 sec
Start 152: vi-test-aa-extra-dither-filter
152/163 Test #152: vi-test-aa-extra-dither-filter ……………………………………………. Passed 48.77 sec
Start 153: vi-test-aa-extra-divot
153/163 Test #153: vi-test-aa-extra-divot …………………………………………………… Passed 64.29 sec
Start 154: vi-test-aa-extra-dither-filter-divot
154/163 Test #154: vi-test-aa-extra-dither-filter-divot ………………………………………. Passed 65.90 sec
Start 155: vi-test-aa-extra-gamma
155/163 Test #155: vi-test-aa-extra-gamma …………………………………………………… Passed 48.28 sec
Start 156: vi-test-aa-extra-gamma-dither
156/163 Test #156: vi-test-aa-extra-gamma-dither …………………………………………….. Passed 48.18 sec
Start 157: vi-test-aa-extra-nogamma-dither
157/163 Test #157: vi-test-aa-extra-nogamma-dither …………………………………………… Passed 47.56 sec

100% tests passed, 0 tests failed out of 163 #feelsgoodman

Ideally, if someone is clever enough to hook up a serial connection to the N64, it might be possible to run these tests through a real N64, that would be interesting.

I also fully implemented the VI this time around. It passes bit-exact output with Angrylion in my tests and there is a VI conformance suite to validate this as well. I implemented almost the entire thing without even running actual content. Once I got to test real content and sort out the last weird bugs, we get to the next important part of a test-driven development workflow …

The importance of dumping formats

A critical aspect of verifying behavior is being able to dump RDP commands from the emulator and replay them.

On the left I have Angrylion and on the right paraLLEl-RDP running side by side from a dump where I can step draw by draw, and drill down any pesky bugs quite effectively. This humble tool has been invaluable. The Angrylion backend in parallel-n64 can be configured to generate dumps which are then used to drill down rendering bugs offline.

Compatibility

The compatibility is much improved and should be quite high, I won’t claim its perfect, but I’m quite happy with it so far. We went through essentially all relevant titles during testing (just the first few minutes), and found and fixed the few issues which popped up. Many games which were completely broken in the old implementation now work just fine. I’m fairly confident that those bugs are solvable this time around though if/when they show up.

Implementation techniques

With Vulkan in 2020 I have some more tools in my belt than was available back in the day. Vulkan is a quite capable compute API now.

Enforcing RDRAM coherency

A major pain point of any N64 emulator is the fact that RDRAM is shared for the CPU and RDP, and games sure know how to take advantage of this. This creates a huge burden on GPU-accelerated implementations as we now have to ensure full coherency to make it accurate. Most HLE emulators simply don’t care or employ complicated heuristics and workarounds, and that’s fine, but it’s not good enough for LLE.

In the previous implementation, it would try to do “framebuffer manager” techniques similar to HLE emulators, but this was the wrong approach and lead to a design which was impossible to fix. What if … we just import RDRAM as buffer straight into the Vulkan driver and render to that, wouldn’t that be awesome? Yes … yes, it would be, and that’s what I did. We have an obscure, but amazing extension in Vulkan called VK_EXT_external_memory_host which lets me import RDRAM from the emulator straight into Vulkan and render to it over the PCI-e bus. That way, all framebuffer management woes simply disappear, I render straight into RDRAM, and the only thing left to do is to handle synchronization. If you’re worried about rendering over the PCI-e bus, then don’t be. The bandwidth required to write out a 320×240 framebuffer is absolutely trivial especially considering that we’re doing …

Tile-based rendering

The last implementation was tile-based as well, but the design is much improved. This time around all tile binning is done entirely on the GPU in parallel, using techniques I implemented in https://github.com/Themaister/RetroWarp, which was the precursor project for this new paraLLEl-RDP. Using tile-based rendering, it does not really matter that we’re effectively rendering over the PCI-e bus as tile-based rendering is extremely good at minimizing external memory bandwidth. Of course, for iGPU, there is no (?) external PCI-e bus to fight with to begin with, so that’s nice!

Ubershaders with asynchronous pipeline optimization

The entire renderer is split into a very small selection of Vulkan GLSL shaders which are precompiled into SPIR-V. This time, I take full advantage of Vulkan specialization constants which allow me to fine-tune the shader for specific RDP state. This turned out to be an absolute massive win for performance. To avoid the dreaded shader compilation stutter, I can always fallback to a generic ubershader while pipeline is being compiled which is slow, but works for any combination of state. This is a very similar idea to what Dolphin pioneered for emulation a few years ago.

8/16-bit integer support

Memory accesses in the RDP are often 8 or 16 bits, and thus it is absolutely critical that we make use of 8/16-bit storage features to interact directly with RDRAM, and if the GPU supports it, we can make use of 8 and 16-bit arithmetic as well for good measure.

Async compute

Async compute is critical as well, since we can make the async compute queue high priority and ensure that RDP shading work happens with very low latency, while VI filtering and frontend shaders can happily chug along in the fragment/graphics queue. Both AMD and NVIDIA now have competent implementations here.

GPU-driven TMEM management

A big mistake I made previously was doing TMEM management in CPU timeline, this all came crashing down once we needed framebuffer effects. To avoid this, all TMEM uploads are now driven by the GPU. This is probably the hairiest part of paraLLEl-RDP by far, but I have quite a lot of gnarly tests to test all the relevant corner cases. There are some true insane edge cases that I cannot handle yet, but the results created would be completely meaningless to any actual content.

Performance

To talk about FPS figures it’s important to consider the three major performance hogs in a low-level N64 emulator, the VR4300 CPU, the RSP and finally the RDP. Emulating the RSP in an LLE fashion is still somewhat taxing, even with a dynarec (paraLLEl-RSP) and even if I make the RDP infinitely fast, there is an upper bound to how fast we can make the emulator run as the CPU and RSP are still completely single threaded affairs. Do keep that in mind. Still, even with multithreaded Angrylion, the RDP represents a quite healthy chunk of overhead that we can almost entirely remove with a GPU implementation.

GPU bound performance

It’s useful to look at what performance we’re getting if emulation was no constraint at all. By adding PARALLEL_RDP_BENCH=1 to environment variables, I can look at how much time is spent on GPU rendering.

Playing on an GTX 166o Ti outside the castle in Mario 64:

[INFO]: Timestamp tag report: render-pass
[INFO]: 0.196 ms / frame context
[INFO]: 0.500 iterations / frame context

We’re talking ~0.2ms on GPU to render one frame on average, hello theoretical 5000 VI/s … Somewhat smaller frame times can be observed on my Radeon 5700 XT, but we’re getting frame rates so ridiciously high they become meaningless here. We’ve tested it on quite old cards as well and the difference in FPS on even something ancient like an R9 290x card and a 2080 Ti is minimal since the time now spent in RDP rendering is completely irrelevant compared to CPU + RSP workloads. We seem to be getting about a 50-100% uplift in FPS, which represents the shaved away overhead that the CPU renderer had. Hello 300+ VI/s!

Unfortunately, Intel iGPU does not fare as well, with an overhead high enough that it does not generally beat multithreaded Angrylion running on CPU. I was somewhat disappointed by this, but I have not gone into any real shader optimization work. My early analysis suggests extremely poor occupancy and a ton of register spilling. I want to create a benchmark tool at some point to help drill down these issues down the line.

It would be interesting to test on the AMD APUs, but none of us have the hardware handy sadly 🙁

Synchronous vs Asynchronous RDP

There are two modes for the RDP. In async mode, the emulation thread does not wait for the GPU to complete rendering. This improves performance, at the cost of accuracy. Many games unfortunately really rely on the unified memory architecture of the N64. The default option is sync, and should be used unless you have a real need for speed, or the game in question does not need sync.

Here we see an example of broken blob shadows caused by async RDP in Jet Force Gemini. This happens because the CPU is actually reading the shadowmap rendered by the RDP, and blurring it on the CPU timeline (why on earth the game would do that is another question), then reuploading it to the RDP. These kinds of effects require very tight sync between CPU and GPU and comes up in many games. N64 is particularly notorious for these kinds of rendering challenges.

Of course, given how fast the GPU implementation is on discrete GPUs, sync mode does not really pose an issue. Do note that since we’re using async compute queues here, we are not stalling on frontend shading or anything like that. The typical stall times on the CPU is in the order of 1 ms per frame, which is very acceptable. That includes the render thread doing its thing, submitting that to GPU, getting it executed and coming back to CPU, which has some extra overhead.

Road-map for future improvement

I believe this is solid enough for a first release, but there are further avenues for improvement.

Figure out poor performance on Intel iGPU

There is something going on here that we should be able to improve.

Implement a workaround for implementations without VK_EXT_external_memory_host (EDIT: Now implemented as of 2020-05-18)

Unfortunately there is one particular driver on desktop which doesn’t support this, and that’s NVIDIA on Linux (Windows has been supported since 2018 …). Hopefully this gets implemented soon, but we will need a fallback. This will get ugly since we’ll need to start shuffling memory back and forth between RDRAM and a GPU buffer. Hopefully the async transfer queue can help make this less painful. It might also open up some opportunities for mobile, which also don’t implement this extension as we speak. There might also be incentives to rewrite some fundamental assumptions in the N64 emulator plugin specifications (can we please get rid of this crap …). If we can let the GPU backend allocate memory, we don’t need any fancy extension, but that means uprooting 20 years of assumptions and poking into the abyss … Perhaps a new implementation can break new ground here (hi @ares_emu!).

EDIT: This is now done! Takes a 5-10% performance hit in sync mode, but the workaround works quite well. A fine blend of masked SIMD moves, a writemask buffer, and atomics …

Internal upscaling?

It is rather counter-intuitive to do upscaling in an LLE emulator, but it might yield some very interesting results. Given how obscenely fast the discrete GPUs are at this task, we should be able to do a 2x or maybe even 4x upscale at way-faster-than-realtime speeds. It would be interesting to explore if this lets us avoid the worst artifacts commonly associated with upscaling in HLE.

Fancier deinterlacer?

Some N64 content runs at 480i, and we can probably spare some GPU cycles running a fancier deinterlacer 😉

Esoteric use cases?

PS1 wobbly polygon rendering has seen some kind of resurgence in the last years in the indie scene, perhaps we’ll see the same for the fuzzy N64 look eventually. With paraLLEl-RDP, it should be possible to build a rendering engine around a N64-lookalike game. That would be cool to see.

Conclusion

This is a somewhat esoteric implementation, but I hope I’ve inspired more implementations like this. Compute-based accurate renderers will hopefully spread to more systems that have difficulties with accurate rendering. I think it’s a very interesting topic, and it’s a fun take on emulation that is not well explored in general.

paraLLEl-RDP rewritten from scratch – available in paraLLEl n64 right now for RetroArch



The ParaLLEl N64 Libretro core has received an update today that adds the brand new paraLLEl-RDP Vulkan renderer to the emulator core.

I implore everybody to read Themaister’s blog post (Reviving and rewriting paraLLEl-RDP – Fast and accurate low-level N64 RDP emulation) for a deep dive into this new renderer.

Requirements

  • You need a graphics card that supports the Vulkan graphics API.
  • It’s currently only available on Windows and Linux.
  • Right now the renderer requires a specific Vulkan extension, called ‘VK_EXT_external_memory_host’. Only Nvidia Linux binary drivers for Vulkan currently doesn’t support this extension. It has been requested but there is no ETA yet on when they will implement this.

What’s new since the old ParaLLEl RDP?

  • Completely rewritten from the ground up
  • Bit-exact renderer
  • Should be pretty much on par with Angrylion accuracy-wise now – none of the issues that plagued the old paraLLEl RDP
  • Now emulates the VI (Video Interface) as well
  • Basic deinterlacing for interlaced video modes

How to install and set it up

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

Progress and development in N64 emulation over the past decade

State of HLE emulation

IMHO, this release today represents one of the biggest steps that have been taken so far to elevate Nintendo 64 emulation as a whole. N64 emulation has gotten a bad rep for over decades because of HLE RDP renderers that fail to accurately reproduce every game’s graphics correctly and tons of unemulated RSP microcode, but it’s gotten significantly better over the years. On the HLE front, things have progressed. GLideN64 has made big strides in emulating most of the major significant games, the HLE RSP implementation used by Mupen 64 Plus is starting to emulate most of the major micro codes that developers made for N64 games. So on that front, things have certainly improved. There are also obviously limiting factors on the HLE front. For instance, GLideN64 still requires OpenGL, and renderers for Vulkan and other modern graphics APIs have not been implemented as of this date (although they could be).

State of LLE emulation

So that’s the HLE front. But for the purpose of this blog article, we are mostly concerned here about Low-Level Emulation. Both HLE and LLE N64 emulation are valid approaches, but if we want to reproduce the N64 accurately, we ultimately have to go LLE. So, what is the state of LLE emulation?

For LLE emulation, some of the advancements over the past few years has been a multithreaded version of Angrylion. Angrylion is the most accurate software RDP renderer to date. Its main problem has always been how slow it is. Up until say the mid to late ’10s, desktop PCs just did not have the CPU power to run any game at fullspeed with this renderer. Multithreaded Angrylion has seen Angrylion make some big gains in the performance department previously thought unimaginable.

However, Angrylion as a software renderer can only be taken so far. The fact remains that it is a big bottleneck on the CPU, and you can easily see CPU activity exceeding over 65% on a modern rig with the multithreaded Angrylion renderer. Software rendering is just never going to be a particularly fast way of doing 3D rasterization.

So, back in 2016, the first attempt at making a hardware renderer that can compete with Angrylion was made. It was a big release for us and it marked one of the first pieces of software to be released that was designed exclusively around the then-new Vulkan graphics API. You can read our old blog post here.

It was a valiant first attempt at making a speedy Angrylion port to hardware. Unfortunately, this first version was full of bugs, and it had some big architectural issues that just made further development on it very hard. So it didn’t see much further development for the past few years.

This year, all the stars have aligned. First out of the gates was the resurrection of paraLLEl-RSP, another project by Themaister. Low-level N64 emulation places a big demand on the CPU, and while cxd4’s RSP interpreter is very accurate, to get at least a 2x leap in performance, a dynamic recompiler approach has to be taken. To that end, this year not only was paraLLEl-RSP resurrected, but we moved the dynamic recompiler architecture from LLVM to Lightrec. It’s a bit less performant than LLVM to be sure but it also has some big advantages – LLVM runtime libraries are very hard to embed and integrate for various platforms, while Lightrec doesn’t have these dependency issues. Furthermore, LLVM would take a long time recompiling code blocks, and it would cause big stutters during gameplay (for instance, bringing up the map in Doom 64 for the first time would cause like a 5-second freeze in the gameplay while it was recompiling a code block – obviously not ideal). With Lightrec, all those stutters were more or less gone.

So, Q1 2020. We now have multithreaded Angrylion which leverages the multi-core CPUs of today’s hardware to get better performance results. We have ParaLLEl RSP, a low-level RSP plugin with a dynamic recompiler that gives us a big bump in performance. But one piece of the puzzle is still missing, and it’s perhaps the most significant. Multithreaded Angrylion still is a software renderer and therefore it still massively bottlenecks the CPU. Whether you can spread that load out over multiple cores or not ultimately matters little – CPUs just are not good at doing fast 3D rasterization, a lesson learned by nearly every mid ’90s PC game developer, and why 3D accelerated hardware could not have come sooner.

So, the obvious Next Big Thing in N64 emulation was to get rid of this CPU bottleneck and move Angrylion kicking and screaming to the GPU, and this time avoid all of the issues that plagued the initial paraLLEl RDP prototype.

Where does that leave us?

With a very accurate Angrylion-quality LLE RDP renderer running on the GPU, and a dynarec LLE RSP core, you will be surprised at how accurate Mupen 64 Plus is now. Nearly every commercial game runs now as expected with nearly no graphical issues, the sound is as you’d expect it to be, it looks, runs and functions just like a real N64. And if you’re on a discrete Nvidia or AMD GPU, your GPU activity will be 4% on average, whether it’s a stone-age GPU from the year 2013 like an AMD R9 290x, or an Nvidia Geforce 2080 Ti. Nearly any discrete GPU made from 2013 to 2020 that supports the Vulkan API seems to eat low-level N64 graphics for breakfast. CPU activity also has decreased significantly. With multithreaded Angrylion and Parallel RSP, there would be about 68% CPU activity on my rig. This is brought down to just 7 to 10% using paraLLEl RDP instead of Angrylion. Software rendering on the CPU is just a huge bottleneck no matter which way you slice it.

So for most practical purposes, using the paraLLEl RDP and paraLLEl RSP cores in tandem, the future is now. Accurate N64 emulation is here, it’s no longer slow, and it’s no longer completely CPU bound either. And you can play it on RetroArch right now, right today. We don’t have to wait for a near-accurate representation of an N64, it’s already here with us for all practical gameplay purposes.

How much faster is paraLLEl RDP compared to Angrylion? That is hard to say, and depends on the game you’re running. On average you can expect a 2x speedup. However, notice that at native resolution rendering, any discrete GPU since 2013 eats this workload for breakfast. This means you’re completely CPU bound in terms of performance most of the time. The better your CPU is at single threaded workloads (IPC), the better it will perform. Core count is a less significant factor. I think on my specific rig, it was my CPU that was the weakest link in the chain (a 7700k i7 Intel CPU paired with a 2080 Ti). The GPU matters relatively little, the 2080 Ti was mostly being completely idle during these tests. For that matter, so was an old 2013 AMD card that I would test with the same CPU – GPU activity remained flat at around 4%. As Themaister has indicated in his blog post, this leaves so much room for upscaled resolutions, which is on the roadmap for future versions.

Benchmarks

System specs: CPU – Intel Core i7 7700k | GPU – Geforce RTX 2080 Ti (11GB VRAM, 2018) | 16GB RAM

Title Angrylion ParaLLEl RDP (Synchronous) ParaLLEl RDP (Asynchronous)
007 GoldenEye 82fps 119fps 133fps
Banjo Tooie 72fps 132fps 148fps
Doom 64 174fps 282fps 322fps
F-Zero X 158fps 370fps 478fps
Hexen 156fps 300fps 360fps
Indiana Jones and the Infernal Machine 61fps 94fps 114fps
Killer Instinct Gold ~103fps ~168fps ~240fps
Legend of Zelda: Majora’s Mask 122fps 202fps 220fps
Mario Kart 64 ~178fps ~309fps ~330-350fps
Perfect Dark (High-res) 70fps 125fps 130fps
Pilotwings 64 87fps 125fps 144fps
Quake 188fps 262fps 300fps
Resident Evil 2 183fps 226fps 383fps (*)
Star Wars Episode I: Battle for Naboo 90fps 136fps 178fps
Super Mario 64 129fps 204fps 220fps
Vigilante 8 (Low-res) 63fps 91fps 112fps
Vigilante 8 (High-res) ~46-55fps ~92-99fps ~119fps
World Driver Championship ~109fps ~225fps ~257fps

* – Has game breaking issues in this mode

System specs: CPU – Intel Core i7 7700k | GPU – AMD Radeon R9 290x (4GB VRAM, 2013) | 16GB RAM

Title Angrylion ParaLLEl RDP (Synchronous) ParaLLEl RDP (Asynchronous)
007 GoldenEye 82fps 119fps 133fps
Banjo Tooie 72fps 132fps 148fps
Doom 64 174fps 282fps 322fps
F-Zero X 158fps 360fps 439fps
Hexen 156fps 288fps 352fps
Indiana Jones and the Infernal Machine 61fps 94fps 114fps
Killer Instinct Gold ~93fps ~162fps ~239fps
Legend of Zelda: Majora’s Mask 122fps 202fps 220fps
Mario Kart 64 ~157fps ~274fps ~292fps
Perfect Dark (High-res) 70fps 125fps 130fps
Pilotwings 64 87fps 125fps 144fps
Quake 189fps 262fps 326fps
Resident Evil 2 156fps 226fps 383fps (*)
Star Wars Episode I: Battle for Naboo 90fps 136fps 178fps
Super Mario 64 129fps 195fps 209fps
Vigilante 8 (Low-res) 63fps 91fps 112fps
Vigilante 8 (High-res) ~46-55fps ~92-99fps ~119fps
World Driver Championship ~109fps ~224fps ~257fps

* – Has game breaking issues in this mode

Core option explanations


paraLLEl RDP has some special dedicated options. You can change these by going to Quick Menu and going to Options. Here’s a quick breakdown of what they do –

ParaLLEl Synchronous RDP:

Turning this off allows for higher CPU/GPU parallelism. However, there are certain games that might produce problems if left disabled. An example of such a game is Resident Evil 2.

It has been verified that with the vast majority of games, disabling this can provide for at least a +10fps speedup. Usually the performance difference is much higher though. Try experimenting with it. If you experience no game breaking bugs or visual anomalies, it’s safe to disable this for the game you’re running and enjoy higher performance.

Video Interface Options
ParaLLEl-RDP emulates the N64 RDP’s VI module. This applied plenty of postprocessing to the final output image to further smooth out the picture. Some of the options down below allow you to enable/disable some of these VI settings on the fly. Disabling some of these and enabling some others could be beneficial if you want to use several frontend shaders on top, since disabling some of these postprocessing effects could result in a radically different output image.

(ParaLLEl-RDP) VI Interlacing Disabling this will disable the VI serration bits used for interlaced video modes. Turning this off essentially looks like basic bob deinterlacing, the picture might become shaky as a result when leaving this off.

(ParaLLEl-RDP) VI Gamma Filter Disabling this will disable the hardware gamma filter that some games use.

(ParaLLEl-RDP) VI Divot filter Disabling this will disable the median filter which is intended to clean up some glitched pixels coming out of the RDP. Subtle difference in output, but usually seems to apply to shadow blob decals.

(ParaLLEl-RDP) VI AA Disabling this will disable Anti-Aliasing.

(ParaLLEl-RDP) VI Dither Filter The VI’s dither filter is used to make color banding less apparent with 16-bit pixels.

(ParaLLEl-RDP) VI Bilinear VI bilinear is the internal upscaler in the VI. Disabling this is typically a good idea, since it’s typically used to upscale horizontally.

By disabling VI AA and enabling VI Bilinear, the picture output looks just like how Angrylion’s “Unfiltered” mode currently looks like.

FAQ

Will this renderer be ported to OpenGL?

Here is the short answer – no. Not by us, at least. Reasons: OpenGL is an outdated API compared to Vulkan that does not support the features required by Parallel-RDP. GL does not support 8/16bit storage, external memory host, or async compute. If one would be able to make it work, it would only work on the very best GL implementation, where Vulkan is supported anyways, rendering it mostly moot.

Ports to DirectX 12 are similarly not going to be considered by us, others can feel free to do so. One word of warning – even DirectX12 (yes, even Ultimate) is found lacking when it comes to providing the graphics techniques that ParaLLEl RDP is built around. Whoever will take on the endeavor to port this to DX12 or GL 4.5/4.6 will have their work cut out for them.

RetroArch 1.8.6 released!


RetroArch 1.8.6 has just been released.

Grab it here.

We will release a Cores Progress report soon going over all the core changes that have happened since the last report. It’s an exhaustive list, and especially the older consoles will receive a lot of new cores and improvements.

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

Highlights

There are many things this release post will not touch upon, such as all the extra cores that have been added to the various console platforms. We’ll spend some more time on that in a future Cores Progress Report post. We’ll go over some of the other highlights instead.

PSL1GHT PlayStation3 port

A new port of RetroArch to the PSL1GHT toolchain has been made for PlayStation3.

Right now there are no automated nightly builds for this, but you can download our experimental stable for it instead.

Working:

  • packaging
  • running cores
  • switching cores
  • gamepad including axis
  • RGUI menu driver
  • audio
  • video
  • cores: 2048, ecwolf, freechaf

Not working:

  • OSD
  • Menus other than RGUI
  • Shaders
  • Graphical acceleration
  • Proper signing
  • ODE build
  • Rumble
  • mouse

iOS/tvOS – Fix audio getting cut off on interruption

While using RetroArch, if you playback audio content (such as via the Control Center) or if you are interrupted by a phone call, the audio in RetroArch would stop entirely.

Changed to set the audio session category to “ambient” so that you can playback other audio sources and have sounds in RA at the same time.

Also, took out the bit to save the config when the app loses focus – it became too much of a distraction (the notification is distracting – this was not working previously anyway).

OpenGL Core – Slang shader improvements

Before, the OpenGL Core shader driver did not correctly initialise loaded textures. The texture filtering and wrap mode are forced on texture creation, but these settings were not recorded – subsequent updates would set garbage values, that then resolved to linear filtering OFF and wrap mode = CLAMP_TO_EDGE.

The wrap mode seemed to work regardless – perhaps once this is set the first time, it cannot change? (I don’t understand the inner workings of OpenGL…) But the texture filtering was certainly wrong. For example, this is what a background image with linear filtering enabled looks like:

…what you actually get is nearest neighbour.

This PR fixes texture initialisation so the filtering and wrap mode are recorded correctly. A linear filtered background image now looks like this:

Only write config files to disk when parameters change

We’ve been looking at ways to reduce disk I/O overhead, since it tends to be a big bottleneck on slower platforms.

Before, RetroArch would continuously overwrite its configuration files:

  • retroarch.cfg is written every time content is closed, and when closing RetroArch itself
  • Core options are written every time content is closed

This represents a large amount of unnecessary disk access, which is quite slow (and also causes wear on solid state drives!)

With 1.8.6, configuration files are only written to disk when the content actually changes.

All types of configuration file should now be ‘well behaved’ – with the exception of cheat files. These are still overwritten when closing content, since reusing old parameters may cause issues (and since I don’t use cheats at all, I didn’t feel confident enough to dabble with this)

While making these changes, we also discovered and fixed a number of bugs:

  • RetroArch no longer crashes when attempting to save a config file after ‘unsetting’ a parameter (currently, this can be triggered quite easily by manipulating input remaps)
  • When using Material UI, RetroArch no longer modifies the wrong setting (or segfaults…) when tapping entries in the Quick Menu > Controls input remapping submenu
  • Quite a few real and potential memory leaks have been fixed.

Playlist compression

There’s a new Compress playlists option under Settings > Playlists. When enabled, playlists are stored in an archived format (using the new rzip_stream interface).

The obvious benefit is that playlist file size is reduced by ~90%, with a corresponding reduction in disk wear on solid state drives (playlists are rewritten to disk quite frequently!).

Given the small size of playlist files, these saving aren’t hugely significant – but of more interest is the fact that on one of our development machines (Linux + mechanical HDD), loading a compressed playlist takes ~20% less time than an uncompressed one (despite the extra zlib overheads). This produces noticeably smoother scrolling when switching playlists in XMB. This improvement is most likely platform-dependent, but on devices where storage speed is a real issue (e.g. 3DS, UWP) the difference in playlist loading times should be quite pronounced.

We’ve also fixed some small playlist-related bugs/issues:

  • When saving playlists using the old format, default core association is now written correctly (not sure when this regression happened…)
  • When saving playlists using the old format, per-playlist sort mode is now recorded (I miscounted the number of available metadata ‘slots’ in the old format files – there was in fact just enough room for this one extra setting)
  • Whenever a playlist is cached by the menu (i.e. when a playlist is opened for display), RetroArch will check the format of the playlist (old/new) and its compression state – if either differ from the current user-set values, the file will be updated. This ensures playlists remain in sync with menu settings. (Previously, toggling the ‘use old format’ setting would do nothing unless the playlist was subsequently modified – this has long been an annoyance for me, since it meant ‘fully populated’ playlists languished in whatever state they were originally created)

It goes without saying that RetroArch will automatically detect whether or not a playlist is compressed and handle it appropriately.

If a playlist has been compressed and a user subsequently wants to edit it by hand, they can simply toggle Compress playlists off and then view the playlist via the menu – it will automatically be decompressed to plain text/JSON.

In addition to this, since human readability is not a factor when compressing playlists, we now omit all whitespace (newlines/indentation) when writing compressed JSON.

This reduces performance overheads when reading compressed JSON playlists by ~16% (!)

SRAM Compression

This is a minor follow-up to PR #10454. It adds a new SaveRAM Compression option under Settings > Saving. When enabled, SRAM save files are written to disk as compressed archives.

While SRAM saves are generally quite small, this can still yield a not insignificant space saving on storage-starved devices (e.g. the SNES/NES Classic consoles). Moreover, it reduces wear on solid state drives when SaveRAM Autosave Interval is set (in the worst case, this can write a couple of MB to disk per minute – vs. a few kB when compression is enabled).

Actual compression ratios will vary greatly depending upon core and loaded content. Here are a few examples of SRAM save sizes for random cores/games:

Core Uncompressed Compressed
Gambatte 32 kB 178 B
Genesis Plus GX 32 kB 83 B
mGBA 64 kB 1.1 kB
Mupen64Plus-Next OpenGL 290 kB 736 B
PCSX-ReARMed 128 kB 605 B
Snes9x 8.0 kB 183 B

In many cases, the actual on-disk save size can be reduced to almost nothing.

Notes:

  • As with save states, RetroArch will automatically detect whether SRAM saves are compressed and handle them appropriately (SaveRAM Compression can be toggled at any time).
  • This only works with cores that use the libretro SRAM interface for saving games. Many (most?) do, but there are some exceptions – e.g. Flycast writes save files directly, and so to does Beetle PSX depending on core settings.

Savestate compression

There’s a new Savestate Compression option under Settings > Saving. When enabled, save state files are written to disk as compressed archives. This both saves a substantial amount of disk space and reduces wear on solid state drives.

Actual compression ratios will vary depending upon core and loaded content. Here are a few examples of save state sizes for random cores/games:

Core Compression OFF Compression ON
Beetle PSX HW 16 MB 1.5 MB
Flycast 27 MB 8.9 MB
Genesis Plus GX 1012 kB 47 kB
mGBA 453 kB 45 kB
Mupen64Plus-Next OpenGL 17 MB 1.5 MB
PPSSPP 40 MB 9.3 MB
PCSX-ReARMed 4.3 MB 2.3 MB
PUAE 11 MB 793 kB
Snes9x 421 kB 82 kB

Notes:

  • RetroArch will automatically detect whether state files are compressed or not, and load them approriately – i.e. Savestate Compression can be toggled at any time, and everything will Just Work (TM)
  • We now have a new file stream for reading/writing archived data: rzip_stream. This can be used to handle any compressed data writing tasks we might have in the future

(Manual content scanner/playlist cleaner) Prevent redundant playlist entries when handling M3U content

Before, when the manual content scanner was used to scan content that includes M3U files, redundant playlist entries were created. For example, content like this:

  • Panzer Dragoon Saga CD1 (Saturn) (U).cue
  • Panzer Dragoon Saga CD2 (Saturn) (U).cue
  • Panzer Dragoon Saga CD3 (Saturn) (U).cue
  • Panzer Dragoon Saga CD4 (Saturn) (U).cue
  • Panzer Dragoon Saga (Saturn) (U).m3u

(where the .m3u references all the .cue files) would generate playlist entries for both the .m3u file and each of the .cue files. This is annoying, since the latter are pointless, and must be removed manually by the user.

1.8.6 adds M3U ‘awareness’ to the manual content scanner. Now whenever M3U files are encountered, they are parsed, and anything they reference internally is removed/omitted from the output playlist.

This functionality has also been added to the Playlist Management Clean Playlist task, so these redundant entries can be removed easily from existing playlists.

(Side note: 1.8.6 also adds a simple but feature complete M3U handling library – this may have additional use if someone wants to add the ability to generate M3U files for existing content…)

Improved handling of ‘broken’ playlists

RetroArch previously would fall apart when handling ‘broken’ playlists – i.e. when playlist entries have missing or invalid path/core path/core name fields. 1.8.6 should fix the most significant issues:

  • RetroArch will no longer segfault when attempting to run content via a playlist entry with missing path or core path fields.
  • When a playlist entry has either core path and/or core name set to NULL, DETECT or an empty string, attempting to load content will fallback to the normal ‘core selection’ code (currently this happens only if both core path and core name are DETECT – this is wholly inadequate!)
  • RetroArch will no longer segfault when attempting to fetch content runtime information when core path is NULL
  • Core name + runtime info will only be displayed on playlists and in the Information submenu if both the core path and core name fields are ‘valid’ (i.e. not NULL or DETECT)
  • When handling entries with missing path fields, the menu sorting order now matches that of the playlist sorting order (at present, everything goes out of sync when paths are empty). Moreover, entries with missing path fields can now be ‘selected’, so users can remove them (currently, hitting A on such an entry immediately tries – and fails – to load the content, so the only way to remove the broken entry is via the Playlist Management > Clean Playlist feature)

(Playlist Management) Add optional per-playlist alphabetical sorting

At present, RetroArch offers a global Sort playlists alphabetically option – but several users have requested more fine grained control. i.e. Users with highly customised setups might want a number of ‘hand-crafted’ playlists with specific ordering (release date, games in a particular series, etc.) without losing the ability to automatically sort their other conventional platform-based playlists.

1.8.6 adds a new Sorting Method option to the Playlist Management interface. This allows the sorting method to be overridden on a per-playlist basis. Available values are System Default (reflects Sort playlists alphabetically setting), Alphabetical and None.

Notes:

  • Content history playlists are excluded – they are never sorted (this has always been the case!)
  • This option is only available when using the ‘new’ format playlists (i.e. Save playlists using old format = OFF). There’s just not enough room in the old-style playlists for additional metadata. Since pretty much everyone uses the new format (by default), I don’t think this is an issue.
  • 1.8.6 also tweaks the way that the displayed menu entries are handled – previously, it would go as follows:

    Sort playlist
    Loop through playlist and generate menu entries
    Sort menu entries

…not only did this duplicate effort, but it meant there was a chance of the playlist and menu going out of sync – especially when using the Label Display Mode feature, which could lead to a different alphabetical ordering when processing the generated menu entries. As of 1.8.6, only the playlist is ever sorted, and menu entries are listed in exactly the same order.

Ozone

Before, Ozone can display either one thumbnail + content metadata or two thumbnails (with content metadata fallback when one image is missing) for each playlist entry.

With 1.8.6, if two thumbnails are enabled then the user can toggle between the second thumbnail and content metadata by pressing RetroPad ‘select’. When metadata is shown in this way, an image icon is displayed to indicate that a second thumbnail is available. The toggle may also be performed with a mouse/touchscreen by clicking/tapping the thumbnail sidebar.

Ozone menu – Mouse/Touch input fixes

  • Pointer input is now correctly disabled when message boxes are displayed
  • It turns out that Windows reports negative pointer coordinates when the mouse cursor goes beyond the left hand edge of the RetroArch window (this doesn’t happen on Linux, so I never encountered this issue before!). As a result, if Ozone is currently not showing the sidebar (menu depth > 1), moving the cursor off the left edge of the window generates a false positive ‘cursor in sidebar’ event – which breaks menu navigation, as described in #10419. With this PR, we now handle ‘cursor in sidebar’ status correctly in all cases.

(RGUI) Enable automatic menu size reduction when running at low resolutions (down to 256×192)

Before, on all platforms other than the Wii/NGC, RGUI had a fixed frame buffer size of [320-426]x240 (width takes one of three values depending upon current menu aspect ratio).

In most cases this is fine, with an important exception: when running content at its native resolution (usually when connected to a CRT), the display size is often smaller than 320×240. For example, SNES titles run at 256×224; master system titles at 256×192. In these cases, RGUI gets ‘squished’ – there are not enough scanlines on the screen, so rows of menu pixels get dropped (or blurred together if bilinear filtering is enabled). This makes the menu difficult to read/use.

This PR modifies RGUI such that its frame buffer dimensions are automatically reduced when running at low resolutions. The minimum nominal menu size is 256×192, which should enable content for almost all TV-connected consoles to be run at native resolution while maintaining pixel perfect menu scaling.

(Unfortunately, going any smaller than this breaks RGUI – so for handheld systems it’s still best to run at higher resolutions with a shader or video filter)

While implementing this, narrowed down the detection of when the aspect ratio lock should be disabled: currently, RGUI’s aspect ratio lock ‘turns off’ when accessing the video settings menu – this now only happens when accessing the video scaling submenu, since this is the only section that can cause conflicts with the aspect lock method. (Note that the old behaviour is maintained for the Wii port, because it has special requirements relating to resolution changes)

Menu – widget and font improvements

  • The font ascender/descender metrics are now used to achieve ‘pixel perfect’ vertical text alignment
  • Message queue text now uses its own dedicated font. Previously, a single (larger) font was used for all active widgets, and this was scaled down for message queue items. This ‘squished’ the text a little; more importantly, when using the stb font renderers (on Android. etc.) it caused ugly artefacts around the edges of glyphs due to pixel interpolation errors. Now that a correctly sized font is used, the message queue is always rendered cleanly.
  • Previously, each widget font was ‘flushed’ (font_driver_flush()) at least once a frame. This is quite a slow operation. Now we only flush fonts if they have actually been used.

Content scanner was unable to identify games from CHD images on Android builds

The content scanner was unable to identify games from CHD images on Android builds (same files that are being properly identified on Windows builds).

It was discovered that both the extracted magic number and CRC hash differed on both builds. This should now be resolved.

Changelog

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

1.8.6

  • 3DS: Add IDs for UZEM, TGB Dual, and NeoCD
  • 3DS: Fix font driver horizontal text alignment
  • 3DS: Allow button presses up to INPUT_MAX_USERS – this enables the 3DS to bind and use buttons and axis for users up to the maximum set by ‘Max Users’ in the input settings menu.
  • 3DS: Disable video filter if upscaled resolution exceeds hardware limits. The 3DS has a maximum video buffer size of 2048×2048. This is sufficient for every core that it supports, but when using software video filters the core output resolution is doubled. This is made worse by the fact that the video filter upscaling buffer size is dependent upon the maximum output resolution of the core – which in some cases is very large indeed (e.g. pcsx-rearmed sets a maximum width of 1024, for enhanced resolution support). The 3DS has very limited ‘linear memory’ for graphics buffer purposes, and a large base core buffer + video filter buffer can easily exceed this – which may also disable video output, or cause a crash. This PR very simply adds a 3DS-specific check to the video filter initialisation: if the resultant upscaling buffer exceeds the hardware limitation, then the filter is automatically disabled.
  • 3DS/FONT/BUGFIX: Text colour was wrong: the RGBA channels were muddled, and R was always set to 255
  • 3DS/FONT/BUGFIX: When drawing multiline strings, the line spacing was completely incorrect
  • 3DS/FONT: Improves the appearance of the drop shadow effect on notification text.
  • 3DS/ARCHIVE/7Z: Re-enable 7zip support.
  • ARCHIVE/ZIP: Expand functionality of ‘rzip_stream’ interface. This PR expands the functionality of the new rzip_stream archived stream interface such that it now has almost complete feature parity with the standard file_stream interface, and can therefore be used as a drop-in replacement in most situations
  • AI SERVICE: Hide redundant entries when service is disabled
  • AI SERVICE: Added in auto-translate support
  • AI SERVICE: support for NVDA and SAPI narration
  • AUTOCONFIG: Use correct port index in input device configured/disconnected notifications
  • BUGFIX: Fix race condition where task could momentarily not be in the queue when reordering
  • CHEEVOS/BUGFIX: Prevent null reference rendering achievement list while closing application
  • CHEEVOS/BUGFIX: Report non-memorymap GBA cores as unsupported
  • COMMANDLINE: Advise against using -s and -S variables on the command line.
  • CONFIG FILE: Only write config files to disk when parameters change
  • CONFIG FILE/BUGFIX: RetroArch no longer crashes when attempting to save a config file after ‘unsetting’ a parameter (currently, this can be triggered quite easily by manipulating input remaps)
  • CONFIG FILE/BUGFIX: When using Material UI, RetroArch no longer modifies the wrong setting (or segfaults…) when tapping entries in the Quick Menu > Controls input remapping submenu
  • CONFIG FILE/BUGFIX: Quite a few real and potential memory leaks have been fixed.
  • CHD: Fixes a crash caused by ignoring the return value from one of the CHD library functions
    FASTFORWARDING: A new Mute When Fast-Forwarding option has been added under Settings > Audio. When enabled, users can fast forward without having to listen to distorted audio.
  • GLCORE/SLANG: Set filter and wrap mode correctly when intialising shader textures. Before, the glcore shader driver did not correctly initialise loaded textures. The texture filtering and wrap mode were forced on texture creation, but these settings were not recorded – subsequent updates would set garbage values, that would resolve to linear filtering OFF and wrap mode = CLAMP_TO_EDGE.
  • LOCALIZATION: Update Japanese translation
  • LOCALIZATION: Update Spanish translation
  • LOCALIZATION: Update Portuguese Brazilian translation
  • IOS: Set audio session category to ambient so sound does not get cut off on interruption (phone call/playing back audio)
    MAC/IOHIDMANAGER/BUGFIX: Fix for Mayflash N64 adapter. In case last hatswitch does not match cookie. For the mayflash N64 adapter, I was getting a BAD EXC ADDRESS (in mac OS 10.13) for this line (tmp was NULL). Retroarch would crash in the gui if I pressed a button from the DPAD on controller 2. With this change, it no longer crashes in the gui and still registers the button push.
  • MAC/COCOA: Fix mouse input – this brings back two lines of code that have been removed over time but appear to be required in order for mouse input to work on macOS
  • METAL/BUGFIX: GPU capture on Metal/OSX/NVidia could crash
  • METAL/BUGFIX: Taking screenshots could capture black frames. Resulting PNG screenshots were black.
  • METAL/BUGFIX: Corrupted image due to incorrect viewport copy when taking screenshot
  • MENU: Prevent font-related segfaults when using extremely small scales/window sizes
  • MENU: Fix ‘gfx_display_draw_texture_slice()’
  • MENU/FONT: Enable correct vertical alignment of text (+ font rendering fixes)
  • MENU/RGUI: Enable automatic menu size reduction when running at low resolutions (down to 256×192)
  • MENU/OZONE: Update timedate style options for Last Played sublabel metadata
  • MENU/OZONE: Hide ‘Menu Color Theme’ setting when ‘Use preferred system color theme’ is enabled
  • MENU/OZONE: Fix thumbnail switching via ‘scan’ button functionality
  • MENU/OZONE: Prevent glitches when rendering Ozone’s selection cursor
  • MENU/OZONE: Enable proper vertical text alignment + thumbnail display improvements
  • MENU/OZONE: Enable second thumbnail/content metadata toggle using RetroPad ‘select’
  • MENU/OZONE: Refactor footer display
  • MENU/OZONE: Hide thumbnail button hints when viewing file browser lists
  • MENU/OZONE/INPUT/BUGFIX: Fix undefined behaviour when using touch screen to change input remaps
  • MENU/OZONE/INPUT/BUGFIX: It turns out that Windows reports negative pointer coordinates when the mouse cursor goes beyond the left hand edge of the RetroArch window (this doesn’t happen on Linux, so I never encountered this issue before!). As a result, if Ozone is currently not showing the sidebar (menu depth > 1), moving the cursor off the left edge of the window generates a false positive ‘cursor in sidebar’ event – which breaks menu navigation, as described in #10419. With this PR, we now handle ‘cursor in sidebar’ status correctly in all cases
  • MENU/OZONE/INPUT/BUGFIX: Pointer input is now correctly disabled when message boxes are displayed
  • MENU/XMB: Fix thumbnail switching via ‘scan’ button functionality
  • ODROID GO ADVANCE: Add DRM HW context driver
  • PSL1GHT: Initial port
  • PSL1GHT/KEYBOARD: Implement PSL1GHT keyboard
  • PLAYLIST/BUGFIX: Improve handling of ‘broken’ playlists – RetroArch will no longer segfault when attempting to run content via a playlist entry with missing path or core path fields.
  • PLAYLIST/BUGFIX: Improve handling of ‘broken’ playlists – when a playlist entry has either core path and/or core name set to NULL, DETECT or an empty string, attempting to load content will fallback to the normal ‘core selection’ code (currently this happens only if both core path and core name are DETECT – this is wholly inadequate!)
  • PLAYLIST/BUGFIX: RetroArch will no longer segfault when attempting to fetch content runtime information when core path is NULL
  • PLAYLIST/BUGFIX: Core name + runtime info will only be displayed on playlists and in the Information submenu if both the core path and core name fields are ‘valid’ (i.e. not NULL or DETECT)
  • PLAYLIST/BUGFIX: When handling entries with missing path fields, the menu sorting order now matches that of the playlist sorting order (at present, everything goes out of sync when paths are empty). Moreover, entries with missing path fields can now be ‘selected’, so users can remove them (currently, hitting A on such an entry immediately tries – and fails – to load the content, so the only way to remove the broken entry is via the Playlist Management > Clean Playlist feature)
  • PLAYLIST: Add optional per-playlist alphabetical sorting
  • PLAYLIST: Omit whitespace when writing compressed JSON format playlists
  • PLAYLIST: Add optional playlist compression
  • QNX: Support analog sticks
  • SAVESTATES: Add optional save state compression (enabled by default now)
  • SRAM: Add optional save (SRAM) file compression
  • SCANNER: Prevent redundant playlist entries when handling M3U content
  • SCANNER/ANDROID: Fix content scanner being unable to identify certain games from CHD images (raw data sector/subcode)
  • TASKS/BUGFIX: Fix task deadlocks
  • TASKS/SCREENSHOT/BUGFIX: Fix heap-use-after-free error when widgets are disabled
  • TVOS: Disable overlays for tvOS, fix app icon
  • VIDEO/WIDGETS/BUGFIX: The font ascender/descender metrics added in #10375 are now used to achieve ‘pixel perfect’ vertical text alignment
  • VIDEO/WIDGETS/BUGFIX: Message queue text now uses its own dedicated font. Previously, a single (larger) font was used for all active widgets, and this was scaled down for message queue items. This ‘squished’ the text a little; more importantly, when using the stb font renderers (on Android. etc.) it caused ugly artefacts around the edges of glyphs due to pixel interpolation errors. Now that a correctly sized font is used, the message queue is always rendered cleanly.
    VIDEO/WIDGETS/BUGFIX: Previously, each widget font was ‘flushed’ (font_driver_flush()) at least once a frame. This is quite a slow operation. Now we only flush fonts if they have actually been used.
  • VULKAN/BUGFIX: Fix display of statistics text
  • UNIX/BUGFIX: Fix overflow when computing total memory on i386
  • WIIU/BUGFIX: Fix font driver horizontal text alignment
  • WIIU/BUGFIX: Fix non-vertex coordinates in draws using tex shader
  • WIIU/BUGFIX: Update and fix meta.xml file for the WiiU release. This change makes it so the information from the meta.xml file parsed for the WiiU’s Homebrew Launcher is displayed properly.

Kronos 2.1.2 progress report (Sega Saturn emulator)

It has been some time since the last report, let’s try to go a bit more in-depth this time.

The OpenGL CS video renderer

The Saturn is a beast. It features 8 processors, among them are 2 custom graphics processors called VDP1 and VDP2. The VDP2 handled backgrounds, while the VDP1 handled sprites, textures and polygons.

The VDP1 was rendering “quads” line per line, the general idea was to interpolate endpoints along the horizontal edges, then to draw textured lines between those endpoints. It had to draw the lines with an extra pixel where the slope changed, so all of the pixels had a neighbor to the left, right, top, or bottom. They did this to prevent gaps between the lines.

A modern graphics APIs like OpenGL doesn’t know how to do that, because its rendering pipeline is based on triangle geometry, so basically it can’t reproduce VDP1 behavior. There are tricks like tesselation, but ultimately they are just workarounds for specific issues and not all-in-one solutions for this. Here is some good news though : with OpenGL 4.3, a new feature called compute shaders was introduced, you might have heard about it through Flycast’s order independent transparency, or N64’s parallel, this new component gives lots of flexibility to OpenGL, and allows the implementation of routines to render quads line per line. It is what this renderer is about : reproducing VDP1 behavior accurately.

Let’s do some comparison, from first to last, those images were shot from console, Mednafen/beetle, Kronos (OpenGL CS renderer), Kronos (the old OpenGL renderer, based on YabaSanshiro’s). There are 2 things noticeable related to this VDP1 behavior in those :

  • border of the road : on console, Mednafen and Kronos’s new renderer, if you zoom in, you’ll notice it’s not a smooth line, there are dots, this is the accurate behavior; the last screen, while the smooth line might look better, is actually inaccurate.
  • holes everywhere : if you zoom in on the last screenshot, you’ll notice some holes here and there, on the top of the hills, on the road in the back, those holes don’t exist on the other screenshots.

It’s possible to workaround those holes with the OpenGL renderer, but at the end of the day you end up creating other issues in the process. Until recently we used such workaround but, in the case of Sega Rally, it was magnifying the dots on the border of the road.

The only known downside of this new renderer is that it will require a fairly good GPU!

ST-V support was improved

While still a bit preliminary, some major rework was done recently on ST-V support :

  • You can now set your favorite bios region (NB : it will be ignored if the game doesn’t support that region though)
  • The EEPROM is now properly saved and loaded
  • ROM loading mechanism was fixed, there should be no more messages of the ST-V bios telling you there is something wrong with the game you are trying to launch
  • Lots of input issues, going from the lack of kick harness (used for 5th & 6th buttons on some games) to the inputs not responding at all, were fixed

Improvements on the Libretro port

There were some long-term issues with the Libretro implementation, but a lot of improvements were done about them :

  • Resolution switching, which is something that happens every few seconds on saturn, was somehow wrong, one of the worst side effect was artifacts especially visible in “mesh” (if you don’t use the “improved mesh” core option), it was fixed
  • Toggling between fullscreen and windowed was causing issues from glitches to crashes, it has been mostly fixed
  • While the saturn framerate should be 50 or 60 fps depending on the region, sometimes it’s not rendering anything because the Saturn is actually shutting down its video output, kronos is trying to have an accurate behavior for this too, which is a bit of a headache for the libretro ecosystem which is expecting a more linear framerate. A better way of handling this was implemented.

Also, here is a summary of this core’s options :

  • Force HLE BIOS : it will ignore your bios file and use the old HLE bios from yabause instead, this function is unmaintained and is mainly there for debugging purpose (there is at least one known case where it’s unlocking the game though : Astal, for some reason the real bios is shutting down the video output), don’t report issues if you enabled this option.
  • Video format : will force format to PAL or NTSC, default is auto
  • Frameskip : will skip rendering at a fixed rate, it can improve playability dramatically on lower end devices
  • SH-2 cpu core : default is “kronos”, our cross-platform cached interpreter, the other one is the unmaintained yabause SH-2 interpreter, we got the same policy than the HLE bios about it.
  • OpenGL version : this option was introduced as a workaround for setups giving false positive when asking if a specific OpenGL version was supported (it happened…), set this to the highest version your gpu support.
  • Video renderer : to enable the new renderer, default is the old one for compatibility reasons
  • Share saves with beetle : will share save paths with beetle-saturn, allowing you to use the same savefiles.
  • Addon cartridge : to change cartridge, default is auto, it is recommended to let the default except if you intend to play heart of darkness, a prototype requiring the 16M extended RAM.
  • 6Player Adaptor on Port 1 : self explanatory
  • 6Player Adaptor on Port 2 : same, one word of warning though, enabling the second multitap is known for causing a weird autofire behavior.
  • Internal Resolution : self explanatory
  • Polygon Mode : works with the default OpenGL renderer, used to fix wobbling textures issues, OpenGL CS doesn’t need this, default is cpu tesselation but gpu tesselation is recommended if your gpu supports it (OpenGL 4.2), perspective correction is more cpu friendly but heavily glitched.
  • Improved mesh : will replace fake transparency (mesh) by real transparency, default is disabled
  • RBG Compute shaders : will use compute shaders to rotate background, it is recommended if your gpu supports it, default is disabled
  • Wireframe mode : self-explanatory ? It works only with OpenGL CS, mostly for debugging but can be a fun feature, give it a try for curiosity !
  • ST-V Service/Test Buttons : enable buttons to access service menu in ST-V game, default is disabled to avoid misspress
  • ST-V Favorite Region : select your region for ST-V, default is EU for censorship and language reasons.

On a sidenote, lots of other things were fixed/improved since my last report, but nothing seemed major so we decided to skip them. If you want to know more about this emulator, you can check the youtube channel, or join us on discord.

Libretro Cores Progress Report – April 2, 2020

Our last core progress report was on February 29, 2020. Below we detail the most significant changes to all the Libretro cores we and/or upstream partners maintain. We are listing changes that have happened since then.

How to update your cores in RetroArch

There are two ways to update your cores:

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 the core from the list that you want to install.

Final Burn Neo

Description: Multi-system arcade emulator

  • Latest updates from upstream

blueMSX

Description: Home computer MSX emulator

  • Fix not smooth scroll in PAL 50Hz
  • Buildfix for libnx (Switch)
  • Buildfix for 3DS

Beetle PSX

Description: Sony PlayStation emulator

  • Added “fast PAL” hack to allow PAL games to play at NTSC framerates
  • Added Force NTSC aspect ratio
  • Vulkan: Disable adaptive smoothing by default

    This should be disabled by default like the other Vulkan-exclusive
    enhancements so as to better match stock settings

  • Hide scanline core options based on content region
  • Refactor memory card core options logic

    Get rid of confusing check_variables() memcard startup logic and
    corresponding redundant variables, and update core option
    labels/sublabels to match actual core functionality.

  • Implement aspect ratio core option (psx.correct_aspect equivalent)

    Beetle PSX implementation of “psx.correct_aspect” introduced in Mednafen
    1.24.0-UNSTABLE (no relevant code backported from upstream).
    Additionally fixes aspect ratio scaling issues when cropping overscan or
    adjusting visible scanlines. “Force 4:3” is left as a legacy option for
    users preferring the old inaccurate behavior.

  • Add option for setting core-reported FPS timing
  • WIP: increase RAM to 8MB instead of the default 2
  • Improve internal FPS detection

Vitaquake 2

Description: Quake 2 game engine core

Vitaquake 2 is now available for the first time on Emscripten.

Hatari

Description: Atari ST/STE/TT/Falcon emulator

  • Port: Ported Hatari to PS Vita

Atari 800

Description:

  • Port: Ported Atari 800 to 3DS

Dosbox core

Description: MS-DOS home computer emulator

  • Latest updates from Github

Dosbox SVN

Description: MS-DOS home computer emulator

  • Latest updates from Github
  • Make 16MB RAM default, change default cycle mode to “fixed” and “10000”

    Max and auto modes are broken on some systems.

LRMAME

Description: Multi-system arcade emulator

  • Updated to version 0.219

ECWolf

Description: Wolfenstein 3D game engine core

  • Latest updates (TODO/FIXME)

Flycast

Description: Sega Dreamcast emulator

  • fix alignment issues reported by ubsan on x64
  • Fix chd lzma and zlib buffers alignment
  • Fix rec/x64 block check alignment
  • Fix ChannelEx struct alignment
  • nvmem: generate console ID at startup. rec-x64: Call stack alignment

    Generate console ID in dc_nvmem.bin if blank. Used by chuchu rocket
    login.
    Align stack to 16-byte when calling function from x64 rec

  • (NAOMI) add sfz3ugd button labels
  • (NAOMI) Alien Front Naomi needs DIV matching disabled
  • (NAOMI) VMU support (vonot, sf3zu). Fix otrigger inputs.
  • input: only use R2/L2 for trigger input even with digital triggers
  • renderer: generate mipmaps for custom textures
  • custom texture: stop loader thread before loading state
  • renderer: decrease MipmapD bias – fixes street lights in Sonic Adventure 1
  • gdrom: don’t resume CDDA if not playing. stop if cur > end – implement ATA_IDENTIFY
  • Protect RAM and VRAM when VMEM is disabled
  • (Switch) Initial Port
  • ta: defer index building and strip merging, filter out infinite vertices
  • pvr: reserve more opaque polys. Don’t crash on TA overrun
  • vmem: unprotect vram when releasing memory if NO_VMEM
  • (Switch) Iterate each Page for Permission set
  • Use -O2 for YUV_Block8x8 due to UB
  • pvr: don’t reset tile clipping value on each frame – Fixes Irides – master of blocks
  • support multi-session cue/bin. mipmap D-adjust only to increase LoD
  • limit maple schedule time
  • allow VRAM 8-bit reads
  • gl: use common ReadFramebuffer() func
  • sort triangles even with 1 polygon – fixes missing Naomi boot logo and vtennis2 black frame during replay
  • fix crash when TR poly count is 0

ChaiLove

  • Port: Ported ChaiLove core to 3DS
  • Port: Ported ChaiLove core to Android

HBMAME

Description: Emulator of homebrew and hacked games for arcade hardware

  • New core

VICE

Description: Commodore 64 home computer emulator

  • Split “Paddles” joyport type to first two RetroPads:
    Player1 vertical axis = Player2 horizontal axis
    Player1 2nd button = Player2 1st button
    Add speed modifier hotkeys (slower+faster) for paddles/mouse

    Because “Paddles” is in fact 2 controllers in one joyport, and currently it is read like a mouse with 2 axis and 2 buttons, this is not convenient for 2 player games, like Panic Analogue, which use paddles as 2 separate entities with one axis and one button.

  • Fixes for JiffyDOS, Disk Control & Statusbar –

    To evade JiffyDOS incompatibilities with CRTs, PRGs & TAPs, the allowance method is changed from whitelist to blacklist.
    Also M3U playlists of D64 images will allow, and playlists of TAP images will not
    Fixed not being able to insert disks at all when starting without content
    Drive type defaults to 1541, as in inserting D81s will not work for now, because drive type autodetection happens only on autostart
    Finetuned statusbar

  • Turbofire & JiffyDOS fix –
    Minor fixes:

    Turbofire pulse was off (value 2 was actually 4)
    No reason to allow JiffyDOS core option with anything other than D64 & D81, or is there..?

  • Remove Nuklear GUI, Add VKBD touch control –
    Replaced bloaty Nuklear with the lightweight VKBD from PUAE

    No drawbacks, only benefits: Touch control, better performance, simpler maintenance

  • Port: Fixed VICE core Android build
  • Port: Ported VICE core to 3DS
  • Port: Ported VICE core to Emscripten
  • Add support for disk control interface v1 (disk display labels)
  • x64: Exclude vicii-clock-stretch.c – vicii-clock-stretch.c is not really used on x64, it’s only for x128
  • Disable cpmcart on x128 –
    Both x128 and cpmcart have z80 cpu and both have z80_regs symbols.
    On platforms other than emscripten those symbols end up being aliased
    due to “-fcommon” behaviour. This would lead to very weird results if they
    would ever be used together.

    On real hw cpmcart is unnecessarry due to integrated CP/M mode

    In the emulator cpmcart is runtime-enable only on x64 and x64sc but
    the relevant code is still compiled-in.

    So just remove cpmcart.c and #ifndef to avoid references

  • Core option for disabling autostart joined with autostart warp
  • Statusbar improvements, VKBD transparency core option

GME

Description: Game Music Emulator core

  • Port: Ported GME core to PSL1GHT (PS3)
  • Port: Ported GME core to 3DS

prBoom

Description: Doom 1/2 game engine core

  • retro_run: Don’t attempt to run domm lop after exit – This fixes crash on exit on 3DS
  • Port: Added PSL1GHT port (PS3)

MelonDS

Description: Nintendo DS emulator

  • (Switch) Latest updates

P-UAE

Description: Commodore Amiga emulator

  • VKBD updates, CD turbo speed backport
  • WHDLoad changes (button overrides)
  • VKBD touch control –
    Only tested with Windows and mouse, since RETRO_DEVICE_POINTER also reacts with it. Hence also disabled real mouse control while VKBD is visible.
  • Port: Ported P-UAE to PSVita
  • Minor save state improvements
  • Extended ZIP support

ScummVM

  • Update to ScummVM 2.1.1
  • Allow launching games directly from game files

Mr. Boom

Description:

  • Port: Ported Mr. Boom to 3DS
  • Port: Ported Mr. Boom to Emscripten
  • Port: Ported Mr. Boom to PSP
  • Port: Ported Mr. Boom to PS Vita
  • Port: Ported Mr. Boom to Apple tvOS
  • Fix unaligned casts

FCEUmm

Description: NES emulator core

  • Fix unable to load some unif carts
  • M274 update
  • Add 42-in-80000 multicart (m380)
  • Add mapper 389 (Caltron 9-in-1)
  • BMCFK23C – update
  • Fix default palette
  • Add Mortal Kombat Trilogy – 8 People (M1274) (Ch) [!].nes to ines-cor…
  • Merge unif board BMC-Super24in1SC03 to BMC-FK23C
  • M176: Minor tweak to chr mixed ram/rom logic check and others
  • Simplify dipswitch options for Nintendo World Championships 1990 cart
  • MMC3: Make sure to free any allocated memory when using MMC3 as an external module
  • Misc mapper updates
  • m269: Move chr unscrambling to mapper init
  • Unif: Show raw values for prg/chr rom size in logs
  • Remove unneeded code in BMC-Super24in1SC03
  • Remove duplicate code in bmc-fk23c
  • Rewrite BMC-FK23C/A (m176) based on updated notes and testing
  • Fix incompatible pointer type warning
  • Add 168-in-1 New Contra Function 16 to ines-correct.h
  • unif.c: Align board map struct
  • ines.c: Cleanup mapper struct and iNESLoad()
  • Fix unterminated savestate struct
  • Update mapper 79
  • vrc2and4: Fix mapper 22 games not working (regression) and refactoring
  • Update ines-correct.h

The Powder Toy

Description: Game engine core

  • Port: Ported The Powder Toy to 3DS

PocketCDG

Description: MP3 Karaoke audio player

  • Eliminate too verbose output – On 3DS stderr is printed on lower screen and is slow. This messes up the
    performance completely.

Picodrive

Description: Sega Megadrive/Genesis/32X/CD emulator

  • Add option to change sound quality – Even with the fast renderer (#116), the framerate on the PSP slows down at some points in some games. Reducing the sound rate can help increase the framerate in these cases.

    It’s not ideal but it’s better than frame skipping. [bmaupin]

VBA-M

Description: Game Boy Advance emulator

  • Fix Save Failed error for Super Monkey Ball Jr.

gpSP

Description: Game Boy Advance emulator

  • [3DS] Fix dynarec prefetch aborts
  • Add automatic frame skipping

Frodo

Description: Commodore 64 emulator

  • Support running without ROM

PX68K

Description: Sharp X68000 Emulator

  • Prevent simultaneous up+down / left+right button presses

Lutro

Lutro now runs on the 3DS.

Snake runs at 60 fps
Platformer runs at 20 fps

  • (3DS) Fix build
  • (Switch) Fix build