ARMSX3 0.4
ARMSX3 0.4
What's new:
Sonic the Hedgehog (2006) now holds 60 fps in normal gameplay on my SD8Gen2, where it previously could not. Heaviest scenes went from 42 ms to 24 ms a frame, roughly 24 fps to 42 fps. On average I am now getting 60fps when I was previously in the 30-40fps range in the hub world and in levels. Hub world in certain areas is still heavy on my device due to all of the geometry on screen at once, (40-50 fps in some areas and 60fps in others) but stronger devices should see better results. The emulator was waiting for the GPU to finish each frame before it began preparing the next one, so the CPU and GPU took turns instead of working at the same time. They now overlap. Unsure how many other games this may benefit, so worth testing. How much a given game gains depends on what was limiting it. Titles that split their work between the CPU and the GPU gain the most, that's where the two were previously running end to end. Titles limited by something else gain little or nothing: Batman: Arkham City is limited by waiting on the emulated PS3's own CPU and by memory readbacks the game requires, and is unchanged from these improvements on my device. This is specific to Adreno devices, this works around a Vulkan call that blocks on this driver and returns immediately on others. It uses slightly more memory and backs off automatically if the device runs short.
Fixes:
Resolution scale now applies when set before launching a game. It previously only took effect if changed while a game was already running, the value showed as selected but silently reset to native on every launch.
Backing up app data now includes your data. The backup looked for folders this emulator doesn't create, so it produced a near-empty archive and reported success. It now saves save data, trophies, licenses, controller profiles, patches and settings.
Installing a .rap license works now. Every attempt previously failed with a message about the file being corrupt. @Zulux91
You can select a game and its .rap together. Picking more than one file assumed they were parts of a split package, so this combination could only fail. @Zulux91
License-locked games are marked in your library, with an option to install the license, instead of simply refusing to boot. @Zulux91
Failed installs and failed boots now say why, instead of one generic message for every cause. @Zulux91
Uninstalling a game can also remove its shader cache, shown with its size, previously left behind forever, ranging anywhere between 7–58 MB per title. @Zulux91
Better CPU detection on recent handhelds, including Qualcomm Oryon, plus clearer hardware reporting in logs. @Zulux91
Games should no longer hang on every cold boot of PPU/SPU compilation. Several SPU threads running identical code each compiled it separately, racing each other to publish the result. This wedged the game's SPU startup, leaving its main thread waiting forever on a queue nothing would ever signal.
Fixed missing instruction-cache maintenance in the ARM64 JIT. Freshly compiled code was published without the cache maintenance ARM requires, so the processor could run stale instructions. This was never visible on x86, which has a coherent instruction cache. Symptoms would have been unpredictable crashes and hangs rather than one reproducible bug.
Installing a package can no longer unpack over your games folder. A package whose metadata gave a short or empty title ID wrote its contents directly into the games root. Reported as libraries full of asset directories, storage consumed with nothing listed as installed, and folders that survived uninstalling the title. It appeared random because it depended on the individual package.
Uninstall now lists only real titles. Every folder in the game directory was shown with an Uninstall button next to it, including the emulator's own internal directories, one of which would have deleted its lock state, and leftovers from failed installs. Game data installs are still listed on purpose, since those are worth reclaiming space from.
A per-game workaround no longer follows you into every other game. Once Uncharted 3 had been booted, its Stub PPU Traps setting stayed applied to everything launched afterwards, silently skipping instructions on any trap instead of stopping. Nothing on screen indicated it.
Firmware installation should no longer crashes on slower devices. The progress reporter leaked a reference on every update and released none, a firmware precompile emits thousands, filling the runtime's reference table until it aborted. It only appeared on slower devices because it was proportional to how long the install took.
The renderer now starts on devices with older Vulkan loaders. It requested Vulkan 1.2 unconditionally, and a loader predating that version can reject a higher request outright, so on those devices the renderer never started at all.
Fixed corrupted rendering in titles that move their transform constant pointer mid-draw. A barrier targeted the vertex program load register instead of the constant load register, so the move was dropped, every constant after it landed at the wrong offset, and the shader's upload position was overwritten at the same time.
Redundant vertex shader uploads are now actually detected. The check meant to skip them compared values that could never match, so every upload counted as new and forced a full shader re-analysis and constant re-upload on every draw.
Installed licences are now listed on the packages screen, so installing one leaves visible evidence.
Quieter logs, routine directory listings were being written as warnings.
For developers:
All profiling is off by default and costs nothing when off: enable RSX Profiler in settings to collect it.
The Vulkan GPU profiler now reports at all. Two bugs meant it produced no output: the draw region was never recorded, and the frame region opened only on a path most titles never take. Per-render-pass GPU cost, with draw counts, vertices, shader sizes, barriers and occlusion queries. Per-method timing, so RSX command handlers can be ranked by cost rather than by call count.
Render-pass teardowns and command-buffer flushes attributed to the code that caused them. The profiler now rebinds itself when you launch a second game without restarting, instead of silently reporting the previous game's thread. Mesa/Turnip driver options can be set via driver_env.txt in the emulator folder, confirmed in the log.