Development Plan – March 13, 2023

A new concept we’re going to try, we’ll see if it lasts. Expect irregular blog posts like this, whenever something is on our mind that we want to share. It’s basically like a development diary where we discuss future plans for upcoming versions and what we have been thinking about doing.

Raising the lowest common denominator

RetroArch pushes the concept of backwards compatibility to an absolute extreme. It’s one of our definite pet peeves and something we’re quite proud of. The degree to which we push this is quite irregular in the modern day software industry but we believe it differentiates us from the rest of the pack, and in a good way.

That being the case, recently we believe that in order to improve the out of the box enduser experience, it is perhaps necessary to start making some general baseline assumptions on what endusers realistically are using in terms of hardware. Let’s explain what is behind this idea.

The Steam Mac version was a good opportunity for us to establish some minimum baseline system requirements to make sure that RetroArch on Mac would run well out of the box.

We provide two macOS versions right now (because we are as ever all about being backwards compatible):

  • Main version is the High Sierra build (10.13 and later). We also call this the Metal/GL universal build. This build has OpenGL, Metal and Vulkan/MoltenVK drivers, it has slang shader spec support, and is generally considered the most full-featured build.
  • Second version is the Lion (10.7 and later) version. This is a more pared-back, stripped-down version. It provides OpenGL (3.2 core context) support (because Lion was the first macOS version to support OpenGL 3.2 and higher). It does not provide Vulkan or Metal driver support because of the minimum OS requirement.
  • Well, technically, there is a third version. This is a PowerPC version targeting macOS/OSX 10.5. It has OpenGL (up to 2.x) support. This build is not provided by our buildbot right now as our buildbot infrastructure lacks the development tools to build it. It might be introduced at a later undisclosed date.

Steam on macOS requires you to have at least macOS El Capitan (10.11) installed or later. It does not support anything lower. This meant that we could go with our Metal/GL universal build that targets macOS High Sierra (10.13). In doing so, we could reasonably assume that the Macs capable of running this OS should have at least a GPU with support for the Metal 2 graphics API. This allows us to just set the default video driver to Vulkan, which should guarantee a high level of performance and also compatibility with cores that provide a Vulkan hardware context.

The current Vulkan MoltenVK implementation in RetroArch Mac is actually quite a bit faster than the native Metal video driver right now. Perhaps it hits more optimal codepaths in the MoltenVK implementation because the Vulkan video driver is more well optimized than the Metal one. This is all of course speculation. Other nice things that came out of the Vulkan driver being supported on Mac is that we provide HDR support now on Mac for the Vulkan driver.

Anyway, onto the point. Currently, there are 5 different Windows versions.

  • Main version – compiled with MSYS2/Mingw. We consider this the Windows 11/10/8/7 version. This is the most full-featured build. It has Vulkan/OpenGL/D3D11/D3D12/D3D10/D3D9 video driver support, it has slang shader support, it has a builtin ffmpeg core, and it has the Qt5-based desktop UI builtin.
  • 2nd version – the UWP version, compiled with either Visual Studio 2017, 2019 or 2022. The UWP (Universal Windows App) build is more feature limited than the regular Windows build, but it does have Direct3D 11/12 support and slang support. It does not have Vulkan video driver support. OpenGL support is dependent on ANGLE and is spotty, it is used by cores as a last resort when a Direct3D 11 renderer is not available instead. The UWP app can be used on Windows 8/10/11, and Xbox One/Series consoles.
  • 3th version – Windows Vista/XP build, compiled with Visual Studio 2010. Features are more limited than the main version. Other limiting factors: because Visual Studio 2010 has partial/incomplete C++11 language support (called C++0x at the time), this version does not have the Vulkan video driver or slang support (the latter relies on SPIRV-Cross/GLSLang, both C++11 code). The Windows Vista/XP build does have Direct3D 9 and OpenGL (2.x) support.
  • 4th version – Windows 2000 / ME / 98SE build, compiled with Visual Studio 2005. This version is even more stripped back than the Windows Vista/XP build, but sacrifices are necessary so that we can target these obsolete/ancient OSes. Other limiting factors in terms of featureset is of course the complete lack of C++11/C++0x language support in Visual Studio 2005.
  • 5th version – Windows 98 / 95 build, compiled with Visual Studio 2003. This is the most pared back version of them all. We currently haven’t provided any builds of this version since 2020 since our current buildbot infrastructure lacks a Visual Studio 2003 compiler. Maybe it will come back one day.

Right now, all these versions (except for the UWP version, which has ‘d3d11’ as the default) fallback by default to the ‘gl’ video driver. ‘gl’ is the first OpenGL-based video driver that was written for SSNES/RetroArch. It targets OpenGL 2.x on the desktop and OpenGLES 2 for mobile, and it can use the (now considered deprecated) ‘glsl’ shader spec.

There are several problems with defaulting to ‘gl’ by default:

  • There are now more modern OpenGL drivers in RetroArch, such as ‘glcore’, which targets OpenGL 3.2 Core and higher.
  • Spotty OpenGL driver support for some video cards/GPUs. OpenGL support on Windows for vendors is often an afterthought. The most egregious example is probably Intel for some of their iGPUs, where the only OpenGL version supported is ancient OpenGL 1.1 (literally late ’90s). This means that you have to resort to ‘gl1’ and lose a ton of features that you’d have access to with ‘gl’ or ‘glcore’.
  • Direct3D support can generally be assumed to be better for most video cards/GPUs compared to OpenGL. Especially the case for AMD and Intel.

Defaulting to ‘gl1’ by default would be most ‘compatible’ but it’d really severely limit the out of the box featureset that the general user can use, so this is simply not a good option.

We therefore had the following idea: we can assume that the ‘main version’ is going to run on at least Windows 7 and later, because MSYS2/Mingw-w64 versions as of now only targets Windows 7 as a minimum OS. Therefore, we can raise the lowest common denominator a bit. We can reasonably assume that a system running Windows 7 has at least a DirectX11-class GPU. Therefore, the ‘main’ Windows version from now on will start defaulting from ‘gl’ to ‘d3d11’. This has various benefits:

  • HDR support out of the box
  • Better compatibility with most GPUs
  • Slang shader support, the cross-GPU shader spec that we want everyone to use (instead of deprecated glsl spec)

Do note, that compatibility with cores that rely on OpenGL will not be an issue, because RetroArch has the ‘auto switch video driver per core’ enabled by default. So you won’t lose anything in the process when you need to start up a core that requires OpenGL.

We believe that in making this change, the default out of the box experience for a new user starting RetroArch for the first time will be much better. The few users that will encounter difficulties because their GPU does not meet the DirectX 11 requirements could force the video driver to ‘d3d10’ manually by simply editing retroarch.cfg, but we don’t expect there to be many. We figure that the people who would have problems with ‘d3d11’ would have the same issues with ‘gl’ regardless.

It’s always good of course to cast a very wide net when it comes to hardware backwards compatibility, but considering DirectX 11 was released in 2009/2010, we can consider that people running a main build targeting at least Windows 7 should at least have a GPU that can support a 13-year old graphics API.

The next step in defaulting to some more practical default settings for modernday hardware is probably going to be defaulting to XAudio 2.8 / 2.9 for the main Windows build. Right now we use XAudio 2.7. The benefit of XAudio 2.7 is that it is the most backwards compatible way of implementing XAudio2. However, it requires you to install the old deprecated DirectX 9 SDK, which doesnt come installed by default on modern Windows versions. Windows 8 started providing XAudio 2.8 DLLs by default, and Windows 10 started providing XAudio 2.9 DLLs by default. So what we are going to do probably at startup is determine if we are running Windows 8 or higher, and if so, try to use XAudio 2.9 first. If it doesn’t succeed, try XAudio 2.8. We will have to create at least a second new Xaudio driver for this, so that we retain backwards compatibility for Windows 7 and older OSes. They will have to resort to XAudio 2.7 still.

Do note that all Windows versions prior to Windows 7 will continue to work as expected. We are mainly talking here about the main MSYS2/Mingw-w64 build, which has Windows 7 as a minimum OS.

Also, don’t be concerned, you will still be able to use the OpenGL and Vulkan drivers, or even Direct3D 10 or 12. We are only talking here about the ‘video driver’ which is going to be used at first startup.

RetroArch 1.15.0 release


RetroArch 1.15.0 has just been released.

Grab it here.

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

Remember that this project exists for the benefit of our users, and that we wouldn’t keep doing this were it not for spreading the love to our users. This project exists because of your support and belief in us to keep going doing great things. We have always prioritized the endusers experience, and unlike others, we have never emburdened them with in-app ads, monetization SDKs or paywalled features, and we intend to continue to do so. If you’d like to show your support, consider donating to us. Check here in order to learn more. In addition to being able to support us on Patreon, there is now also the option to sponsor us on Github Sponsors! You can also help us out by buying some of our merch on our Teespring store!

NOTE: Our upcoming Libretro Core Progress Report (January 2023 – March 2023) article will arrive later.

RetroArch is now available for Mac on Steam!


Thanks in large part to the hard work of warmenhoven, RetroArch for Mac is now on Steam! Get it here.

Minimum system requirements:

  • Your Mac should be running macOS 10.13 (High Sierra) or later. It is technically possible to try to run it on a version as low as macOS 10.11 (El Capitan), but in order to use it with all features reliably working we’d recommend 10.13 or later.
  • Your GPU should at least support the Apple Metal 2 graphics API. This is because Vulkan is the default video driver, which in turn relies on MoltenVK. MoltenVK is a Vulkan to Metal abstraction layer which converts Vulkan API calls to Metal. Therefore, a GPU that supports the Metal graphics API is essential for an optimal out of the box experience. Thankfully, most Macs produced in the past 10 years should be able to meet this requirement. If you want to know if your Mac meets the minimum Metal requirements, refer to this page here. TLDR – you should be good to go with a Mac that came out mid 2012 or later.

We’re very proud that RetroArch is now available on Steam on all three major OS platforms: Windows, Mac and Linux. Not only that, all but one of the cores (58 as of this writing) are fully compatible for Mac.

We went the extra mile and made sure to support both the old and new generation of Macs. Therefore, we support both CPU architectures: Intel x64 based systems and the newer Apple Silicon/ARM architecture. So on newer Apple Silicon Macs you’re getting a native version of RetroArch and any core DLC. No Rosetta2 translation layer overhead in this case.

General improvements to the Mac version

The Mac version is in a much better state now compared to the last stable. Here is what has been worked on since 1.14.0:

  • We now support Apple’s native Gamepad protocol MFi. You can hook up and attach DualShock4 or DualSense controllers and it will seamlessly work.
  • The ‘10.13 and later’ version of RetroArch Mac now supports both OpenGL and Metal. It is no longer necessary to have separate versions if you want to use some core which only provides an OpenGL renderer and no Metal/Vulkan renderer.
  • There is now a Vulkan video driver. And Libretro cores that use Vulkan as a hardware context are also supported, such as SwanStation, Beetle PSX, Mupen64Plus Next (ParaLLEl RDP), and more!
  • The Vulkan driver is HDR capable, and you can setup the colors to your liking from within the Video HDR menu.
  • We also provide the ‘glcore’ video driver now. This targets OpenGL 3.2 core context. macOS versions since 10.7 should provide support for this. Previously we would only provide the ‘gl2’ video driver which is OpenGL 2.x. Main benefits of the ‘glcore’ video driver in comparison to ‘gl2’ is that the glcore video driver supports slang shaders while ‘gl2’ doesn’t and is stuck with the older, deprecated GLSL shader spec. Moving forward we recommend people to move to slang shaders. It is compatible across video drivers unlike the GLSL shader spec.
  • Various serious bugs/crashes have been fixed that affected the Mac version previously.

We have made the decision to default the Metal Universal build to the Vulkan video driver. It is currently running faster than the native Metal video driver, has HDR support, and it allows several Vulkan-accelerated cores to run on macOS. What this means is that your macOS should be at least El Capitan (macOS 10.11) or later, and preferably High Sierra (macOS 10.13 or later). Of course, if you don’t meet the minimum OS requirements, there is always the non-universal build, which should only require macOS/OSX 10.7 as a minimum OS.

Other big improvements for Apple users

Lots of Quality of Life changes have been made across the board which benefits all Apple devices – tvOS, iOS, macOS, you name it.

  • Mupen64Plus Next is available again for iOS, tvOS and macOS. GLideN64 (an OpenGL 3.x based renderer) should work on the Apple platforms. And in addition to this, ParaLLEl RDP/RSP should also work now on the Mac, thanks to the new Vulkan support! We have tested Super Mario 64 running on a Macbook Pro 2019 (Intel) and had no problems running it at fullspeed at 4x internal resolution. Same with a Macbook Pro 2020 (M1). And on a Macbook Pro M2 2023, 8x should be no problem at all.
  • SwanStation is available macOS. We can confirm that the Vulkan renderer has been tested on macOS and is known to be working.
  • Flycast is available for macOS. We can confirm that the Vulkan renderer has been tested on macOS and is known to be working.
  • PPSSPP is available for iOS, tvOS and macOS. We can confirm that the Vulkan renderer has been tested on macOS and is known to be working.

Shader stacking

There are two big new additions to the shader system that are transformative.

You can now:

  • Append shader presets
  • Prepend shader presets

Basically, you can stack shader presets now on top of each other. In other words, you can mix various shader presets, and then save it as a new preset. This gives the user a level of customization that was simply not possible before. You could for instance combine a CRT shader with a VHS shader and create all sorts of interesting effects.

How well these shader combinations run on your system is entirely dependent on the capabilities of your GPU.

There are also other interesting additions that shader developers in particular might want to know about. Learn more about that here.

New alternative to runahead – preemptive frames

Runahead is a method that was first introduced in RetroArch before it got adopted by other emulators. It has the potential to drastically reduce latency, even being able to go below the native latency that a console and a CRT would be capable of. However, like any system, it also has its own drawbacks and deficiencies. Biggest one being steep performance requirements and (so far) no hardware context support (so cores that currently rely on OpenGL/Direct3D11/Vulkan are a no-go).

RetroArch 1.15.0 now debuts a new alternative system to runahead – preemptive frames. It works by rerunning core logic to “rewrite history” before the current frame. Frames are only rerun when the controller state changes.

A quick example of the performance difference between runahead and preemptive frames (tested on a Core i9 13900K):

Core FPS (with Runahead) FPS (with Preemptive frames)
Snes9x 2010 Donkey Kong Country 2 ~1963fps – 3 frames ~2400fps – 3 frames

Your mileage may vary on your own system. Of course, runahead still exists as well, and you can decide for yourself which system is best for you with any random game/core.

Other changes

There are other big changes that we unfortunately lack the time to properly describe in full detail. So in conclusion, read the changelog below for full details on everything that has been changed/added/fixed.

Changelog

1.15.0

  • AI SERVICE: Fix NVDA switching to Powershell on speak
  • ANDROID: In Android builds, add input_android_physical_keyboard configuration option and its corresponding menu entry to force a device to act as a physical keyboard. When running on Android, RetroArch considers most devices that emit dpad events as gamepads, even if they also emit other keyboard events; this is usually the right thing to do, but it has the side effect of not letting some actual keyboards (e.g.: Logitech K480) act as such inside RetroArch. This configuration option allows users to manually select a specific input device to act as a physical keyboard instead of a gamepad, which is handy when emulating computers as opposed to consoles.
  • APPLE: Add App Category to a few places it should have been
  • APPLE/MFI: Prevent crash when controller player index is unset (-1)
  • AUTOMATIC FRAME DELAY: Helped delay to decrease easier when it should and helped delay to stay put when it should when triggering pause & menu with or without pause & fast-forward & slow-motion & geometry change
  • AUTOMATIC FRAME DELAY: Recalibrate delay on video reinit (fullscreen toggle and such)
  • AUTOMATIC FRAME DELAY: Show (x effective) only in menu item and not in dropdown list items when auto is enabled
  • CHEEVOS: Allow repositioning of RetroAchievement notifications
  • CHEEVOS/MENU: Add Achievements Visibility submenu option
  • CHEEVOS/MENU: Startup Summary split off from Verbose Mode, added option to hide for games with zero core cheevos
  • CHEEVOS/MENU: ‘Unlocks/Mastery’ split into two options
  • CHEEVOS/MENU: ‘Account/Login Messages’ split off from ‘Verbose’, gated all login success/error messages
  • CONFIG/INPUT: Unload restores current global config
  • CONFIG/INPUT/OVERRIDES: Removing a file does not unload current override
  • CONFIG/INPUT/OVERRIDES: Saving an empty override removes the file if it exists, and won’t save when it does not
  • CONFIG/INPUT/OVERRIDES: Prevent the use of RUNLOOP_FLAG_OVERRIDES_ACTIVE with appendconfig
  • CORE OPTION: Core option setting type checks. Added checks for getting and setting core option type, since otherwise there will be a crash on close content after browsing to core option categories. Also fixed the no-show switch icon for lone wolf “Lock Installed Core”.
  • CLI: Update selected save slot when start with cli –entryslot
  • CLI: Decouple config CLI append and config overrides
  • CLI/MENU/XMB: Stop showing bogus previous icon on CLI launch
  • D3D9: Fixed display driver scissoring implementation – can now accept 0 width/height
  • D3D10: Fixed display driver scissoring implementation – can now accept 0 width/height
  • D3D11: Fixed display driver scissoring implementation – can now accept 0 width/height
  • D3D11: Fixed build when HAVE_DXGI_HDR is not defined
  • D3D11: Moved waitable swapchain waiting to happen always even when resizing swapchain
  • D3D12: Fixed display driver scissoring implementation – can now accept 0 width/height
  • D3D12: Fixed window scaling issue, which was caused by swapchain resize function not using the same flags (waitable swapchain) as swapchain creation
  • D3D12: Fixed swapchain scissoring issue (visual + crash) after manually resizing window to smaller size
  • D3D12: Fixed eventual crashing issue on video reinit when swapchain is being freed
  • D3D12: Moved waitable swapchain waiting to happen always even when resizing swapchain
  • EMSCRIPTEN: Add HAVE_PATCH support for Emscripten
  • EMSCRIPTEN: Add BSV/Replay support for Emscripten
  • EMSCRIPTEN: Add command and stdin_cmd features to emscripten RA. update libretro.js to show how commands could be sent over emscripten stdin.
  • FRAME DELAY/MENU: Show Frame Delay without VSync
  • GENERAL: Start unpause restriction. Limit the feature using retropad start button to unpause RA to the setting it was made for; “pause on controller disconnect”.
  • GENERAL: Savestate thumbnail aspect ratio fallback. Thanks to at least one certain core that announces aspect ratio as 0, we have to add the same fallback in savestate thumbnails that is happening elsewhere in normal video driver use anyway.
  • GENERAL: Add support for system subdirs per core/database. Added the trivial and graceful automatic ability to send a different system directory to cores if it exists, for keeping the system dir more sane. First by using the core/library name just like in configs and saves, and then by playlist name, like in thumbnails, and of course default to the current global system dir.
  • GENERAL: Ignore system subdir replacement if subdir has subdirs.
  • GENERAL: Restore cached video driver always on quit
  • IOS: Include ‘Update Core Info Files’
  • IOS: Fix #14778 – In addition to sending logs to asl_client, add them to the logfile.
  • IOS/VULKAN/MOLTENVK: Vulkan video driver on iOS
  • LATENCY/PREEMPTIVE FRAMES: Add Preemptive Frames to Latency Settings. RunAhead alternative that reruns core logic to “rewrite history” before the current frame. Frames are only rerun when the controller state changes, so it’s faster overall.
  • LATENCY/PREEMPTIVE FRAMES: Call retro_run before retro_serialize (#14893). Fixes preemptive frames not starting up with a few cores
  • LOCALIZATION: Updates
  • LOCALIZATION: Enable localization of video rotation, orientation, and aspect ratio option values.
  • LOCALIZATION: Mixer stream localization also added
  • LOCALIZATION/MENU/HELP: Context dependent help text for audio and video drivers. Language corrections
  • LOCALIZATION/MENU/LANGUAGE: Language submenu now shows the progress of translated strings for each language.
  • LOCALIZATION: Help texts now localizable through Crowdin.
  • LIBRETRO: Enable RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME for libretro-video-processor
  • LIBRETRO/HW: Add GET_HW_CONTEXT_NEGOTIATION_INTERFACE_SUPPORT. Works around issues in v1 interface where it was not possible to query what frontend would do when faces with newer interface versions. This env-call gives stronger guarantees how things have to work.
  • INPUT: Allowing keyboard hotkeys to work without hotkey modifier if modifier is only mapped to RetroPad
  • INPUT: Allowing keyboard hotkey keys for typing if hotkey modifier is set to keyboard but not pressed
  • INPUT: Allowing keyboard RetroPad keys for typing if emulated device type is “None”
  • INPUT/BLUETOOTH: Fix a crash in for BT HID devices. (#14922) pad_connection_destroy() frees slots, no need to free it again.
  • INPUT/BSV/REPLAY: Don’t start video recording when BSV recording starts
  • INPUT/BSV/REPLAY: Don’t double-record inputs in BSV recording
  • INPUT/BSV/REPLAY: Don’t autoload states if a BSV file is being played back or recorded
  • INPUT/BSV/REPLAY: Moved BSV initialization before autoload code
  • INPUT/BSV/REPLAY: Don’t trigger autoload code if there is bsv movie state
  • INPUT/BSV/REPLAY: Allow for both -e and -R to start a BSV file recording at a state
  • INPUT/BSV/REPLAY: Add keyboard recording support to BSV
  • INPUT/BSV/REPLAY: Fix BSV playback from a starting state for DOSbox
  • INPUT/BSV/REPLAY: Associate states with replays. Now states can be saved and loaded during replay recording and playback in a way that keeps the integrity of the recording. Recordings also have a (moderately) unique identifier associated with them.
  • INPUT/BSV/REPLAY: Add checkpointing feature for replay recordings. If cores are not deterministic, or if they only have bounded determinism, we can obtain less drift if replay files also contain periodic checkpoint states. These are configured by the new retroarch setting replay_checkpoint_interval (measured in seconds). States are inserted into the replay file in between frames. This also fixes the settings display for the replay autoincrement max keep setting.
  • INPUT/FRAMEADVANCE: Use non-rendering pause mode when frameadvance is triggered
  • INPUT/HOTKEYS/OVERLAYS: Do not block input overlay hotkeys
  • INPUT/HOTKEYS: Hotkey blocking correction. Turned out the previous hotkey blocking changes worked properly only with winraw driver and not the rest (at least with Windows), because input_keyboard_event() could be called at the wrong moment, and thus storing keyboard menu press there broke the separation of controller Guide menu button and keyboard menu key. Also allowed the blocking to work in both directions so that controller hotkeys won’t get blocked if only keyboard has “enable_hotkey” bind.
  • INPUT/LINUX/UDEV: Fix udev guns input when id_mouse is not id_joystick
  • MENU: Rename ‘Standalone Cores’ to ‘Contentless Cores’
  • MENU: Music files should also obey builtin_mediaplayer_enable (#14967) Disabling the built in media player should be possible for music files as well. Without this, sound files can not be opened from file browser with cores that support them.
  • MENU: Relocated items to a more logical order
  • MENU: Corrected some title capitalizations (when/before/after are not low case, but for/the/a are)
  • MENU/AUDIO: Add dropdown menu for audio device
  • MENU/HELP: Help for turbo modes (#14919). Help text added for each of the selectable turbo modes.
  • MENU/INPUT: Add unified back action to all menu drivers. Usability boost for all menu drivers resulting in similar behavior as with Ozone currently, which is pressing back/cancel enough the selection jumps first to Main Menu and when pressed again jumps to the first item, so that when a core is running, Quick Menu is very quickly accessible from anywhere. And when core is not running, the first item would be Load Core.
  • MENU/INPUT: Override bind save + menu manager overhaul
  • MENU/INPUT: Allowed and fixed input bind saving to overrides
  • MENU/INPUT: Overhauled override menu
  • MENU/INPUT: Pressing Start on the top active file entry reloads current overrides as startup would
  • MENU/SUBLABELS: All under “Configuration File” + moved “Reset to Defaults” to bottom
  • MENU/SUBLABELS: Quick Menu > Controls > Port x Controls
  • MENU/SUBLABELS: Port x Controls > Device Type
  • MENU/RGUI: Fix disabled menu item color. The effect was not working properly, since transparency meant using the core output color as background.
  • MENU/XMB: Fixed playlist manager icons to take Explore Views into account properly
  • MENU/XMB: Changed XMB Explore View title to match Ozone
  • MENU/XMB: Added “Switch Icons” option
  • MENU/XMB: Fix MENU_ACTION_CANCEL when search is active. Nasty issue discovered in XMB which broke search term cancelation.
  • MENU/XMB: Layout corrections:
  • MENU/XMB: More room for longer item labels and values
  • MENU/XMB: “Core Downloader” has extra space for item and “installed” indicator
  • MENU/XMB: Fixed “Menu Scale Factor” to not require restarting to get the actual end result
  • MENU/XMB: Adjusted scale factor to behave better with both layouts
  • MENU/XMB: Fixed savestate thumbnails and adjusted vertical fade factor in “Handheld” layout
  • MENU/XMB: Changed thumbnail shadow to outline and tightened fullscreen thumbnail margins
  • MENU/XMB: Adjusted global shadow opacity
  • MENU/XMB: Remove “Framebuffer opacity” from XMB as it does not use it. Also, rename the corresponding menu title, since “framebuffer” is not that intuitive.
  • MENU/OZONE: Fixed playlist manager icons to take Explore Views into account properly
  • MENU/OZONE: Refresh thumbnail on close content hotkey
  • MENU/OZONE: Ozone footer enhancements (#14926). Add Help button (Select) and Reset to Default (Start) to footer where applicable.
  • MENU/OZONE: Ozone footer enhancements (#14934). Display Help footer only if there is actual info to be displayed, either actual help, or sublabel if it is not visible otherwise.
  • MENU/OZONE: Ozone footer enhancement: Scan button (#14949). Display Scan button in footer when it is applicable.
  • MENU/OZONE: Add Clear button to Ozone footer (#14947). Add indication of Clear button when it is applicable (currently: keybinds).
  • MENU/MATERIALUI: Added missing Favorites+History icons in playlist manager
  • MENU/MATERIALUI: Added “Switch Icons” option
  • MENU/CHEATS: Added missing icons in cheats (Delete + Copy After/Before)
  • MENU/CHEATS: Fixed label capitalization in cheats (Add New After/Before This)
  • MENU/SOUNDS: Add scrolling sounds for RGUI, XMB, MaterialUI and Ozone.
  • MENU/SOUNDS: Better scrolling sound implementation, add new ‘notice back’ sound
  • MENU/SOUNDS: Scroll sound fixes. Correctly get list size in xmb.c for playing scrolling sound when switching categories, play the scrolling sound when pressing cancel in ozone, play the sound when scrolling with ZL and ZR, play the correct sound when scrolling with L- MIYOO: L3/R3 support for Dingux Gamepad controller device.
  • MENU/WIDGETS: Show square sized widget on volume mute. Volume widget is currently fixed size always, and thus showing a lot of empty space when muting, therefore shorten the box to icon size only when muting.
  • NETWORKING: Call ssl_socket_close for SSL sockets
  • NETWORKING/CHEEVOS: net_http – Temporary fix for cheevos crash. Don’t use new timeout/poll code for cheevos HTTP requests.
  • NETWORKING/MENU: Network information cleanup:
  • NETWORKING/MENU: Remove extra space from : delimiter
  • NETWORKING/MENU: Trim useless/duplicate garbage from the end of ipv6 address. Windows shows %[adapter number], Linux shows %[adapter name], which already shows before the address
  • NETWORKING/STDIN: Add LOAD_STATE_SLOT N command to stdin/network protocol
  • OSD/STATISTICS: Add Run-Ahead data to on-screen statistics
  • OSX/MACOS: Steam platform support
  • OSX/MACOS: Set LSApplicationCategoryType to games
  • OSX/MACOS: Include OpenGL video driver on Metal macOS builds (10.13 and higher)
  • OSX/MACOS: Fix a few mac windowed mode settings –
  • OSX/MACOS: Use “Remember window position and size” setting (fixes #14806)
  • OSX/MACOS: Implement window opacity
  • OSX/MACOS: Enable “Show window decorations” toggle
  • OSX/MACOS: Hide “Disable composition” option (osx does not support disabling composition)
  • OSX/MACOS: Make sure to use the file system path name, not the URL name
  • OSX/MACOS/IOHIDMANAGER: Various memory access fixes to prevent crashes (#14459) (#15000). Prevent double free and null dereference when the controller is quickly reconnected. Handle error when controller device query returns null instead of crashing.
  • OSX/MACOS/METAL BUILD: Fix input events (keyboard/mouse) sometimes going lost when switching between fullscreen and windowed mode. Fixes lots of longstanding issues
  • OSX/MACOS/OPENGL: Fix for fullscreen OpenGL driver in Metal macOS build
  • OSX/MACOS/VULKAN/MOLTENVK: Default to Vulkan driver when available (for 10.13 Metal Universal build)
  • OSX/MACOS/VULKAN/MOLTENVK: Updated Vulkan on Metal for OSX via MoltenVK
  • OSX/MACOS/VULKAN/MOLTENVK/HDR: Fix non-HDR colors
  • OSX/MACOS/SLANG: The change to apply shaders would be executed and then a command to apply shaders would immeidately be enqueued, to run asynchronously after the current event handler, which then did exactly the same. Fixes issue #14789 – Turning on shaders on Metal build 1.14.0 stable for Mac OS will slow emulation drastically thing, creating a busy loop.
  • PS2: Avoid loading extra drivers when not needed. Fixed a bug where it wasn’t using the variable extra_drivers, for loading the specific IRX needed drivers. This is increasing compatibility with some specific PS2 models that sometimes fail when loading cores.
  • PS3/PSL1GHT: Add improvements to the RSX driver (#14965)
  • PS3/PSL1GHT: Add modern_alpha_blend and modern_opaque rsx shaders
  • PS3/PSL1GHT: Add perf improvements to the rsx driver
  • PS3/PSL1GHT: Add RSX video driver
  • PS3/PSL1GHT/MENU/XMB: Do XMB menu scaling for psl1ght
  • PS3/PSL1GHT: Update Makefile to use latest shaders and more UI menu options
  • PS3/PSL1GHT: Default folders normalization
  • PS3/PSL1GHT: Fix video rotation
  • PS3/PSL1GHT: Fix HTTP download
  • QB/CONFIGURE: Add new flags – HAVE_UPDATE_CORE_INFO, ASSETS_DIR, FILTERS_DIR
  • RECORDING: Add recordings to video history playlist
  • REWIND: Don’t take rewind steps while menu pause active
  • RUNLOOP: Currently when core is paused, video output will be stopped completely too, making it impossible to animate widgets while paused, therefore:
  • RUNLOOP: Added a new runloop state for pause which renders last cached frame
  • RUNLOOP: Allowed rewinding while paused so that it acts like backwards frameadvance. Also moved rewind step taking before menu iteration so that steps won’t be lost while in menu when menu_pause is disabled
  • RUNLOOP: State load and reset while paused will forget pause for x frames in order to show proper output
  • RUNLOOP: Allowed reading pause hotkey while menu is active
  • RUNLOOP: Allowed reading screenshot hotkey while menu is active
  • RUNLOOP: Joined 2 fullscreen hotkey checks to one (Any ideas why they were separated for paused and non-paused states, since one works fine for both..?)
  • RUNLOOP: Implement GET_HW_CONTEXT_NEGOTIATION_INTERFACE_SUPPORT. Fairly trivial. Just report the latest version.
  • SAVESTATES: State slot hotkey adjustments –
  • SAVESTATES: Allow selecting -1 Auto slot with hotkeys
  • SAVESTATES: Allow wrap-around from -1 to 999 and backwards
  • SAVESTATES: Show failure message when trying to load a state that does not exist instead of plain “Loading state”
  • SAVESTATES: Shorten the duration of slot change notification
  • SAVESTATES: Change the widget type to the same type as shader toggle for better back and forth action. Closes [Widgets] Save state slot switcher
  • SHADERS: Append Preset feature
  • SHADERS: Prepend Preset feature
  • SHADERS: Shader Preset – Wildcard Replacement in Paths on Load. When a simple preset loads, text wildcards which are found in paths inside the presets will be replaced with values coming from the current RetroArch context. The replacement will be executed on both texture paths and reference paths.
  • SHADERS/SLANG/SPIRVCROSS: Update to latest SPIRV-Cross, fixing Metal shader compilation issues along the way
  • STATICALLY LINKED/SALAMANDER: Fix salamander config save on fork for static platforms
  • TVOS/VULKAN/MOLTENVK: Vulkan on tvOS
  • VIDEO: Allow manual video swap interval forcing. The addition of auto swap interval effectively prevented manual forcing, which is beneficial when the rate is not reported properly. Therefore use the interval in the calculation only when using automatic interval.
  • VULKAN: Fix crash when using multiple physical devices and HW core (#14889)
  • VULKAN: Detect if wrong PhysicalDevice is returned.
  • VULKAN: Actually query physical device before creating core device.
  • VULKAN: Define and implement v2 of context negotiation interface
  • VULKAN: Add v2 of context negotiation interface.
  • VULKAN: Add vkEnumerateInstanceVersion symbol.
  • VULKAN: Implement v2 context negotiation
  • VULKAN: Use compute shaders to upload RGB565
  • VULKAN: Fix regression with RGB565 and OriginalHistory.
  • VULKAN/WAYLAND: Don’t clamp the number of requested images. Due to an unfortunate “feature”, MESA always reports 4 as the Vulkan surface’s minImageCount in Wayland. However, values of 2 and 3 work perfectly well, even if they are out of spec, providing way better latencies when using the Vulkan backend on Wayland. So this removes the artificial clamping that was being done to desired_swapchain_images, because it’s not really necessary and was causing very noticeable input lag on Wayland+Vulkan.
  • VULKAN/MENU/RGUI: Fix RGUI on Vulkan on platforms that don’t have _pack16 VkFormats
  • VULKAN/MACOS/OSX: avoid using _PACK16 pixel formats on platforms without them
  • WAYLAND: On scaled desktops the wayland backend deciding to resize based on values multiplied by the scale factor twice. Resulting in continuous attempts to rebuild the swapchain when in fullscreen.
  • WAYLAND: Wait for splash screen configuration. Before, configuration (resize) events for the initial wayland window could happen before or after set_video_mode which could result in a small or corrupted window. Now we make sure that the initial window has processed it’s resize events before window size is set by set_video_mode.
  • WAYLAND: Changes the initial window to show a RetroArch logo copied from the icon of the X11 backend.
  • WAYLAND: Build pointer-constraints and relative-pointer protocols.
  • WAYLAND/GL: GL is sometimes not rescaling property (Super + Left).
  • WIN32/INPUT: Add support for mouse button swap
  • WIN32: Fix keyboard event characters. Added sending key chars to all input drivers (currently they only send scan codes), and also missing mods for raw.
  • WIN32: Fix restart if path has spaces. CreateProcess does not like to have anything executable path related in the second parameter lpCommandLine if the path has spaces. Thus strip everything from args except the actual parameters.