Progress Report: July 2018

This month has seen major improvements to the SPU LLVM recompiler and RSX emulation as well as implementation of new features such as a user manager and a refreshed UI design, among many other improvements and additions.

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

Status update from kd-11 (2018-07-05)
Status update from Nekotekina (2018-07-12)
Status update from kd-11 (2018-07-21)
Status update from Nekotekina (2018-07-30)

Table of Contents

Major Improvements
Games
Commits
Conclusion

Game Compatibility: Game Status
Game Compatibility: Monthly Improvements (July 2018)

On Git statistics, there have been 8 047 lines of code added and 4 671 removed through 135 commits by 12 authors.

Major RPCS3 Improvements

Asynchronous Shader Recompilation (#4876)

This month saw the implementation of Async shader recompilation by kd-11. An in-depth look into what this is and how it helps the emulator can be read at the blog post here. To see a visual demonstration of how it improved the emulator, check out this video:

Vertex Program Decompiler and Analyzer Improvements (#4844)

While the async shader compiler was arguably the most notable improvement kd made this month, it wasn’t his first nor his only important batch of changes. At the very first week of July, he made major improvements to the vertex program decompiler and analyzer, resulting in more compact shaders and a decrease in the total number of shaders generated.

This change greatly improved titles where the shader compilation was prevalent and was the bottleneck, or where shader caches were unrealistically blown-up. Many indirect issues were caused by these, like games crashing due to being stalled for too long, or screen flickering due to the vast amount of cached shaders. With this, not only cache loading times, but also the compilation times have shortened, which, in combination with the async shader compiler that followed all this, means that shaders pose much less of an issue now to the end user than they used to.

These changes also meant that games which used to be crippled by shader compilation issues now fare much better, with some even changing categories:

Watch Dogs went from Intro to Ingame!

TMNT: Turtles In Time Re-Shelled improved dramatically!

And last but not least, these improvements got Sonic: Unleashed, Bleach: Soul Resurrección, Resistance 2 & 3 (with 2 getting it’s regression fixed) and Ratchet & Clank: A Crack In Time ingame! For further details, see them at the Games section later down below.

SPU LLVM Improvements (#4816)

This month, Nekotekina brought us some significant improvements to the SPU LLVM recompiler. As he mentioned in his first Patreon post, compilation speed was (and is relatively still) a major issue. To alleviate this to some extent, among the many code simplifications, refactors, fixes, pattern detection and general analyzer improvements, he also switched over to the not yet released LLVM 7, with added modifications in RPCS3’s local fork on top of it. These not only yielded performance improvements, but also managed to further SPU LLVM’s accuracy as well, making titles such as F1 Race Stars, Dragon Ball Z: Burst Limit and SoulCalibur V finally support it.

For a technical explanation on what pattern detection is and how his improvements were made to LLVM, check out Nekotekina’s second Patreon post.

User Manager (#4300)

Back in March, mpm11011 opened a pull request with the idea of implementing a user manager into RPCS3. This functionality is present in the PlayStation 3, and allows for multiple users to manage their trophies, save data and PSN games separately on the same device. RPCS3 had support for trophies and save data but this was limited to a single user “00000001”. After 4 months of discussion, with contributions from Megamouse, the user manager was finally merged.

With this new user manager, which can be found at Manage -> User Accounts, users can not only view all existing accounts and their respective IDs but also create, rename, delete and toggle between active users when not ingame. The user manager allows a users to:
– segregate game saves for different users
– unlock trophies for different users
– have PSN games registered to different users

Given that RPCS3 does not support PSN, and probably won’t in the foreseeable future either, this is a pretty close approximation to the multi-user functionality of a real PS3 and a step forward in usability for the emulator. This will enable the same install of the emulator to be used by entirely separate people without risking their saves. So if you share a PC with siblings or other family members who want to play, this is great news for you!

Also, for some games such as Terraria, local split-screen multiplayer required different users to be logged in on the same system. With the implementation of user manager, it is now possible to correctly emulate this game mode. Sadly, even though the user manager works perfectly, graphical issues still prevent this game mode from being playable:

New GUI Design (#4841)

This month @DAGINATSUKO and Megamouse worked together to overhaul the RPCS3 GUI to look even better than before! The default hard-coded stylesheet has been replaced by DAGINATSUKO’s own stylesheet. This update brings refreshed icons for the toolbar, gives users the ability to style table items as well as the game grid by adding the object named “game_grid”. Along with these additions, this GUI update fixed certain issues such as the game icons being unnecessarily highlighted when their row was selected and an inaccuracy in the icon repaint method that caused a sub-pixel to be painted in the wrong color.

Also, to reduce complexity of the stylesheets, redundant features, such as the possibility to repaint the toolbar and it’s icons in the menu, were removed. For user who preferred the old look, fret not, the old style is still available in the form of the stylesheet “Classic (Bright)”.

Take a look at these comparative screenshots between the old and new designs:

Games

Sonic Unleashed

Thanks to “Program Fixes” by kd-11 detailed above, Sonic Unleashed, a much loved game from the Sonic franchise, now goes ingame! While it does require a capable CPU to run, RPCS3 can outperform the physical console’s performance in several scenarios with near flawless graphics at 4K! To see just how good it works, check out this video:

Ratchet & Clank Future: A Crack In Time

Once again, due to the aforementioned improvements from kd-11 and “Ugh fix” from isJuhn, this title goes ingame for the first time! However, the game still crashes after a few minutes due to RSX IO memory errors.

Resistance 3

As hinted in previous month’s report, this AAA Playstation 3 exclusive goes ingame with good framerate and graphics. However, the game currently crashes after the initial tutorial area. Check out Resistance 3’s performance ingame in this video:

Bleach: Soul Resurrección

This month the PlayStation 3 exclusive, Bleach: Soul Resurrección, became fully playable. Thanks to the fixes by kd-11, the remaining texture issues were fixed and this title now runs with good performance and graphics.

SSX

This fan favorite console exclusive is now finally ingame! It’s worth noting however, that it still suffers from low performance and broken graphic on both renderers (with OpenGL being significantly worse off).

Knights Contract

This console exclusive title is now fully playable!

MotorStorm: Apocalypse

This PlayStation 3 exclusive title now goes ingame. However, this title suffers from low performance and few graphical issues preventing it from being fully playable.

Gundam Crossfire and Dynasty Warriors: Gundam Reborn

This month also saw 2 entries from the Gundam series reaching ingame: Mobile Suit Gundam: Crossfire, a PlayStation 3 exclusive, and Dynasty Warriors: Gundam Reborn, a console exclusive. The only issues remaining are Gundam Reborn being prone to crashes, and Gundam Crossfire suffering from low FPS due to requiring PPU Interpreter (fast) to work, making neither of them Playable just yet.

PixelJunk SideScroller

On the indie front, this fun little PlayStation 3 exclusive title now goes ingame. While this game has stable performance ingame, the menu suffers from graphical glitches that prevent it from being properly readable.

Commits

As always, this may not be a complete list of PRs or commits, nor does it necessarily list every single thing done by a given PR. For a full list, see PRs merged in July.

Nekotekina

4816 – SPU LLVM improvements, see coverage in major improvements;

4867 – Enable cellSaveData to print SECUREFILE secureId in the log which can help in decrypting savedata; Minor enhancements to SPU and PPU LLVM code; Updating LLVM to address long pause/hang after loading PPU modules.

kd-11

4844 – Improvements to the RSX vertex program decompiler and analyser, see coverage in major improvements;

4866 – Fixed a regression with OpenGL renderer that was introduced in last month’s “Simple” fix PR;

4869 – Improves vertex textures support by including dimensions other than 2D textures, optimizations for program state tracking and minor analyser enhancements which removes the spurious ‘analyser failed’ errors;

4876 – Implementation of asynchronous shader recompilation, see coverage in major improvements;

4902 – Fixed multi-remapped textures by removing static image-view pairings for regular texture uploads to enable the transition to a multiview format similar to implementation for render targets; Cleanup of OpenGL renderer to negate performance loss after the above async PR and implemented FIFO optimizations. This PR fixed lighting and textures of various titles such as One Piece: Pirate Warriors and Resistance 3 among many others!

Megamouse

4405 – Fixed a bug with different settings profiles; Added a dialog when using the settings dialog to enable the correction of broken settings in the config.yml; Implemented spinboxes for use in settings dialog; Allows the TTY log to auto-scroll similar to the normal log; Handled a fatal error when decrypting selfs and elfs; Use unique rrc capture names with timestamps, maintain a dedicated captures folder and direct the “Open RSX Capture” file dialog there; Added positioning options for the shader compilation hint to config.yml; Added positioning options for the performance overlay under the Emulator tab and color options to config.yml (allowed values are hex color codes in the form of #rrggbb, rrggbb, #rrggbbaa or rrggbbaa);

4531 – Merged the input device dialog into the pad settings dialog. All pads and pad profiles can now be easily configured through the different tabs in the new unified pad settings. Hooray!

4819 – Upgraded Appveyor to use Qt 5.11 on windows builds. Travis is still retained on 5.10;

4831 – Implemented sys_tty_read whereby the Qt TTY log now features an input line that can be used to write directly into the TTY input buffer. The user channel can be changed by right clicking the TTY log. It writes to all channels by default. This can be used to issue debug commands in some games and its addition fixes fatal crashes in games like “American McGee’s Alice”, making them proceed further, some even go ingame for the first time.

4839 – Added “Enable TSX instructions” option to the CPU tab. On older Haswell and Broadwell CPUs this has to be forced if supported and a dialog will warn users about it’s dangers. For all other’s who can use TSX this is a great way of testing games for differences and problems between the two paths; Added “SPU Block Size” to the CPU tab and “Spu Verification”, “Set DAZ and FTZ”, “Accurate GETLLAR”, “Accurate PUTLLUC” to the Debug tab; Moved the “Hook Static Functions” option to the Debug tab;

4841 – New GUI design, see coverage in major improvements;

4858 – Added the same configurable game icon background color to the trophy table that was already used in the game list;

4885 – Handled an upstream bug exclusive to Qt 5.11.1 that led to improperly read native event messages and game window issues. Also, edited the gitignore file to also ignore the TEST12345 folder, as it can be used by some games as well;

4898 – Added functionality for multiple pkg files to be bulk installed properly, as the pkg install dialog will now give two additional options, “Yes to all” and ”No to all” within a single dialog; RSX capture (rrc) files can now be replayed simply by dragging them with the mouse into RPCS3; Added missing tooltip of the new “Disable Async Shaders” option;

4933 – Improved the User Manager added in PR 4300 by fixing issues with the Login Button which was still clickable for logged in users; usernames always having the maximum of 16 characters in the view, leading to trailing whitespace; scanning of the home directory to ensure users with IDs <= 0 are not shown (similar to the PS3); allows renaming of old usernames. Also, added hotkeys such as F2 for Rename User, Delete for Delete User and Enter (or Return) for Login User. 4934 – Fixed minor issues with the new pad settings dialog after PR 4531 where pressing tab or the arrow keys while assigning buttons for keyboard input resulted in switching to the next player or handler instead and also, label sizes of the initial dead zone preview which were not uniform;

4944 – Addressed a regression where the trophy table in the trophy manager would display the wrong game whenever you dragged the mouse to other games while having the left mouse button clicked. Also, fixed an issue where RPCS3 would shut down completely if a rcc file was dropped into it while a game was running;

4946 – Fixes a glitch in the native UI’s save dialog where the title would not display the proper text at random, leading to confusion between saving, loading and deleting of the save games.

scribam

4820 – Improved accuracy of a few floating point instruction for SPU and PPU by changing the way values are being negated to have more accurate results;

4882 – Clang compilation fixes which allows RPCS3 to be compiled on more versions of Clang compiler;

4884 – Fixed incorrect values for floating point exception checks in SPU interpreter (precise);

4919 – Fixed inaccurate sum calculation caused by wrong type casts in vaddsws and vadduws instructions for PPU interpreter (precise).

elad335

4848 – Fixed a bug in cellSysCacheClear where the function would delete the cache folder itself and few additional quirks around it. This addressed the regressions in Beyond: Two Souls and Heavy Rain, and allowed SSX to go ingame for the first time!

4870 – Fixed a race condition when a barrier type MFC command was issued after an MFC stalled list in the same command tag group;

4881 – Clamps atomic MFC command’s address to a 128 byte boundary. This allows Blades of Time and Star Wars: The Force Unleashed to go ingame for the first time and facilitates future MFC optimizations knowing these MFC transfers are 128 byte aligned;

4903 – Added EFAULT checks in sys_time_get_current_time. This allowed The Sims 3 to reach intros!

4458 – Workaround for issues in HLE libvdec by stubbing unsupported video timebases. This allows few games such as Sonic The Hedgehog to work with default module settings.

Farseer2

4832 – Fixed a bug where cellGameDataCheckCreate2 would overwrite game data in PARAM.SFO with empty data. This addressed failed boots in few games such as Lair;

4855 – PPU analyser optimizations which fixes cases where a game would take over a minute to boot;

4872 – Fix “Not enough space in hard drive” errors which were caused by game developers multiplying amount of free kilobytes by 1024 to reach amount of free bytes in hard drive. Since RPCS3 fakes exactly 40GB, this would result with an overflow, returning a size of 0. By reducing it to 40GB – 1 kilobyte, the overflow result would be very large, and checks won’t fail.

al3xtjames

4890 – Fixed an issue relating to Qt deploy for VS builds when the path to the project contains spaces.

hcorion

4846 – Fixed an issue with the libxcb dynamic libraries, mainly libxcb-dri2.so, which made the Vulkan backend unavailable for users using Mesa version 18.1.1 and greater. This PR simply removes the libxcb dynamic libraries from the AppImage.

isJuhn

4842 – Fixed a bug relating to PPU LLVM introduced in “Kot fixes” PR, which was detailed in last month’s report. This allowed various Insomniac Games titles such as Ratchet & Clank – A Crack in Time, Into The Nexus, All 4 One and QForce; along with Resistance 3 and Fuse to progress further with PPU LLVM.

TGEnigma

4430 – Implemented two unsafe memory read and write API functions, sys_dbg_read_process_memory and sys_dbg_write_process_memory, commonly used in homebrew to read and write from, and to protected memory.

John-Gee

4911 – Add a channel map to the PulseAudio backend to fix surround sound functionality.

mpm11011

4300 – Implementation of user manager along with Megamouse, see coverage in major improvements.

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.

Also, come check out our YouTube channel and Discord to stay up-to-date with any big news.

This report was written by elad335, HerrHulaHoop, Megamouse, nitrohigito, twdarkeh.

Eliminating Stutter with Asynchronous Shader Implementation!

Background

Shader compilation stutter is nothing new to most emulator users, especially on RPCS3. However it is worth clearing up some misconceptions that go around regarding how RPCS3 shaders work. I’ll try to quickly go over the history of shader compilation on RPCS3 and hopefully explain why the shader compilation stutter appeared and why some people believe RPCS3 did not have shaders before.

Shader complexity and custom vertex fetch

In early 2017, I embarked on a task to remove the very expensive vertex preprocessing step from the CPU side of RPCS3. This basically meant implementing all those custom vertex types and vertex reading techniques to the vertex shader and providing only raw memory view that the ps3 hardware would be viewing. This greatly improved RPCS3 performance, more than tenfold in some applications. This change is what made RPCS3 usable for playing real commercial games with playable framerates without needing HEDT system. However, the new fetch technique increased the size of the vertex shader and added a complex function to extract vertex data from the memory block. This made the graphics drivers take very long to link the programs, even without optimizations, likely due to use of vector indexing, switch blocks and loops with dynamic exits. Extra operations including bitshifts and masking were also needed to decode the vertex layout block. The code runs very fast, but the linking step is very slow. A shader cache system already existed before and if you ran an area for the first time, there was slight microstuttering that some users did not notice; its this stutter that got much worse. The solution to this: preload the shaders so that you don’t need to compile them next time. This lead to the infamous “Loading Pipeline Object…” screen and the “Compiling shaders…” notification.

Challenges

There are several challenges to tackling RSX shaders. First, the RSX is not a unified architecture like most programmers are used to today. It has separate vertex and fragment pipelines, both with their own separate ISA. They are also very limited and larger programs or more complex programs can result in very messy binaries. One of the largest problems is that the bytecode itself does not contain all the information required to run the program, extra configuration is configured via registers as draw calls are passed in. A good example is that the TEX instruction does not differentiate between texture types, but a texture configuration register exists that allows using the same program to read 1D, 2D, 3D, or CUBE textures as well as their shadow comparison variants. This means you can only know the generated shader once the texture register has been set up. There are other examples of things like these that make it so that you need the game to set up the program environment before the program itself is compilable.

Origins

Anyone who has ever looked at the RPCS3 program generation pipeline might have noticed that program decompilers are separated into program class and decompiler thread class. This is because technically asynchronous decompilation was in RPCS3 from the beginning but it likely never worked correctly and ended up being effectively synchronous (see https://code.google.com/archive/p/rpcs3/source/default/source for original RPCS3 code from 2011 to 2013). The goal was to rework how the programs are decoded and recompiled asynchronously. Before any of this would be possible, the decoder would have to be very efficient to lower cpu load, otherwise infinitely decompiling shaders would cause permanent flickering and graphics glitches. This is why I put in more effort into cleaning up the program decompilers beforehand to minimize unique generated shaders by reusing as much emitted code as possible.

Implementation

Once the vertex program analyser was improved to a point where most titles could be run with under 1k generated shaders, it was time to finally decouple the decompilation, recompilation and linking steps from the main renderer thread. This was pretty straightforward to set up for Vulkan which is inherently built with multithreading in mind, and a minor hassle on OpenGL where multithreading is more difficult to set up due to context spaces. It was expected that severe graphics glitching would persist until all programs were prepared but even with a bare bones implementation I realized that most of the needed shaders would actually be properly compiled after just a few seconds. This made the implementation usable in its incomplete stage, even without assistance of approximation shaders or interpreters. This was very good news and allowed this feature to be enabled by default as most users prefer the missing graphics for a second or two instead of completely freezing the emulator for a minute or so before all the shaders are compiled. This is particularly effective since not all shaders compiled even affect items that are visible to the user.

Results

The results are surprising even to me. The speed at which graphical glitches resolve is very impressive on capable machines. You can see a quick comparisons below:

Loading times and stutter are both reduced significantly when no pre-compiled cache is present.

Conclusion

While the compiler greatly improves quality of life when using the emulator, it is far from perfect. Lower end CPUs might lose some performance when the decompiler is active and even hitch and stutter slightly from time to time. Not as bad as before but it’s still a problem. There is also the issue of the missing graphics. This could be improved with approximation interpreters to loosely provide a placeholder program to assist in rendering.
While much work remains to be done, hopefully these improvements will help many users and fans in running applications on the emulator.

Regards,
kd-11,
Lead Graphics developer for RPCS3

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. You can support lead developers Nekotekina and kd-11 here on Patreon. Your support will help speed up the development of the emulator so that one day every game will be perfectly playable from start to finish.

Also, come check out our YouTube channel and Discord to stay up-to-date with any big news.

Progress Report: June 2018

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

Status update from kd-11 (2018-06-05)
Status update from Nekotekina (2018-06-12)
Status update from kd-11 (2018-06-20)
Status update from Nekotekina (2018-06-27)

Table of Contents

Major Improvements
Games
Commits
Upcoming
Conclusion

On compatibility database statistics, we can see a big decrease in Loadable games due to several recent changes targeting issues that kept those games from progressing further. The Nothing category also went down by 2 games, with only 6 games remaining in it.

Game Compatibility: Game Status
Game Compatibility: Monthly Improvements (June 2018)

On Git statistics, there have been 16 605 lines of code added and 10 558 removed through 135 commits by 21 authors.

Major RPCS3 Improvements

PlayStation 1 Classics (#4802 and #4804)

This month RPCS3 gained the ability to run PS1 Classic titles!

The PlayStation 3 has various types of software and hardware emulators for the most of Sony’s previous generation consoles. For the PS1, 3 software emulators were present within the firmware, namely ps1_emu (runs PS1 discs), ps1_netemu (runs PS1 classics available on the PS Store in .pkg format) and ps1_newemu (supposedly an enhanced version of ps1_netemu). However, similar to VSH, these emulators call sys_storage directly instead of using the file access library. Since RPCS3 currently has no implementation of sys_storage, support for these emulators wasn’t possible.

However, while researching VSH functionality for RPCS3, clienthax discovered that ps1_newemu did not require sys_storage implementation which allowed PS1 classics to boot when the firmware libraries loading was set to ‘none’. However, games would still crash shortly after booting as they called on an unimplemented function, sys_io_3733EA3C, to get input data. Further debugging revealed this function to be cellPadGetDataExtra with a few additional checks. Simply returning the same function fixed the crash and allowed the PS1 Classic titles to progress ingame!

Soon after clienthax’s PR was merged into master, Nekotekina made various improvements surrounding PS1 emulation such as allowing these titles to boot from the recents list, fix PPU and SPU cache from generating multiple times when ps1_newemu only requires it to be done once and allow custom per-game settings for these titles.

Thanks to above contributions, RPCS3 gained the ability to run PS1 Classic titles! While RPCS3 only supports PSN versions of them, most (if not all) are playable and run well. Below are some screenshots from various titles:

MSAA rewrite and Depth Scaling fix (#4698)

Right at the beginning of the month, kd-11 began reworking the MSAA related parts of the codebase. This endeavour resulted in a number of games being fixed, particularly games which suffered from an issue where half of the screen was missing or displayed garbage. But how did an anti-aliasing technique have such an effect on the render output? Let’s dig deeper to find out!

MSAA (or Multisample Anti-Aliasing) is a form of spatial anti-aliasing, designed to get rid of outer-edge aliasing, more commonly known as ‘jaggies’. Since it’s widespread popularity in the 2000s, pretty much all mainstream graphics chips have an inbuilt hardware accelerated support for it – with a different implementation vendor-by-vendor. This resulted in a sticky situation for the emulator: since we can’t access MSAA data directly on the user’s card, we have to fake doing it for the sake of game compatibility, and then in reality, either scrape the AA entirely, or switch to full-on SSAA. While the latter sounds more preferable, it isn’t entirely practical just yet. That is why currently the former option was deployed, but it wasn’t without a catch.

There are multiple MSAA configurations that game developers can utilize. For example, they can pick 2xAA (double horizontal res.), 4xAA (double horizontal and vertical res.), and even switch this quickly between render passes, whilst retaining the actual dimensions (e.g. between 2xAA 1280×720 and 1xAA 2560×720, the buffer would be sized 2560×720 regardless). Due to this however, when such an event occured in games like Tales of Vesperia or Killzone 2, it resulted in having the former pass’ buffer being falsely detected as 1280×720, making the contents of it only filling the left of the adjacent pass’ buffer. kd-11 managed to fix this by keeping track of the actual buffer size, so that the buffers are now rescaled in-between these switches, ensuring that the contents are properly aligned and no squishing happens when the game finally decides to scale everything back to the target resolution.

This issue escalated in games like Backbreaker, where the resolve is handled in a feedback loop with the ROP writing to the same memory block that contains the MSAA samples its reading from. In such cases, just keeping track of how to change the buffer’s size isn’t enough. To alleviate this, kd-11 brought in separate states, called read and write states, which ensures that the MSAA resolves correctly and no image-squishing occurs. With this, Backbreaker finally gets its justice:

Depth scaling was also touched upon while making these changes, as stencils are required for MSAA to work properly. However, since stencil writes are not allowed when writing depth with shaders, further trickery was necessary. To work around this issue, kd-11 implemented a solution where stencil data are now “faked” as color textures, so that they can be transferred to the target texture memory without API constraints and driver limitations. This allows MSAA resolution to now work correctly with stencils.

SPU Analyser Improvements (#4750)

Nekotekina merged several improvements to the SPU about halfway through the month, resulting in better performance in games and cleaner compilation. Neko explored the experimental concept of “big blocks” for the ASMJIT recompiler, which can improve performance in games by bundling more code into chunks, meaning less time is spent on code verification. Neko added three separate modes labeled “Safe”, “Mega”, and “Giga”. The Safe mode only compiles small, select chunks of code together. The performance benefit here is much smaller than Mega or Giga, but it has a substantially higher success rate. Mega mode will compile entire functions at once, with Giga mode going a step further by stringing together multiple functions into the same chunk. While Mega and Giga mode are much less stable than the Safe mode, the CPU time required for code verification is drastically reduced, sometimes being orders of magnitude lower.

SPU LLVM code generation was also improved by Nekotekina this month. The groundworks for some major optimizations were set which will allow for cleaner compilation. Once all is said and done, this should result in less garbage code being compiled. For a more detailed description on the above changes, please refer to Nekotekina’s Patreon post here.

Games

Yakuza Kenzan

Thanks to jarveson’s fixes, this beloved AAA PS3 exclusive has gone ingame! Though the graphics looks stunning, the game suffers from low FPS and occasional texture flickering (as shown in the third image).

Dynasty Warriors Gundam

Thanks to Farseer2’s fix for sys_spu_thread_connect_event, this console exclusive went from Loadable straight to Playable!

Tekken Tag Tournament 2

Thanks to the work done by kd-11 in fixing the half-screen bug, this console exclusive is now considered Playable! However, Tekken Tag Tournament 2 still has other lingering issues such as silent intro dialogues and background music while also requiring “Strict Rendering Mode” to be enabled for the Fallen Garden and Heavenly Garden stages to correctly display. Enabling Write Color Buffers also fixes black patches appearing on characters clothing, however there’s still an issue where some of the clothing incorrectly renders as being grey/white.

God of War: Ascension

God of War Ascension is yet another game to be improved by kd-11’s fixes to MSAA, the graphics now properly fill the screen! However, this title still suffers from low performance and various graphical issues.

Final Fantasy XIII, XIII-2, XIII Lightning Returns

This month, all 3 installments of Lightning’s Saga went ingame! The games, however, still suffer from low FPS in some areas and minor graphical glitches which keeps them from being playable.

Sly Cooper and the Thievius Raccoonus

This Playstation exclusive went from Intro straight to playable this month after one of our testers “Asinine” finished the game from start to end on RPCS3! Take a look at the video below to see just how well it’s running!

Sly 2 and 3

Similar to Sly Raccoon, these PlayStation exclusives also saw a major boost in compatibility. Both Sly 2 and 3 now go ingame! Each of these games suffer their own set of issues, Sly 2 will give players a black screen at certain parts of the map and has random crashes, while Sly 3 suffers from worse performance and issues with certain levels where there is two cameras. Both Sly 2 and 3 also currently have issues with the auto-save feature and require manual saving and make sure to save twice in the same slot or it won’t create save files properly! This is only necessary with Sly 2-3 and another game, “Rune Factory Tides of Destiny”.

Ratchet & Clank series

Thanks to the “Kot fixes” by isJuhn, various Playstation exclusives developed by Insomniac Games now progress further. Among them are R&C Future: A Crack in Time, R&C Into The Nexus, R&C: All 4 One and R&C: QForce (Full Frontal Assault) now reach Intros. Further improvements are in the works to help few of these titles progress even further!

Resistance 3

With the above mentioned fix, this AAA Playstation 3 exclusive renders the opening cutscene but crashes before going ingame. Upcoming improvements are expected to benefit this title further!

Wheels of Destruction

This PS3 exclusive is now fully playable!

Sakigake!! Otokojuku-Nihon yo, Kore ga Otoko de aru!

Yet another weeb PS3 exclusive title progressed to playable this month!

Wakeboarding HD

Thanks to elad335’s MFC list fixes, this casual sports PS3 exclusive went ingame. This title however is prone to crashes and lose of audio. Do remember to disable the native UI during installation of game data to avoid crashes.

FIFA Street

Fifa Street, which is exclusively on consoles made it’s way ingame this month! Though FPS is at a stable 60, Fifa Street, like many EA Sports games suffers from broken physics which means you can’t move around properly. There is also some graphical issues where the players are missing parts of their bodies. So, despite a stable 60fps this game still needs more improvements before it can be considered playable.

Commits

Nekotekina

4705 – Added an option to disable SPU cache generation; Minor SPU ASMJIT and analyser improvements targeting safety (compatibility) and reducing the amount of garbage being compiled: Add ‘Accurate GETLLAR’ option in Debug tab and improvements to PUTLLUC/GETLLAR transactions to fix a regression on TSX-enabled processors; Added a progress dialog for SPU module compilation;

4742 – Fix returnable STOP, STOPD, SYNC, DSYNC in Safe mode and returnable STOP in Mega mode for SPU ASMJIT; Add ‘Accurate PUTLLUC’ option in Debug tab and minor changes in GETLLAR/PUTLLUC transactions; Fix cellGameContentPermit bug caused by 4721;

4750 – Implemented concept of big blocks for ASMJIT recompiler, see coverage in major improvements; Fixed mixing progress by building SPU cache after PPU; SPU ASMJIT now uses the same spu.log location as SPU LLVM; Improve spu.log disasm and trampolines which is now unified with SPU ASMJIT; Improvements to SPU LLVM with support for Mega/Giga modes, implementation of function chunks table, use of PHI nodes for value visibility across basic blocks and a simpler memory manager. Also, simplified code by using root config location for /dev_flash/ and hiding Emu.GetEmuDir() function due to the risk of misuse;

4801 – Updated LLVM commit to newer release, fixed SPU ASMJIT for SSE2 CPUs and restored /dev_flash/ config;

4804 – Fixes for booting PS1 Classics, see coverage in major improvements.

kd-11

4698 – “Simple” fix, includes FIFO reordering, depth scaling and MSAA fixes, see coverage in major improvements;

4752 – For the Vulkan renderer, Implemented type-agnostic transfer (e.g rgba16f to rgba8 memory) which fixes lighting in some situations, basic implementation of compute transactions to offload some calculations from the SPU and fixups for the RADV driver. Also, minor theoretical fixup for texture cache and improved read prediction for synchronized resources (WCB or blit engine) which significantly reduces the number of hard faults and lowers latency by eliminating unexpected readback;

4784 – Fix memory region pitch inaccuracy as region pitch of 64 (disabled) can also be used to indicate packed contents instead of the actual pitch which improves lighting in some titles. Also, fixes interaction of AA factors with lockable_region size;

4794 – Improves buffer synchronization logic which fixes ‘zoom’ when using WCB/CPU blit and upscaling resolution; Replace all memory block operations including endianness swapping and format conversions using compute for vulkan (the driver automatically does this step for OpenGL); Reimplement framebuffer access, loosen up memory relocking logic and implement forced reads if self-referencing active render targets; Update glslang to a much newer version which fixes broken SPIR-V.

elad335

4769 – Fixed the size of the MFC list elements read by ignoring the reserved bit. This PR allowed Hitman Sniper Challenge and Wakeboarding HD to move from Intro to Ingame!

4791 – Cleaned up some files, enabled shaders directory creation to be handled once on emulator initialization instead upon every shader creation;

4795 – Fixed the RSX base address which allows vsh.self to interact with the RSX and resolve related crashes;

4810 – Fixed regression to the RSX capture tool caused by the previous PR;

4825 – Removed second IO address translation and validation which makes RSX command reading more efficient.

isJuhn

4715 – Fixed cellGameCreateGameData temporary directory path where some games crash when using async cellfs to incorrectly attempt to access the temporary directory on dev_hdd0 instead of dev_hdd1. Setting the path for the temporary directory to dev_hdd0 allowed Aliens: Colonial Marines to go ingame!

4721 – Fixes a bug where the emulator would return the path to a non-existing gamedata folder when cellGameContentPermit was called on gamedata without calling cellGameCreateGameData first. Now in such cases, it will simply remove the content_permission. This PR allowed Game of Thrones: A Telltale Games Series to become playable, PES 2010 to go ingame and PES 2011 to reach Intro!

4806 – Certain titles by Insomniac games use unsupported methods for reservations. Since these titles always write with the same value (0xAAAAAAAA) when they fire an LR event, a workaround for this issue has been implemented. This PR allows Ratchet & Clank – A Crack in Time, Into The Nexus, All 4 One and QForce along with Resistance 3 and Fuse to move from Loadable/Nothing to Intro!

clienthax

4802 – Support for PS1 Classics, see coverage in major improvements.

Megamouse

4681 – Fixes some complaints for the Discord-RPC integration after its initial addition. It can now be disabled in the GUI settings and you can also customize the status for your idle state (when you don’t run any game but have RPCS3 open). You still have to restart RPCS3 to disable Discord-RPC completely though due to an upstream bug;

4709 – This fixes a bug where the Qt Dialog progress bars never reaches 100%, they always stopped at the last update before completion and stayed in that state until the game started showing its own frames. This was caused by a multitude of simple bugs; Also, switches the progressValue int pointer to int, handles file access error in cellSaveData by returning a verbose error instead of just fs::file is null, removes old (now unused) code for the wonderful PPU module compilation wall of dialogs, adds taskbar progress to all progressbar dialogs and introduced taskbar progress for the native UI in the thumbnail of the gs_frame (game window) which was implemented by adding a callback for the gsframe;

4739 – Adds counters to the “Find Dialog”. You can now see how many unique hits as well as hits in lines any of your searches in the log produce (use ctrl+f);

4729 – Fixes a few old bugs as well as new bugs that slipped in during 4709. Qt progress bars actually don’t update if you add a value that would make it exceed 100% (duh). So the new value was clamped to be inside the progress bar’s range. It also fixes a missed broken end condition in the native UI’s progress bars;

4740 – Added an option to create notes to a game by right-clicking it and choosing “Edit Tooltip Notes” which will open a dialog in which you can edit that game’s tooltip notes. Whenever you hover your mouse over a game’s title or name you will see the note displayed as well as the game’s name and title; Added an option to quickly copy the game name, serial or both in Name [Serial] string that can be used to quickly search for the game online or opening a new thread on our forums; Also, fixed some minor bugs with the game list;

4766 – Implements the “Enable TSX” combobox originally introduced by @NeoRetro in 4486. This combobox in the settings dialog let’s you disable or enable it at your leisure in order to benchmark the differences between the code branches, work around specific bugs or test for regressions. Also, some Haswell or Broadwell CPU models support TSX while some don’t, and others can only support it after unlocking it with a BIOS/microcode downgrade. If you have such CPU models with a microcode which has enabled TSX, you can set the TSX combobox to “Forced”, which will produce a warning that will let you decide if you REALLY want to enable it, since it may be harmful for your CPU. The state “Enabled” won’t work in such cases;

4777 – Simply adds the option to boot games by pressing enter or return while having an item selected in the game window which should help keyboard users;

4770 – Discord integration fixes and follow up for 4681. Fixed the new discord settings’ save behaviour inside the settings dialog which was applied regardless of accepting or cancelling the settings. Also, Discord code was moved to its own interface to streamline fixes to one place. Fixed incorrect behaviour in which the status often wouldn’t really update after you booted a game due to placing the update method in the wrong part of the boot process, which was never executed in some instances;

4783 – Fixup for 4709. Since the gs_frame’s taskbar progress will stay unchanged during a game session due to its members’ persistence, unlike the msgdialog, a reset function was added which is used whenever the native UI progress dialog closes;

4760 – Fixes the compatibility database download; Fix icon size actions not always being updated in the menu; Add more options to change trophy manager icon sizes (mousewheel, ctrl +, ctrl -); Disabling discord-RPC now uses Discord_Shutdown after upstream got patched; Adds “Delete SPU Cache” functionality; Use Qt to find and delete files; addresses issue 4725 (settings dialog tabsize); addresses issue 4717 (close config files).

hcorion

4685 – Fixes #4682, Fixes a bug where a failed branch appveyor build may take up the master versioning and future builds of that commit will fail to be renamed as there can’t be duplicated versions;

4669 – Unify Linux detection in CMake and Convert all spaces to tabs in CMakeLists.txt;

4699 – As AppVeyor has decided to no longer host binaries older than 6 months, windows binaries will be deployed through Github releases;

4744 – Fixed a null-deference which occured in the configuration dialog for evdev controllers;

4605 – Prefer GLVND for OpenGL rather than legacy and enable wayland for AppImages;

4780 – Make register editor dialog work in debugger.

scribam

4652 – cmake: simplify glslang integration;

4497 – 3rdparty: update stb_image.h and stb_truetype.h;

4741 – qt: rewrite syntax highlighter;

4745 – qt: fix asm instructions highlighting;

4720 – yaml-cpp: update submodule and build integration;

4748 – asmjit: update build integration;

4733 – libpng: use official repository instead of the fork from RPCS3;

4757 – zlib.vcxproj: remove PreprocessorDefinitions “Z_SOLO”;

4719 – pugixml: update submodule and build integration;

4778 – Allows RPCS3 to build on Linux when system zlib is not found and on Windows using CMake.

jarveson

4704 – Removed unnecessary discord debug libraries;

4728 – Fixes for 32 bit SPU elf that has compression flags, relocations that uses 0xff as an index value and trophies where the structs are zeroed out before use. Also fixes image_in and swizzled CPU transfers. This PR allowed Yakuza Kenzan and Counter Strike: Global Offensive to finally go ingame!

VelocityRa

4727 – Refactored the Performance Overlay and also added options to customise the position, font, margin width and background opacity of the overlay.

Farseer2

4764 – Fixed a bug where sys_spu_thread_connect_event would fail valid queues. This PR allowed WRC 5 to go ingame and Dynasty Warriors Gundam to become playable!

JohnHolmesII

4697 – Update Arch install directions in the README.md and typo fixes;

4800 – Update the links to the precompiled LLVM and additional libraries in the README.md.

Cabalist

4828 – Fixed python white spaces and switch to .format() strings.

jbeich

4788 – Unbreak build on FreeBSD.

Zangetsu38

4762 – Remove unnecessary .gitignore files and win32 config from the repo.

Talkashie

4751 – Disable GPU Texture Scaling by default.

jjsat

4732 – Fix VSLO and VSRO in the LLVM PPU recompiler which helps improve vertices rendering in various titles including Deus Ex Human Revolution and Batman Arkham Asylum.

al3xtjames

4707 – Add additional dependencies needed for evdev and ALSA support for Fedora to README.md.

Dravonic

4677 – Parallel shader cache loading using all available threads during the initial shader compilation process for the Vulkan renderer.

Daniel-Valentine

4658 – Delay GDB server launch until emulator run to fix few segfaults.

ikki84

4634 – Return offline instead of cell_ok for sceNpManagerRequestTicket2 when the PSN connection status is offline.

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 has two full-time coders that greatly benefit from the continued support of over 800 generous patrons.

Also, come check out our YouTube channel and Discord to stay up-to-date with any big news.

This report was written by Asinine, eladash, HerrHulaHoop, Megamouse, nitrohigito and Talkashie.