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:
Table of Contents
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.
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
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.
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!
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!
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, 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.
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.
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.
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.
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!
4802 – Support for PS1 Classics, see coverage in major improvements.
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).
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;
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.
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.
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!
4727 – Refactored the Performance Overlay and also added options to customise the position, font, margin width and background opacity of the overlay.
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!
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.
4828 – Fixed python white spaces and switch to .format() strings.
4788 – Unbreak build on FreeBSD.
4762 – Remove unnecessary .gitignore files and win32 config from the repo.
4751 – Disable GPU Texture Scaling by default.
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.
4707 – Add additional dependencies needed for evdev and ALSA support for Fedora to README.md.
4677 – Parallel shader cache loading using all available threads during the initial shader compilation process for the Vulkan renderer.
4658 – Delay GDB server launch until emulator run to fix few segfaults.
4634 – Return offline instead of cell_ok for sceNpManagerRequestTicket2 when the PSN connection status is offline.
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.
This report was written by Asinine, eladash, HerrHulaHoop, Megamouse, dio and Talkashie.