EE recompiler (arm64/mac):
- SYNC -> emit nothing (empty interp body); CACHE -> inline-interpret in-block
instead of block-terminating + single-stepping. Removes the dominant EE
interpreter-fallback cost (The Getaway: ~98% of single-stepped ops were these).
- recCancelInstruction: trap ops now unwind via a longjmp landing pad in
recExecute instead of aborting. Fixes The Getaway boot crash and any met-trap
crash across games.
- Native codegen for trap opcodes (TGE/TGEU/TLT/TLTU/TEQ/TNE + immediate forms).
- Add gated EE opcode-histogram diagnostic (AndroidEEOpHist.h, default off).
Controls:
- Custom stick mode: bind each direction to any PS2 button via the press-a-button
capture flow. Add "D-pad acts as Left Stick" toggle. Remove the redundant D-Pad
preset; fix the stick->button dispatch release clobber.
Touch layouts:
- Fix per-game layouts bleeding across games: resolve the serial from the core,
CRC fallback, never overwrite the shared Default profile from an in-game edit.
Library/UI:
- Titles under covers: fix clipping, add a version/edition tag, make the toggle
controller-reachable. Switch the title font to Bebas Neue (SIL OFL).
RetroAchievements / Hardcore:
- Disable cheats in hardcore (core + UI); non-cheat patches stay active;
save-states allowed with loading still blocked.
Also: quit / exit-to-launcher hotkey, setup data-location button, per-game input
profile auto-load.
Storage / setup
- GitHub flavor: opt-in All-Files "Custom Folder" for app data (memory cards,
save states, configs) that survives uninstalls. When all-files is granted,
ROMs are read via raw paths, so the SAF grant being dropped under all-files
no longer breaks serial scanning or game loading. The Play build stays
scoped-storage only (no all-files permission), unchanged.
- Setup data-folder chooser: clearer wording; the grant-access button updates
to "Custom Folder" immediately on return from granting.
Input
- Map analog sticks to D-pad or face buttons, per stick
- Analog (mode) button mapping for the DualShock2 analog toggle
Library / overlay
- Show game CRC in the info tab
- Time Played / Last Played tracking
- Keep the settings gear visible when on-screen controls are set to Never
- Backgrounding a running game opens the pause overlay instead of silently pausing
Audio / performance
- Rename "Time Stretch" to "Audio Synchronization" (PCSX2 2.7 naming)
- Fix rumble small-motor being routed to the large motor
- Custom Speed % and Display FPS cap sliders
- Mali Vulkan: enable framebuffer fetch when the device exposes ROAA
(no-op on devices without it) to avoid the per-primitive barrier blend path
- Write a .nomedia marker in the textures folder so PNG/DDS texture packs on
shared storage stop being indexed into the device gallery/camera roll.
Screenshots, cover art and videos are intentionally left visible.
- Setup wizard: render the storage error on the dashboard so picking "SD Card"
on a device with no removable card is no longer a silent no-op; fall back
cleanly to Internal storage with a visible message.
- Setup wizard: changing the data location (Internal/SD) after first setup now
prompts a restart so the new root actually takes effect, since the native
data root is pinned once per process and can't be hot-swapped.
- Setup wizard: trim the overlapping Internal/SD tap targets so taps land on
the intended choice.
New:
- Per-game touch control layouts, saved to a portable inputprofiles folder
- Controller rumble for Bluetooth and USB gamepads
- Open the app data folder from the menu
- Game Properties on long-press: copyable Title, Serial, CRC, region, path
- Rename Max FPS Cap to Frame Rate Control
Fixes:
- DDS texture packs no longer crash: clamp the DDS mip-level count to what the
texture size allows (dwMipMapCount includes the base image, so the old
level <= mip_count loop loaded one level too many and tripped the
CreateTexture mip assert)
- Game no longer stays paused after closing the menu or leaving touch-layout
edit mode; resume whenever the pause overlay is dismissed
- Global and per-game settings no longer bleed: re-hydrate settings when the
Global/Game scope toggle switches tiers
- Gamepad face buttons respond immediately at game load by re-grabbing the
surface focus on the running transition
- Audio no longer mutes on heavy game fixes: keep the output stream alive
across the settings-apply VM pause
Settings / library
- Export per-game settings to a portable, sparse gamesettings/<serial>_<crc>.ini (upstream FullscreenUI style)
- Compact performance settings boxes and in-game Play-tab bubbles for small screens
- Auto-scan library on boot; shelves wrap instead of scrolling sideways; gear moved to top-center; resume button next to close
OSD / frame pacing
- Add hardware-info and version OSD toggles
- Max FPS cap independent of emulation speed (present-rate cap, vsync-aligned for steady pacing) with an OSD readout
GS (ported from upstream PCSX2 2.7)
- Line-AA1 upscaling fix (GSRendererHW/GSDevice + tfx shaders) and shader cache version bump
- GS/TC OverlapsValid exact-target match; memory-map dump label fix; controller DB update (8BitDo Ultimate 2)
- GS/Vulkan: select the Mali runtime GPU profile so destination-reading alpha
blends run in-shader (alpha_mali_custom_set) instead of Mali's broken hardware
dual-source path - fixes Mali blend corruption on Vulkan without forcing
Maximum blending
- Input: add DualShock 2 pressure-sensitivity modifier (on-screen button plus a
bindable "Pressure Modifier" hotkey)
- Touch: extend the multi-touch hit-test layer to cover face and shoulder buttons
- Setup: replace the custom app-data-folder picker with an Internal/SD-card
app-specific choice (scoped-storage safe) and drop MANAGE_EXTERNAL_STORAGE
- Pad: capture D-pad bindings on devices that report it as a HAT axis
- SPU2: preserve the output stream's paused state across recreate (fixes audio
dropping out after using the in-game menu)
- Library: resolve cover art off the main thread for smoother scrolling
- OSD: cap the ImGui/overlay scale at 2x on high-resolution screens
- Build: release signing config and applicationId/version gradle properties
- Fix adaptive launcher-icon insets