github ARMSX2/ARMSX3 0.8
ARMSX3 0.8

5 hours ago

ARMSX3 0.8

What's new:

Starting with this update there will be four builds per release: legacy (Android 11+, sdk30, armv8.1), a11 (Android 11+, sdk30, armv8.2), a13 (Android 13+, sdk33, armv8.2) and a15 (Android 15+, sdk35, armv8.2). Pick the highest your device supports. The three armv8.2 builds are compiled for a newer instruction set (armv8.2-a+dotprod+fp16), letting the compiler use half-precision maths and dot-product instructions directly, and one of them is what you want unless your device refuses to run it. legacy exists only for older CPUs, Cortex-A53/A73 and similar, common in low-end Mali devices, which don't have those instructions at all, it's the same Android version as the a11 build and differs only in CPU target, so if a11 crashes on startup, legacy is the direct swap.

Saint Seiya: Sanctuary Battle (BLES01421), no longer stalls partway through PPU compilation and boots to a black screen. The cause was in LLVM, not the emulator: on AArch64 the register scavenger ran out of registers under the GHC calling convention, and because the failure aborted the whole module every function in it fell back to the interpreter. Our LLVM now creates the emergency spill slot that path needs. 231/231 modules compile. I've been sending all of my fixes to Whatcookie so ARMSX3 fixes like this one and Armored core should be fixed on other platforms at some point as well on the ARM64 backend. Because this is a fix to LLVM itself rather than a workaround for one game, any title that hit the same failure benefits, it showed up either as a boot that never finished compiling, a black screen on game start with the OSD locked up, or as a game running far slower than it should because whole modules had silently fallen back to the interpreter.

Sonic Unleashed: FMVs play correctly now. Same LLVM fix.

Extended dynamic state: the Vulkan renderer now sets cull mode, front face, depth test/write/compare and primitive topology per draw instead of baking them into pipeline objects. Far fewer pipeline permutations to compile and cache, which is where a lot of first-run stutter comes from on Adreno and Mali. Falls back automatically on devices without the extension. Thanks to @rfandango the dev of Xendroid for recommending this to me!

Frame Generation (Experimental): Lossless Scaling frame interpolation, at x2, x3 or x4. It needs your own copy of Lossless.dll from Lossless Scaling on Steam, nothing is bundled or downloaded. Import it once under Performance --> Frame Generation and the shaders are cached from then on, including across restarts. Two tuning options: Performance shaders (on by default, the lighter 3.1p shader set) and Motion detail (optical-flow resolution, lower is cheaper). Thanks to @CamilleLaVey from Eden for sharing his implementation with me! And @FrankBarretta for his LSFG-Android work!

Eternal Sonata: no longer floods with SPU "Invalid code" errors when the analyzer fails on a block, the recompiler now falls back cleanly instead.

God of War III: one out-of-memory event no longer disables the SPU cache for the rest of the session.

BLEACH: Soul Resurrección: fixed an ARM64 fault that was misclassified in a way that blocked every recovery path behind it.

Leisure Suit Larry: Box Office Bust (BLUS30331), the game copies its asset tree to an HDD cache during a short boot window and gives up when emulated I/O is slower than a console, then crashes at "New Game". That copy is now completed at boot. Gated to this title only. fixed by @Zulux91

Fixed a crash when the app loses its window, leaving the app during a game, or anything else that destroyed the drawing surface, could abort the whole process with Vulkan API call failed with unrecoverable error: Surface lost. Losing the surface is routine on Android, it happens every time the app goes to the background, and the renderer already treated it as recoverable everywhere except when rebuilding the swapchain, which killed the process instead. It now recovers, and tells the difference between a window that is merely minimized and a surface that has to be recreated before any retry can work.

This also removes the memory corruption that followed it: the fatal error tore down the graphics thread mid-operation, and destroying its ZCULL state then freed memory that was still being written. ZCULL teardown was tightened as well, so page references are released properly rather than left dangling across a restart.

Fixed an issue causing a black screen when launching a game straight after opening the app, the renderer waited for a drawing surface that had already been created, because Android delivers that notification exactly once and it was being missed. Rotating the device "fixed" it because a screen rotation forces a fresh one. The surface is now re-delivered, and a renderer stuck waiting says so in the log instead of hanging silently.

RSX semaphore waits, falls back to an event-stream wait on CPUs where the low-power wait does not park, rather than spinning at full rate. Includes two rounds of hardening. done by @Zulux91

Fixed some Log floods, repeated SPU unknown-instruction and halt messages are now rate-limited per opcode and per address. One tester's log went from 600 MB to 2 MB, and the log volume itself had been slowing the emulator down.

Frame generation memory safety, fixed a use-after-free where shared buffers were released while frame generation still had them in use, on any resolution or orientation change.

OSD color options now actually changes the OSD color.

OSD position can now be changed from the in-game menu.

Updated Brazilian Portuguese corrections and missing strings. done by @johnpetersa19

A warning:

Frame generation is experimental. It wants a steady frame rate. Interpolating a game that is already struggling usually looks worse, not better, generated frames land at the wrong moment when the real frame interval keeps changing, and that reads as judder. A locked 25 fps looks better than a wandering 28. The OSD also flickers with it on. The overlay and the game's own menus get interpolated along with everything else. That is how frame generation behaves, turning it off restores steady text. Toggling it during a game pauses for a few seconds while a second graphics device and the shader pipelines are built. It costs some real frame rate. It adds frames to the display without making the game run faster. Really only recommended on the strongest of GPU's.

(Let me know how the in app updater is now that there is four builds, choose by your OS and CPU).

Don't miss a new ARMSX3 release

NewReleases is sending notifications on new releases.