Welcome to February’s Progress Report! This month saw smaller number of contributions from our regular developers as most of the improvements were still a work-in-progress that required further tweaking before they could be merged in the upcoming months. That’s not to say this February didn’t have big improvements though. On the contrary, this month kd-11 finally implemented the much anticipated On-Screen Keyboard while GalCiv managed to emulate multiple PlayStation 3 accessories using regular controllers. If that wasn’t enough, thanks to the multiple other performance improvements to the emulator, exclusive titles such as Genji: Days of the Blade have seen a huge uplift in performance.

In addition to the following report, further details of Nekotekina and kd-11’s work during February and upcoming contributions can be found in their reports on Patreon. This month’s Patreon reports are:

Status update from kd-11 (2019-02-08)

Table of Contents

This month saw RPCS3 reach another milestone in game compatibility with the Ingame and Playable categories cumulatively crossing 85%! This was largely thanks to the conscious efforts of testers to retest all games in Intro, Loadable and Nothing categories and report issues faced to the developers. Once provided relevant causes, our developers were able to fix issues plaguing many of these titles. Their efforts paid off with the Intro category decreasing by 66 titles. But this is just the beginning, with further work being done to improve these titles.





On Git statistics, there have been 2209 lines of code added and 447 removed through 21 pull requests by 9 authors.



Major RPCS3 Improvements

Support for PlayStation 3 accessories (#5691)

Like any console, the PlayStation 3 had a host of accessories and toys that could be connected for additional functionality. This include accessories such as the Guitar Hero guitar controllers, Rock Band drum kits, SingStar microphones, Logitech Driving Force GT racing wheel and even toys such as the Skylander Portal. Sony also released their own set of peripherals such as the PSEye camera and PSMove motion controller along with the DualShock 3. While all peripherals connect to the console through the USB port, they are handled differently by each game. The PlayStation 3 allows developers to handle these peripherals by two methods, either through specialized libraries (such as cellPad, cellMic, cellGem and cellCamera) or by communicating directly with the USB device through cellUsbd.

In RPCS3, the cellPad library was the first to be implemented along with the Pad handler (using input APIs such as XInput, MMJoystick, evdev) and have games detect input as if it were from a DualShock 3. Using these APIs ensured that RPCS3 would be able to recognise any controller that complied with these APIs. While the other libraries have also been implemented to varying degrees, more work is required for RPCS3 to support these peripherals.

Or so we thought, until AniLeo, our community manager, noticed that he could get Guitar Hero 5 to recognise his GH guitar controller using the MMJoystick API by forcing cellPad to return a value (through cellPadPeriphGetInfo & cellPadPeriphGetData) indicating that the connected pad was a guitar. The erstwhile implementation of cellPad passed all inputs received as if it were inputs from a DualShock 3. AniLeo then passed this information on to GalCiv who quickly implemented a simple drop-down menu in the Pad configuration to allow users to select the type of peripheral they wish to emulate.

While this allowed few games to seamlessly detect the guitar controller, other titles still failed to detect the controller correctly. GalCiv promptly began investigating the issue and after reverse-engineering these titles, he identified that they were checking for specific VendorID or ProductID of the controller to allow inputs. Forcing these values to that of Guitar Hero guitar controllers and drum kits addressed these issues as these peripherals are supported by both Guitar Hero and Rock Band titles. With this, users can now play Guitar Hero games with the gamepad of their choice (emulated as a pseudo guitar controller) or use the MMJoystick API to connect an actual guitar controller and enjoy an authentic experience!

With these improvements, many titles such as Rock Band 2 correctly recognise input and are now fully playable!

Users should be note that these improvements only benefit titles that detect input using the cellPad library. A few titles (most notably the latest Rock Band games) use cellUsbd, instead of cellPad, to directly communicate with the guitar controllers and drum kits. However, not one to leave a job unfinished, GalCiv is now hard at work on implementing microphone support through cellMic and also sys_usbd (lv2 syscalls used by cellUsbd). Once finalised, users will be able to use peripherals such as the Skylander Portal and SingStar microphones while also being able to emulate regular microphones as pseudo SingStar microphones!

Back in January 2018, kd-11 decided to implement a native UI for RPCS3 which allowed overlay interface elements to be displayed on top of games. Prior to the native UI, these interfaces were implemented through Qt dialog boxes that would pop-up during gameplay. While these pop-ups gave users the necessary functionality, it suffered from certain drawbacks. For one, these dialogs can only be interacted with using keyboard and mouse, so users looking for a console experience were left with much to desire. The second issue was the fact that, when in fullscreen mode, the message dialogs would in fact appear behind the game and users were given the impression that the game was stuck when it was simply waiting for input. To address these issues, kd-11 implemented a native user interface within the same context frame allowing users to interact with various interfaces such as the save/load menu and message dialogs using a controller.

While most of the functionality was ported over to the new native UI, the On-Screen Keyboard interface was excluded as it required significant rework to the existing implementation. On-Screen Keyboard functionality was implemented with the Qt dialog interface in January 2017 but required users to use a physical Keyboard to input text when prompted. Since the native UI did not implement the same, users were unfortunately still denied the console experience. However, not wanting to leave the task half done, Megamouse improved the implementation of both the Qt dialog interface as well as the native UI interface culminating in the large-scale refactoring last month, all with the goal of facilitating a smooth implementation of a native On-Screen Keyboard in RPCS3.

Once this exercise was completed, kd-11 fixed the few remaining bugs and implemented an On-Screen Keyboard interface within the native UI. The first step involved designing and testing the new On-Screen Keyboard to ensure feature parity to the existing Qt implementation. The initial implementation was made supporting ironing out the design while supporting English.

However, the native UI had a long standing drawback of only supporting characters from English. With this limitation extending to On-Screen Keyboard, latin characters (such as áëéñüùç) and Japanese glyphs were not rendered and instead simply replaced with blank spaces. To workaround this limitation, kd-11 stripped all unsupported character and replaced them with the ‘#’ sign. Next, he upgraded the text rendering system to use extended ASCII character encoding allowing many more characters to correctly render. This allowed for text in languages such as French and Spanish to correctly render now.

Characters from unsupported languages like Japanese will be demarcated with the ‘#’ sign and users will be required to use the erstwhile Qt implementation for full compatibility. However, further improvements were made to the native UI to reduce the number of ‘#’ sign being displayed by identifying spaces and punctuations in full-width languages such Chinese, Japanese and Korean and mapping them correctly to their half glyph counterparts.

Among these changes, the quality of text rendering (especially with OpenGL) was also significantly improved

Games

AC/DC Live: Rock Band, Rock Band and Rock Band 2

Thanks to GalCiv (RipleyTom) implementing support for guitar and drum peripherals Rock Band, Rock Band 2 and the Track Pack games such as AC/DC Live: Rock Band Track Pack are now playable!

MotoGP 10/11

Continuing the recent surge of improvements to racing titles, MotoGP 10/11 is now fully playable!

WWE SmackDown vs. RAW 2009 and WWE ’12

Among the few WWE titles to miss out on a PC port, WWE SmackDown vs. RAW 2009 and WWE ’12 now go ingame. However, both titles suffer from stability issues keeping them from being playable. If you wish to try WWE SmackDown vs. RAW 2009, do remember to turn off wrestlers’ entrances in the game menu.

Tokyo Jungle

The PlayStation exclusive title, Tokyo Jungle, is now fully playable! Previously, this title would freeze shortly after going ingame but with recent compatibility improvements, this title now with runs at full speed even on mid-range hardware. Check out some gameplay footage below:

GripShift

This month also saw the action racing title GripShift move to playable. This console exclusive previously suffered from broken graphics and poor performance but recent improvements have fixed all such issues. Do remember to set framelimiter to 60FPS, as this title now runs well over 200 FPS!

Genji: Days of the Blade

When Genji: Days of the Blade went in ingame in late 2017, it suffered from various graphical issues and the characters were stuck in a T-pose. However, thanks to all the improvements made to the emulator since then, this title performs much better. While performance has improved, further testing is required to determine whether this title is indeed playable. In the meantime, check out this title’s current performance here:

MX vs. ATV Alive

MX vs. ATV Alive went ingame for the first time this month. This marks the milestone of all titles from the off-road racing series MX vs. ATV to now go ingame. Sadly, the game suffers from severe graphical glitches keeping it well away from the Playable category.

Dark Mist

Yet another PlayStation 3 exclusive, Dark Mist, now progresses Ingame. Do remember to enable LLE libvdec, Write Color Buffers and Strict Rendering Mode to avoid significant issues.

Super Hero Generation

A spin-off involving character from three notable franchises, Gundam, Kamen Rider and Ultraman, this title was found to go ingame this month. Further testing is necessary to ascertain whether it is playable on RPCS3.

Other Improvements

There have been numerous other pull requests merged during the month that couldn’t make it to the Major Improvements section. We have collected a list of all such improvements here, and attached a brief overview to each. Make sure to check out the links provided for them if you are interested, as their GitHub pages usually uncover further details as well as the code changes themselves. To see this whole list right on GitHub, click here.

Nekotekina

5693 – Added framework for future replacements to IDM and FXM; Optimized assembly utility instruction for few compilers; Fixed a race condition in sys_spu_thread_group_join during concurrent access; Improved SPU branch patchpoints to now work with SPU LLVM in addition to SPU ASMJIT.

kd-11

5611 – Implemented native On-Screen Keyboard (OSK). See coverage in major improvements here;

5631 – Added support for extended glyph sets in the native system overlay. See coverage in major improvements here;

5633 – Further improvements to render quality of system overlays. See coverage in major improvements here;

5635 – Fixed usage of VK_IMAGE_LAYOUT_GENERAL by properly synchronizing transitioning to and from General layout. General layout requires full pipeline dependency due to its general usage and as such, should be largely avoided.

GalCiv (RipleyTom)

5285 – Implemented static function hooking for memcpy, memset, memmove and memcmp. This can be activated by enabling Hook Static Functions in the Debug tab of the Settings menu;

5691 – Added support for various PlayStation 3 accessories such as Guitar, Drum, Dance Mat, etc. See coverage in major improvements here.

elad335

5623 – Fixed gaps in error checking of lwcond signal syscalls. Also fixed mode 2 of signal syscalls which did not work correctly. Now the error checking correctly matches the lwcond syscalls’ library wrappers;

5643 – Unlike usual threading norms, SPU groups initialization process can be terminated infinitely instead of once. Before this improvement, call join could be done infinitely after a termination without waiting.

This was discovered to be incorrect as once a join was called, the termination signal is cleared and another signal need to sent before the next join could finish as well. This has now been implemented accurately which also simplified the termination process;

5645 – Fixed a minor race condition introduced by the above pull request. When the SPU group is in an “almost” finished state before sys_spu_thread_group_join is called, there was a small time gap where calling the syscall would return from execution before all threads are terminated completely;

5667 – Fixed a race condition when error codes are returned and the error value is dependant on external access in a specific mode of the syscall. This mode did not work prior to PR 5623 and hence the race condition was concealed. Once the mode was correctly implemented, the race condition manifested as a perceived regression in Demon’s Souls which was fixed as well;

5680 – Implemented SYS_SYNC_RETRY lwmutex protocol logic which improved LLE liblv2 compatibility. This benefitted titles such as Super Robot Taisen OG Infinite Battle.

Megamouse

5542 – Improved accuracy of cellSysCacheMount considering the scenario when cacheId is empty and system cache is supposed to be cleared. This improved allowed NBA 08 Demo to progress from Loadable to Intro!

5581 – Improved cellGame error dialogs by adding the relevant error_code and improving the error messages;

5620 – Fixed a bug where the “Open custom config location” option pointed to the previously used folder instead of the current folder;

5650 – Improved crash dump functions in sysPrxForUser which addresses crashes that appear during TODO logging;

5651 – Only show supported resolutions options in the Settings dialog of per-game configurations

5678 – Removed the Viewport options from Settings dialog of per-game configurations as the Viewport settings are only taken from global configurations.

gasinvein

5656 – Improved appdata.xml by adding URLs to the GitHub issue tracker and Quickstart guide, and a screenshot of the emulator. RPCS3 now passes appstream-util validation.

al3xtjames

5657 – Improved macOS build compilation by using the current Git tag to generate version strings instead of using hardcoded values.

jbeich

5695 – Fixed an error in the above pull request.

EmulationChannel

5665 – Updated the latest firmware version to 4.84.

GermanAizek

5670 – Fixed use of clear() to create empty strings.

JohnHolmesII

5682 – Fixed link to Qt installed in the README.md.

Upcoming

Apart from the amazing work by GalCiv to support more peripherals, elad335 has also been working on improving compatibility of the PPU LLVM recompiler. With games being able to fully utilise the Recompiler, the performance uplift is night and day to say the least. Keep your eyes peeled on our YouTube channel for further updates!

Here’s a sneak peak at one of many gems that benefit from this improvement:

Closing Words

If you like in-depth technical reports, early access to information, or you simply want to contribute, consider becoming a patron! All donations are greatly appreciated. RPCS3 now has two full-time coders that greatly benefit from the continued support of over 800 generous patrons.

We’re always looking for dedicated writers to help us write these reports. If you have the skill, time and are willing to help, please apply here. Also, come check out our YouTube channel and Discord to stay up-to-date with any big news.

This report was written by HerrHulaHoop, MarioSonic2987, GalCiv, elad335 and Digitaldude555.