Skip to content

ARMSX3 0.5

Latest

Choose a tag to compare

@jpolo1224 jpolo1224 released this 11 Aug 21:01
· 1 commit to master since this release

ARMSX3 0.5

What's new:

Spider-Man: Web of Shadows now works and went from around 120 ms a frame to around 37 ms on my SD8Gen2, and no longer freezes shortly after the first cutscene. Most of that speedup is not specific to this game. Every time the emulator flushed its command buffer it also drained the presentation queue, and the Vulkan call that checks whether a frame is done blocks on Adreno instead of answering immediately, which it does on desktop drivers. That one call was 14.6 ms of every frame, spent waiting on a GPU that had usually already finished. It is now 0.03 ms. Anything that flushes often should gain, so worth testing broadly. The freeze was separate: an occlusion query left open when a render pass ended, which the driver never completes, so the emulator waited on a result that could not arrive. All 21 places that end a render pass now close their queries first, and a query that somehow still goes unanswered is abandoned after a few seconds with a warning rather than hanging the game.

The thread scheduler now leaves core assignment to Android. It was pinning threads to a fixed set, which on an 8-core big.LITTLE phone confined six SPU threads to four cores while the rest sat idle. The OS is better at this than a fixed map is, and I would rather it place threads than guess for every SoC. You can experiment with the thread affinity options in performance settings.

Sonic Unleashed and the God of War III demo now boot. Both were hitting the same thing: an SPU block the ARM64 recompiler cannot compile hands the thread to the interpreter, and on ARM64 that fallback called an interpreter that executes nothing. It now runs the interpreter that actually works, and only for the one block that failed, releasing the thread back to compiled code as soon as execution moves past it. Anything that failed to compile landed there, so this should help any game with the same problem.

Fixes:
R2 now works in Spider-Man: Web of Shadows. Its web-sling prompt did nothing from the controller, from the touch overlay, or after remapping R2 to a different physical button. A DualShock 3 sends pressure bytes in every packet, and the press-mode setting controls how much of the buffer a game is told is valid, not whether the pad produced the values. We were clearing that area when press mode was off. Web of Shadows never turns press mode on but reads the R2 pressure byte anyway to decide whether the trigger is held, so it saw 0 where a console shows a press. The digital button was being delivered correctly the whole time and was simply not what the game looked at. Any game that reads pressure without asking for it was affected. Now works as intended.

Running out of video memory no longer looks like a hang. The renderer treated memory pressure at a point where it cannot be interrupted as fatal and killed the RSX thread, so audio kept playing and the picture stopped, which reads as a freeze. It now frees what is safe to free at that point, lets the allocator retry, and if it still cannot allocate it says so. I caught this issue in God of War III demo which hit this by skipping the intro screens, which pushes a burst of texture allocation through exactly that window.

Install .pkg and .rap files from anywhere, including storage the app cannot read directly. Split packages picked through the system picker are also sorted into part order now instead of being taken in the order you tapped them, which quietly produced a broken install if you picked part 2 first. PKGs and other files can also be installed to your SD card through SAF, your app folder must use the "SD card option", custom folder will still default to internal for PKGS for now.

Installed games and licenses are now listed by name.

A stalled compile worker can no longer strand PPU compilation. It waited on a worker that could already be gone, with the progress bar sitting still.

Save data no longer aborts the list where there is no media backend.

Games that repeatedly check a reservation from the same place no longer spin on it. The check ran in full on every iteration of loops that run millions of times.

Every language has been retranslated against the current English text, so strings added over the last few releases are no longer English-only mid-sentence.

The overlay icons the native UI has been drawing are actually shipped now, and the save menu should work now as well (please let me know if it still does not).

Settings and the running emulator agree again. Raw core overrides are applied after everything else, so an override left behind by an earlier build kept applying while the settings screen showed the default, with nothing on screen to explain the difference. Stale ones are cleared on upgrade. If you set something deliberately in All Core Settings it still wins, as before.

For developers:
The stall dump now includes SPU event, MFC and interrupt state, which is what made the Unleashed hang findable at all: it ruled out a lost wakeup, interrupts and a stuck transfer in one look, and left a thread parked at a fixed program counter with no flags set as the only reading that fit. A stuck vm::writer_lock reports which thread it is waiting on. The GPU and CPU profiler tables are joined on the same pass ordinal, so a render pass's GPU cost lines up with the CPU work that submitted it, and captures can be written to external storage.

The PS2 leftovers this codebase was still carrying are entirely gone.