From 6647c5a2bd71c3811fc6749e2d9bb78080407139 Mon Sep 17 00:00:00 2001 From: Cicero Hellmann Ratti Date: Wed, 1 Jul 2026 13:08:54 +0200 Subject: [PATCH] Fallback unsupported database SPU decoder on ARM64 (#18651) ## Summary - fall back from database-applied `SPU Decoder: Recompiler (ASMJIT)` to `Recompiler (LLVM)` on ARM64 builds during boot - log the fallback in `fixup_settings()` instead of letting SPU initialization fail later ## Problem `Need for Speed: Most Wanted [BLES01659]` receives `SPU Decoder: Recompiler (ASMJIT)` from the config database. On ARM64 builds that decoder is unsupported, which caused RPCS3 to abort during SPU initialization with `Unsupported spu decoder` while the UI remained on the loading screen. ## Validation - built RPCS3 locally on macOS Apple Silicon - booted `BLES01659` through the database config path with the custom per-game override temporarily removed - verified the log now shows the ARM64 fallback warning and `SPU Decoder: Recompiler (LLVM)` instead of the previous fatal error - observed the title proceed past the old boot blocker into active RSX program compilation --------- Co-authored-by: Elad <18193363+elad335@users.noreply.github.com> --- rpcs3/Emu/System.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/rpcs3/Emu/System.cpp b/rpcs3/Emu/System.cpp index 8f36b9a899..091d45e510 100644 --- a/rpcs3/Emu/System.cpp +++ b/rpcs3/Emu/System.cpp @@ -336,6 +336,20 @@ static void fixup_settings(const psf::registry* _psf) } } +#if defined(ARCH_ARM64) + if (g_cfg.core.spu_decoder == spu_decoder_type::asmjit) + { +#ifdef LLVM_AVAILABLE + constexpr auto arm64_spu_fallback = spu_decoder_type::dynamic; +#else + constexpr auto arm64_spu_fallback = spu_decoder_type::_static; +#endif + sys_log.warning("The setting '%s' is currently not supported on ARM64 builds and will therefore be changed from '%s' to '%s' during emulation.", + g_cfg.core.spu_decoder.get_name(), spu_decoder_type::asmjit, arm64_spu_fallback); + g_cfg.core.spu_decoder.set(arm64_spu_fallback); + } +#endif + if (const u32 psf_resolution = _psf ? psf::get_integer(*_psf, "RESOLUTION", 0) : 0) { const std::map resolutions