PS3 Native is the only Frame limit mode that honours the game's own cellGcmSetFlipMode(CELL_GCM_DISPLAY_VSYNC) request: in handle_emu_flip every other mode falls through and flips immediately, while that one defers the flip to a real vblank. A title that paces itself to 30fps by flipping on alternate vblanks therefore free-runs to the 60 cap under Auto, our default -- reported in issue #77 as Tales of Symphonia running at 60 and battles playing too fast. The mode already existed and Rpcs3Settings could already write it, but nothing reachable from the UI ever did: the only control is the Display FPS Cap row, which maps to numeric presets or Second Frame Limit. It was reachable solely as a raw core override. That also explains the reporter's follow-up -- capping by hand does slow the game, but through the wall-clock limiter, which pushes flips off the vblank boundary and brings tearing and audio glitches with it. Added as -1 in that row rather than as a new setting, since it is mutually exclusive with a numeric cap. Both clamps on the way to the core floored at 0 and would have quietly turned it into "no cap". setFrameLimitEnabled needed the same widening. It runs last, so its `cap > 0` test read -1 as "no explicit rate" and wrote Auto back over PS3 Native -- the collision its own comment describes, one value along. Deliberately NOT the default: with no vsync request from the game this mode applies no limit at all, so titles that never ask for vsync would run unbounded.
ARMSX3
Uses the latest RPCS3 upstream code (the recent ARM64 improvements included).
Building
arm64-v8a and armv8.2 is supported. You need the Android SDK with NDK r27 or newer, CMake 3.30 or newer, and a JDK 17. Android Studio ships all of these.
Clone with submodules, then fetch the two third party checkouts that are not submodules:
git clone --recursive https://github.com/ARMSX2/ARMSX3.git
cd ARMSX3
git clone https://github.com/SnowflakePowered/librashader 3rdparty/librashader
git clone https://github.com/bylaws/libadrenotools android/armsx3-ui/app/src/main/cpp/libadrenotools
Build the core. This is the long part and produces an unstripped library of around 1.3 GB:
export ANDROID_HOME=$HOME/Library/Android/sdk
cmake -B build-android -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_HOME/ndk/<version>/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-31 \
-DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build-android --target rpcsx-android -j8
Strip it and put it where the app expects it:
llvm-strip --strip-unneeded build-android/android/libarmsx3-core.so
cp build-android/android/libarmsx3-core.so \
android/armsx3-ui/app/src/main/jniLibs/arm64-v8a/
Then build the app:
cd android/armsx3-ui
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
./gradlew :app:assembleRelease
The apk lands in app/build/outputs/apk/release/.
Note that the core library has to be rebuilt and copied again whenever anything under rpcs3/ or android/src/ changes. Gradle does not build it for you.
The Discord Social SDK is proprietary and is not redistributed here. Get it from Discord's developer portal and drop it in app/libs/ and app/src/main/cpp/discord_sdk/ if you want that feature. The build skips it otherwise.
Running it needs PS3 firmware, which is not included. License
GPL-2.0-only, the same as RPCS3. See LICENSE. Some files may be licensed differently, check the file headers.
Based on RPCS3, https://github.com/RPCS3/rpcs3