RetroArch Roadmap for v1.7.0 and beyond

We don’t usually talk about all the behind the scenes development stuff that we do. We usually prefer to let the work speak for itself. Nevertheless, we feel compelled to share with you from now on a brief roadmap status update that basically shows what we are currently working on codebase-wise, where RA will go next, etc. We also hope this will be of use to existing upstream contributors.

Compatibility with OpenGL 1.x

From its inception, RetroArch’s OpenGL driver has targeted OpenGL 2.0 and/or later. There are a lot of people on ageing computers that don’t have a GL 2.x compliant driver. We have been putting a lot of work into modularizing the renderchain code, splitting it up from the main GL driver into their own files. This will pave the road towards a basic OpenGL 1.x renderchain which should at least work with OpenGL 1.3 and up. We might be able to target even lower versions later on, but time will tell.

Certain features this GL 1.x renderchain will not have:
* FBO support. FBOs wasn’t a thing with OpenGL until at least version 2.0 (not counting extensions). This also means no libretro GL support, so don’t expect hardware rendered cores with OpenGL 1.x.
* Shaders. Again, this is tied back to a couple of factors, one of them being the lack of FBO support which makes multi-pass shaders impossible to implement. But also, shaders are impossible in general for this 1.x mode. GL 1.x did not yet have shader support. Shaders didn’t become a thing until GL 2.x. GLSL/Cg/HLSL did not exist yet at this time and the entire rendering pipeline was fixed-function.
* There will be no fast framebuffer readback paths (in so far as that stuff is actually ‘fast’ with GL to begin with). No PBO support, which wasn’t a thing back in GL 1.x days. So expect slow screenshot taking and/or recording.
* VAOs (Vertex Array Object) and VBOs (Vertex Buffer Object) weren’t yet a thing until GL 3.x and GL 2.x respectively.

We have no idea yet when this will start working. The main issue is testing it on ancient GPUs that only have GL 1.x drivers.

Xbox OG/Xbox 360

For a long time, the Xbox OG and 360 versions of RetroArch and cores have been de-listed. This had several technical reasons, one of which being that it was a big maintenance burden and struggle to keep having to update all the separate Visual Studio solution files for these platforms. For all other platforms, we build cores using a universal Makefile, which typically contains one file (called Makefile.common) which conditionally defines which files are to be compiled in. By having to maintain some separate solution file, we need to update two files instead of one, and worse, having to start IDEs in order to edit them (or even worse), having to manually edit them with a text editor, which can tend to be error prone on top.

In order to do away with these issues, we have now reverse-engineered how we can still have a Makefile target for MSVC that uses MS’ compilers/linkers/assemblers from within the confines of a Makefile-based solution. Note that this solution does not depend on Microsoft’s nmake and uses plain make.

Now that we have accomplished being able to compile and link cores with MSVC without any MSVC solution file, we now feel the time is right to start reintroducing the Xbox OG and 360 ports.

The Xbox port work also feeds into several other things we have been working on concurrently, such as :

  • Better Direct3D support. Xbox OG will need Direct3D 8, whereas Xbox 360 needs Direct3D 9 + HLSL.
  • The latest compiler that can be used for Xbox OG is Visual Studio 2003, whereas for Xbox 360 this is Visual Studio 2010 (right now). To this end, we have updated a lot of core Makefiles to include targets for these platforms, and not just for the Xbox platforms, but PC as well.

Direct3D work – supporting more versions, etc.

In the past, we have had two separate Direct3D drivers – one for XDK (shorthand for Xbox platforms), and one for PC (Direct3D9-based). Because we intend on supporting the Xbox platforms again, we no longer want the maintenance burden of having two video drivers that essentially are similar in lots of ways. To this end, we have started modularizing the Direct3D driver so that multiple backends are possible to be implemented.

Not only is it possible to have a Direct 3D 8 / 9 codepath, but it is also possible to have separate renderchains. For instance, the Xbox 360 will be able to use the HLSL renderchain, whereas on PC the user has the option to choose between Cg (which would use the Cg renderchain), and/or HLSL (which would use the HLSL renderchain).

We also intend for there to be a fallback path to Direct 3D 8 in case your GPU and its drivers do not support Direct 3D 9 for whatever reason. Backwards compatibility is very important to us and it’s increasingly getting harder to keep supporting all of these various versions in one single codebase. These are unique challenges to which there is often not a clear-cut solution, so we have to improvise a little on the fly and do unconventional things in order to make this happen.

Windows 95

Brad Parker likes extending backwards compatibility of RetroArch to older versions of Windows, and this in turn makes our codebase more flexible so that we can keep the Xbox OG and 360 ports alive.

People might mistake this for taking up resources and time that could be better spent elsewhere, but the opposite is true – by setting up the foundation in our codebase just once, it will be automated and take care of itself from that point on. Also, there is lots of overlap between platforms. For instance,
the latest compiler that can still churn out binaries for Windows 95 is Visual Studio 2003. This incidentally happens to be the last compiler that can create binaries for Xbox OG. So already here we have overlap whenever we need to make a core compatible with MSVC 2003 and we have to create the necessary Makefile targets for it.

For Windows 95, we are thinking of defaulting to the GDI video driver instead of Direct3D since we assume that the kind of machines running Windows 95 typically would not have either a video driver with Direct 3D 9 support or a GPU that supports it to begin with. Windows 95 still supported DirectX so we should be able to default to ‘DirectInput’ as the input driver. Windows NT 3.5 will pose more of a problem here though – back then, NT did not have any DirectX support at all, so a DirectInput driver is not possible and we lack any other input driver that we could use. Windows Raw Input driver cannot work on this ancient NT version. We are not sure yet what approach we will take there.

Nevertheless, Windows 95 will be first out of the starting gates.

New hardware platforms we intend to support

We have obtained some new hardware over the past few months:

  1. NES/SNES Classic
  2. GCW Zero
  3. SteamLink

It is our intention to have this be part of our main release schedule in future releases. We understand that for a system like SNES Classic, a different approach will be required vs. just the usual ‘full fat’ version of RetroArch that people have grown accustomed to, and we will certainly be taking a long hard look at RetroArch Clover for inspiration on what we will do. Our first approach is likely going to be something similar to RetroArch Clover that ultimately piggybacks off Hakchi and which complements the main UI of the platform rather than trying to replace it.

RetroArch 1.6.6 – Released!

RetroArch 1.6.6 has just been released! Grab it here.

This latest version has also been uploaded to the Google Play Store.

General changelog

– 3DS: Fixes serious performance regression that affected every core; rewind was always implicitly enabled.
– AUDIO: MOD/S3M/XM sound should now be properly mixed in with the core’s sound.
– GUI: Visual makeover of MaterialUI.
– GUI: Added ‘Music’, ‘Images’ and ‘Video’ collection options to RGUI/MaterialUI.
– GUI: Allow the user to add ‘Favorites’.
– GUI: Allow the user to rename entries.
– GUI: Performance optimizations for XMB menu driver.
– LOCALIZATION: Update Italian translation
– INPUT: Overlay controller response – when we press buttons on the gamepad or keyboard, the corresponding buttons on the overlay will be highlighted as well.
– NETBSD: Silence some compilation warnings.
– COMMON: Fixed bug ‘Deleting an entry from a playlist would not update the list view inside XMB’.
– COMMON: Fix inet_ntop_compat on *nix

If you want to read about the latest bounty and core updates, read this post instead here.

Complete overhaul of the mobile User Interface! (MaterialUI)

On mobile devices, RetroArch uses the mobile UI, MaterialUI, by default. This interface is designed around touchscreen and pointer devices like a mouse/trackball.

We have given this menu interface a significant overhaul now for version 1.6.6! We are aware that there is a significant percentage of people that to date have been completely unsatisfied with the current state of the menu system on mobile devices like Android and iOS. Our menu UI improvements in version 1.6.6 is our first step to try to remedy this. In later releases, we might follow it up with more elaborate animations, more advanced widgets, etc.

The menu should look less monotonous now due to the usage of context-specific icons. We have also made some other UX improvements:

– The opacity of the game’s image clashed quite badly with the ingame menu before. This has been rectified.
– We have added ‘Music’, ‘Image’ and ‘Video’ playlists to the ‘Favorites’ tab.

Music, Video and Images which have previously been loaded in RetroArch can be easily accessed from the Playlists tab now.
Music, Video and Images which have previously been loaded in RetroArch can be easily accessed from the Playlists tab now.

– The file browser is easier to read now because files show up with specific icons to indicate what they are. For instance, music files have a music icon, a directory has a folder icon, selectable content files show up as a plain file, etc.

The file browser is easier to read now because files show up with specific icons to indicate what they are. For instance, music files have a music icon, a directory has a folder icon, selectable content files show up as a plain file, etc.
The file browser is easier to read now because files show up with specific icons to indicate what they are. For instance, music files have a music icon, a directory has a folder icon, selectable content files show up as a plain file, etc.

Usability tips

You can customize the color theme of the menu in MaterialUI at any time.

1 – Go to User Interface.
2 – Go to Views.
3 – Go to ‘Menu Color Theme’ and set it to the color theme you want.

General menu improvements

Favorites

You can now add a game to a ‘Favorites’ list for easy access! This has been an often-requested feature for years, and in the past we always felt that ‘Load Recent’ was good enough. However, if you load a lot of content, that can easily get cluttered over time.

To add a game to the Favorites list, do the following:
1 – Once a game is running, go to ‘Quick Menu’.
2 – Select ‘Add To Favorites’.
3 – Once added, you can now start the game at any time from the Favorites list.

On RGUI – go to Load Content -> Favorites.
On MaterialUI – go to the Playlists tab -> Favorites.
On XMB – go to the Favorites tab.

To add a game to the 'favorites' list, inside Quick Menu, select 'Add To Favorites'. It should now be added to the Favorites list. You can access the 'Favorites' list inside MaterialUI by going to the Playlists tab. On RGUI, you go to Load Content -> Favorites. On XMB, you go to the Favorites tab instead.
To add a game to the ‘favorites’ list, inside Quick Menu, select ‘Add To Favorites’. It should now be added to the Favorites list. You can access the ‘Favorites’ list inside MaterialUI by going to the Playlists tab. On RGUI, you go to Load Content -> Favorites. On XMB, you go to the Favorites tab instead.

Renaming entries inside playlists

You can now rename an entry from any playlist!

To do this, do the following:

1 – Go to a playlist of any type (it can be the history list, a system playlist, favorites, music/video/images playlists, etc).
2 – There should be an option called “Rename”. Select it. If you are using MaterialUI and/or XMB, an onscreen keyboard will now pop up. Input the new title for the entry and then hit either the Enter key on your keyboard ,the Start button on your gamepad or press the ‘Enter’ key on the onscreen overlay in order to confirm the changes.

You can now rename any entry! Say for instance you loaded a Quake data file. Instead of the playlist showing 'PAK0.PAK', you can rename it to Quake 1 instead.
You can now rename any entry! Say for instance you loaded a Quake data file. Instead of the playlist showing ‘PAK0.PAK’, you can rename it to Quake 1 instead.

Overlays show button presses

Previously, overlays would only show button presses if they were actually being clicked on by either the touchscreen or the mouse.

A user submitted a bounty to make onscreen reactions possible through the gamepad and/or keyboard. A bounty hunter has now successfully completed this bounty and has been paid out. We have enabled this feature by default. If you want to turn it off, you can do so by doing the following:

1 – Go to Onscreen Display -> Onscreen Overlay.
2 – Go to ‘Show Inputs on Overlay’. Set this to off if you don’t want the overlay to react to keyboard/gamepad input, turn it on if you want this to happen (turned on by default).

Nintendo 3DS regression fix – all cores were running slower

A serious issue has been fixed in the Nintendo 3DS RetroArch port which compelled us to push this release sooner rather than later.

It appears that by mistake, rewind was always forcibly enabled in the 3DS port, which led to a halving of performance. This should now be fixed.

What’s next?

The new cores

We are still determined to get the promised cores like PPSSPP into your hands before the end of the month. We just felt it very important to get this release out of the door so that people can see that we are determined to improve the menu on mobile, and also so that the 3DS RetroArch port is repaired again.

Wii input fix

Finally, after years of struggling with this very pesky issue, it seems we are on the verge of a breaktrhough here that could lead to this random input issue finally being fixed –

https://github.com/SuperrSonic/RA-SS/commit/29d6467d28a835136b8ab87e209feb34421983ff

it seems there was a regression in libogc at some point which lead to this input regression. Superssonic reports that going back to an older version of Wiiuse fixes the issue. What we are probably going to do is make a custom baked-in libogc version for the Wii port for the next release.