Progress Report: January 2018

Welcome back to the first progress report of the year. Quite a large number of fixes and improvements have been made already, and as you can see below from the big compatibility bump we are starting the year off strong. kd-11 has made some major improvements that increase stability and functionality including increasing performance with Ryzen and implementing a Native UI to RPCS3. While Nekotekina has continued to review people’s changes, making sure everything was in a good enough state to be merged, he continued to work on the core of RPCS3. Megamouse has also made many improvements to the way RPCS3 handles input allowing a bunch of games to progress further and he also fixed other issues with the UI.

Table of Contents

Major Improvements
Games
Commits
Upcoming

On the compatibility database statistics, over a hundred games moved out of the Nothing, Loadable, and Intro sections and in to Ingame or Playable. In addition, the Nothing section has now fallen below 2% of tested games, and hopefully Loadable will follow next. This means RPCS3 is on the right track to ensure accuracy and compatibility with the largest number of titles possible.

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

On GitHub statistics, 7,454 lines of code were added and 2,160 were removed by a total of 14 authors.

Major RPCS3 Improvements

Stability Improvements (#4012 & #4079)

kd-11 greatly improved the stability of RPCS3 in multiple ways; the first of which was allowing RPCS3 to recover when RSX threads desynchronized. This occurred frequently with Vulkan due to how fast the renderer is which resulted in games freezing with the “E {rsx::thread} RSX: Application has failed to recover, discarding FIFO queue” error. kd-11 made it possible for RPCS3 to reset to the last working state of the RSX thread allowing games to continue to run rather than crash. Many games were affected by this such as, Ni No Kuni, Playstation Battle All Stars, WipEout HD, God of War, Nier and many others.

kd-11 also reduced the chances users could get the VK_ERROR_DEVICE_LOST error when using Write Color Buffers and Vulkan. As such games that required the Write Color Buffers setting such as Demon’s Souls are now much more stable.

Major Texture Format fixes (#4093 – 729b49c9)

With the help of ZeroZero2018, kd-11 fixed many texture format issues on RPCS3. We now nearly pass the ps3autotests’ texture-format test, with only 3 test scenarios failing, down from failing 8 test scenarios before this fix.

Before and After output on RPCS3

Correct texture-format output on a PS3

OpenGL Performance Improvements (#4093)

RPCS3 now treats the entire attribute buffer as a fixed heap addressed with index offsets instead of using the “sliding window” approach which incurred overhead setting up the texture buffers. This was very expensive on NVIDIA drivers leading to very poor OpenGL performance on NVIDIA cards. Take a look at the video below to see just how much of a difference this improvement made.

Thread Scheduler (#4079)

kd-11 added a thread scheduler for RPCS3’s PPU, SPU and RSX threads. This was badly needed in Windows systems with Ryzen CPUs, as the OS scheduler fails to properly schedule the threads and made performance horrendous.

Due to the design of Ryzen CPUs, all threads that must be synced need to be assigned to a single CCX to avoid cross-CCX latency which kills performance. Users manually did this before by running RPCS3 on a single CCX by disabling half of the cores on process affinity. With this setting, the user must no longer do this manually. For Linux and BSD users, this option is disabled by default, but for Windows users this option is enabled by default.

Even if you don’t have a Ryzen CPU, it’s recommended you leave this option on, as it may benefit any of the following CPUs: Ryzen 5, Ryzen 7, Intel i3, Intel i7.

Gamepad profiles (#3978)

Megamouse’s biggest contribution this month was the addition of gamepad profiles. Prior to this you could only use one controller layout for each handler. This was extremely awkward since you basically had to use two different types of controllers to be able to use different layouts. This also meant that you could not play together on the same keyboard since technically both players would have to use the same keys. With the new functionality one can simply create a new custom named profile for the currently selected handler (e.g. XInput or MMJoystick) and start configuring. The profiles are stored and found in the new “InputConfigs” folder located in the RPCS3 root directory.

Now you can finally create profiles for a proper multiplayer experience or simply for your different games’ preferred layouts. (Maybe future work could add auto loading of pad profiles on a game by game basis with the custom configurations).

cellPad Fixes (#3980)

Many FIFA and Nascar games, plus a few others, were stuck on the start menu because no input was being registered. This seemed a bit odd since they kept running perfectly fine and no errors were being emitted. After some testing and debugging from megamouse it was apparent that these games called a few certain functions to define the pad capabilities and settings. The only problem was that they were called before the input thread could properly initialize any gamepads (or keyboards) and the code at the time just aborted then, leaving our gamepads in a state unusable for the game.

Normally games are smart enough to handle something like this by periodically checking the inputs, but none of these games did. Megamouse fixed this by setting the capabilities and settings even with disconnected controllers since those were stored regardless of the connection status. This allowed the affected games to accept inputs and all of them went ingame for the first time.

Native UI Implementation (#4011)

kd-11 Implemented a native UI (User Interface) for RPCS3 which allows developers to overlay interface elements on top of games. He has already ported over the trophy notification dialogs and created a new interface design for the native PS3 saving/loading seen below, as well as implemented a progress bar when loading pre-compiled shaders after launching a game and a notification of when RPCS3 is compiling shaders during gameplay. This helps users understand why RPCS3 is stuttering especially during the first few minutes of gameplay when there are a lot of shaders to be compiled.

One of the biggest benefits of these changes is that the interface can be rendered even when in exclusive full-screen and the new save interface is fully controllable with a controller! While some games may have already had their own save/load interface, games that didn’t required you to alt-tab out of them and click save/load which made it impossible to play with only a controller.

Games

Midnight Club: LA

Thanks to some improvements from ZeroZero2018 Lighting in Midnight Club: LA has improved drastically. The image on the left shows how this game displayed before the fixes, where lighting was not rendering properly.

Virtua Fighter 5

This is another title that received rendering improvements from ZeroZero2018 in conjunction with kd-11 in January. As you can see with the image on the left this game used to incorrectly render some light sources, additionally some objects are no longer incorrectly rendered as being red.

Wangan Midnight

This Japanese Exclusive PlayStation racing game went ingame for the first time during January, the only issue holding it back from being Playable is the stuttering audio when driving at fast speeds. Otherwise, performance and graphics are very good.

MLB The Show 09

The playstation exclusive franchise went ingame for the first time in January but speed is too slow to be playable at the moment.

The Bigs 2

Console exclusive baseball game playable at a constant 30fps.

Supremacy MMA

This console exclusive MMA game became playable this January.

Pachinko Games

Several PS3 exclusive Pachinko/Pachi-Slot games were found to be playable on January.

Castlevania Lords of Shadow 2

Although Castlevania: Lords of Shadow 2 is not a PlayStation exclusive, considering the graphical fidelity we found it to be very impressive that RPCS3 can run this title so well. Previously it would get stuck in the starting area of the game, now it can be completed with good performance, graphics and audio. Take a look at the video below of the game running at 1440p with a framerate that runs very close to the 30fps cap.

Landit Bandit

PSN Exclusive now playable.

Armored Core IV

Just one month after Armored Core V went ingame for the first time the fourth entry in the series also made its way into the ingame category this month thanks to Numan. As you can see graphics are quite broken but performance is very good.

Superstars V8 Racing

This multi-platform racing game also became playable in January, performance, audio and graphics are all good. Check out one of our users superb driving skills in the screenshot below.

Commits

As always, this is not 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 January. Many of the unmentioned PRs are simply small updates, fixes, and other small improvements, sometimes only to the GUI.

Nekotekina

4010 – Fixed a regression with some changes from the previous month which caused a Dead Space and Trails of Cold Steel 2 to no longer be able to boot properly.

4018 – Added a threshold parameter for the ALSA audio render, improved the game Restart function and rewrote SPU Instruction ROTH’s AVX512 codepath.

kd-11

4011 – Implemented Native UI which was already already detailed under the major features section here.

4012 – Allowed RPCS3 to avoid RSX thread desynchronization which was already detailed under the major features section here.

4053 – Updated Vulkan loader, glew dependencies for OpenGL (Linux) and packaged static libraries used to compile appveyor builds to the latest versions.

4079 – Added fallback path in dev_flash for native ui icons glyphs and fixed issue where vulkan would freeze if icons were non-existent. Fixed Z clipping using selective z clamping. Removed a conditional guess that has been properly REd, this fixed some issues with the blit engine texture cache. This Pull Request also implemented a custom thread scheduler and improved stability with Write Color Buffers, both of which was already detailed under the major features section here.

4093 – Improved Thread scheduler to give an even bigger performance benefit to Ryzen CPU’s. Implemented decoding of a shuffle flag in the low bits of the texture remap vector. Texture format fixes were also made which make rpcs3 pass almost all of the texture formats autotests. Removed a workaround in texture cache as it is no longer needed. Fixed some issues with overlays to avoid processing unsupported glyphs in font handlers. Partially fixed extended clamp range draws by trying to preserve z information for draws outside the [0.1] range if the clip extents allow it. And finally, increased performance with OpenGL (mainly affects Nvidia) which was already detailed under the major features section here.

4127
Implements swap control on linux when using openGL
Fixes the epsilon value that was replaced with decimal to fix nvidia issues back to the old value. It has to be very very small, 1.E-5 is not small enough, but 1.E-10 works well enough.
Fix a race condition during startup using qt dialogs
Clean up shaders by removing as much clutter as possible and only compiling subroutines actually used by the program. Makes decompiled spirv easier to read and should hopefully mean less work for the drivers as well.
Reuse sampler objects (vulkan) to avoid too many create/delete cycles. Wont do much for performance but its the right thing to do and it makes debugging alot easier.
Removes subpass dependencies on vulkan. They have a very high cost on AMD GPUs especially older GCN1 and maybe GCN2 cards and can easily drop throughput by 80%+ (Tested on R9 270x)

4136
gl: Use correct target for type when creating new textures. They are not always 2D
gl: Track stale cache entries for deleted textures. Avoids invalid texture getting bound to the pipeline when wcb is enabled
vk: Implement texture barrier for framebuffer feedback situations if strict mode is disabled. Strict mode bypasses all of this and just makes a duplicate copy which is the safest way to avoid the memory access hazard.
rsx: Improve framebuffer setup code. If pitch is 64, check the log2 dimension bits instead to determine size.

Megamouse

3978 – Implemented the ability to have custom profiles with different bindings for controllers which was already detailed under the major features section here.

3941 – Implemented a simple dialog with ctrl+f in the log widget to search for strings. This is very useful for developers who want to look for certain log messages without having to close the application and open the file first.

3995 – Implemented a setting to reduce the maximum number of threads RPCS3 uses to compile llvm modules. This setting obviously slows down compilation times however it’s useful for users who want to use other applications while waiting for games to compile without RPCS3 using too much system resources.

4000 – Next to fixing a minor index out of bounds issue in the gamelist and fixing some code to reduce annoying compiler warnings this Pull Request mainly fixed an issue where the register editor (a debugging tool mainly useful for developers) would not display any address initially.

4004 – This fixes a certain bug in the basic keyboard handler that caused button releases to not work as expected. The tested game “Top Gun” did not register the release properly and you had to press a different button before the first pressed button could be pressed a second time. This was fixed by setting the current key-values to “No Event” in case of a button release. Also some misc small preparations for future functionality were added.

4057 – On certain conditions the columns in the game list could be invisible after hiding and showing them again. They were technically shown and there but trapped between the other columns with zero width. To catch this a simple check was implemented that sets the columns to their minimum size in these rare cases.
The Pull Request also contains a fix by Nekotekina that solves a regression on cellGame introduced on Jarves’ #4043 PR.

4065 – On High dpi setups like using a 4K monitor with display scaling the pad setting dialog’s stick deadzone preview would be too small (the size it should be on normal scaling). This was easily fixed and should now work as expected.

4067 & 4070 – While configuring controllers in the gamepad dialog you can generally only configure the currently physically connected controllers. Since we know XInput supports a maximum of four similar controllers the pad list was adjusted to always show all of the four and make them configurable. Obviously you need to have them connected to actually make any changes.

4081 – After KD-11’s amazing native overlay was added some users noticed problems whenever they had no gamepad connected at the time a native dialog opened. This was fixed by moving the check for connected controllers to the correct place. The dialogs now just idle and wait for controller input instead of closing immediately. On a side note this PR also fixed an issue where gamelist icons would not be properly re-painted from stylesheets.

myfreeweb

3994 – Adds support for Vulkan on Linux Distributions running Wayland.

4048 – Detect Vulkan Xlib/Wayland surface support at runtime.

isJuhn

4050 – Stubs some functions in cellWebBrowser, allowing for Ratchet & Clank Quest For Booty to go ingame.

4113 – Prevents the selection of saves when there are no save files to load, which fixes many fatal access violations.

TGEnigma

4029 – Fixed gs_frame appearing on the incorrect monitor on multi-monitor setups.

4030 – Fixed building debug RPCS3 builds without LLVM.

4041 – Added an option in the debug tab to disable shader preloading and caching.

4109 – Fixed cellMsgDialog null pointer always being dereferenced. This was a recent regression which stopped Sonic Adventure from booting.

scribam

3996 – Scribam improved the cellSearch implementation in RPCS3. This improved Beat Hazard Ultra, Hatsune Miku: Project Diva F, Hatsune Miku: Project Diva F 2nd, J-Stars Victory VS, Kung Fu Rider, Pain, Pro Evolution Soccer 2009, Wipeout HD amongst other unknown games.

4144 – Registers some previously unknown functions from sceNpMatchingInt.

Inviuz (Numan)

4103 – Numan improved how RPCS3 checks for the cellSurMixer event queue. Some games do not set a mixer event queue name, which caused RPCS3 to get stuck indefinitely when creating mixer thread.

elad335

3993 – Elad335 made RPCS3 display the commit hash in the window title with non-master builds. This made it easier to identify which specific builds people were using.

4060 – Fixed RPCS3 throwing an undesired exception in SPU code.

4088 – Checks for a sync command before doing a list transfer on MFC (Memory Flow Controller). This fixes a regression which caused Jak and Daxter to no longer boot properly.

hcorion

4034 – Improved the way RPCS3 stubs the cellGameUpdateCheckStartAsyncEx/FinishAsyncEx function. This change allowed PAIN to go ingame for the first time.

4078 – Install icons to /usr/share and load them from there.

4115 – Updated clang to version 5.0 in Travis.

4118 – Fixed AppImage hanging before the UI loads with Linux.

jarveson

4043 – RSX (Graphical) fixes for image_in argument decoding / swizzle, which fixes some PSL1GHT blitting samples and CPU Blit mode in Age of Booty, and fixes RSX depth clipping issues, which is known to fix graphics in Vancouver 2010 and very likely in other games as well.

AniLeo

4052 – Fixes an issue with game list icons where they would have a fixed grey background rather than a transparent background.

Zangetsu

4077 – Stubs a sceNpSnS function to allow Mortal Kombat to go Ingame and fixes G8B8 texture format regression on OpenGL and Vulkan renders.

ZeroZero2018

4123 – Fix to B8 format render target swizzling. This fixed rendering issues with Virtua Fighter 5, Midnight Club: LA and surely more we haven’t found yet.

zekesonxx

4138 – Make fs::dir::open return false on failed metadata instead of crashing

zarroboogs

4139 – Improved AppVeyor script (for Windows builds) and included compatibility database file in new builds meaning users can finally see compatibility statistics on windows without needing to compile OpenSSL libraries in order to get them.

Upcoming

As a follow up to the cellPad fixes, the many input additions made by Megamouse, and the native overlay done by kd-11, Jarveson is currently working on a general input overhaul that should simplify all of the input handler code and also solve several issues with input connections e.g the Turtles or Simpsons problems, and also problems that came to light after the native overlay was introduced. Only after this has been done and rigorously tested for regressions can more input improvements be made. This could include the addition of DS3 and DirectInput handlers or some changes to the Pad Setting dialogs. Nekotekina is working on rewriting several of the PPU and SPU low-level parts of the emulator to improve accuracy and improve performance down to a per cycle basis.

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. As of last month, RPCS3 now has two full-time coders that greatly benefit from the continued support of over 700 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, Vongrak and Ani.