ARMSX3 0.9.7
What's new:
Games:
Batman: Arkham City, fixed the GPU hang on 8 elite devices. The cause was the graphics-to-compute engine transition on Adreno 830, not the number of dispatches: the 32/16 byteswap and the D24S8 depth gather now run as fragment-shader passes on the graphics pipe instead of compute dispatches, and textures large enough to matter no longer take the GPU conversion path at all. Compute dispatches per frame went from over ten thousand to one. Both the batsuit drop and the Two-Face cutscene pass. The graphics-pipe conversions are gated to Qualcomm GPUs. (This may help other games as well).
Minecraft, fixed the hang and the texture colour corruption. The readback byteswap was rewriting guest memory including stride padding the DMA never wrote; it is now off by default. (This may help other games as well).
The RSX no longer desyncs its handshake with the guest when a label is slow: it waits the driver timeout rather than ten times it, which had turned a single slow frame into a permanently offset producer/consumer pair.
Stability:
A lost GPU device now stops the emulator cleanly instead of killing the RSX thread, which presented as a freeze with audio still playing and no way to close the game. The loss is latched at every wait in the RSX loop rather than three of them, recovery is bounded to two attempts, and the swapchain is never rebuilt on a lost device.
Bounded the OUT_OF_DATE swapchain acquire retry instead of spinning forever, and the per-flip acquire loop with it. The SUBOPTIMAL rebuild latch is cleared when the surface is actually rebuilt, so one suboptimal frame no longer pins the swapchain into permanent rebuilds.
The vblank source no longer terminates itself when a single vblank event fails to send. One lost event used to leave the guest hung after gcm init with everything looking idle.
Fixed several Vulkan spec violations found with the validation layers: two in device creation, touching un-acquired swapchain images, a stale feedback-loop layout, and a hardcoded compositeAlpha that is not always supported. Multi-draw is gated on the resolved function pointers rather than the feature bit.
Crash reporting restores debuggerd rather than SIG_DFL when the fault handler re-enters, and the foreign-fault report is capped so it cannot stall ART's garbage collector.
Performance and battery:
Three places where the emulator was burning CPU while doing nothing useful. None of these change how anything looks, they free up CPU time and stop the phone heating for no reason.
Waits that were meant to send a core to sleep were spinning at full speed instead on Snapdragon 8 Elite class devices, both in the graphics command loop and in the memory system. They now sleep properly.
Textures were being handed back and forth between two states on every transfer, every time, for no benefit. That work is gone.
The log no longer fills with a shader warning on every shader compile.
Audio:
New Recording-compatible audio toggle. Oboe's low-latency path uses an MMAP stream that Android's AudioPlaybackCapture cannot see, so screen recordings captured no game audio even though it was audible. Turning this on trades a little latency for recordable audio. Also fixed a pause storm in the Oboe backend.
Settings:
Fixed an issue where games would run uncapped.
Max SPURS Threads is no longer silently written into a per-game override when you never asked for one. It was persisting itself per title, so a value you set once followed that game around invisibly.
All Settings chosen in All Core Settings can be filtered down to just the settings you have actually overridden, so you can see at a glance what you have changed away from the defaults, with a forget button per-setting.
Upstream (84 commits from RPCS3):
@kd-11 (41 commits), a large rebuild of the blit engine and surface cache. Blitted images should be sharper and more correct: interpolation is no longer applied when the game did not ask for it, the swizzle flag is carried through properly, BGRA8 format selection is fixed, and blit targets no longer straddle tile boundaries or conflict on pitch. A framebuffer section leak was fixed, and the RSX generates far fewer memory faults when the CPU touches memory it does not care about. Blit engine upscaling is enabled again, it had been switched off upstream as a temporary measure while this work was in progress, and upscaling now applies to blit resources too. Separately, two broken ZCULL optimizations are fixed (both tested for an exact copy length where a partial copy is legal), guest synchronisation with host GPU operations is improved, and NV4097_NOTIFY now forces a backend sync because notify ticks are strongly ordered.
@elad335 (7 commits), savestate fixes for sys_prx and sys_overlay.
@Masamune3210 (2 commits), unpkg path normalization and canonicalization failure handling.
@WalterKruger, SHUFB known-constant fast paths in the SPU LLVM recompiler.
@Yahfz, rsx/fp SAT and ABS modifier precedence.
@Acts1631, bounds-checking Cg binary byte swapping.
@RipleyTom, ticket encoding check.
All of this was tested on Turnip Gen8 V34/V35 on an Odin 3, thank you to the folks at AYN for sending me an Odin 3 for development! And a big thanks to Dash from The Bryant Review for getting me in contact with them! Be sure to check out their article on PS3 mobile emulation when it arrives!