Compiles; not yet wired. VKFrameGen still drives the old dlopen path and nothing calls these passes -- that is the next commit. Landing it here keeps the port and the switchover separable, because the present path is the part that has broken before. The implementation is Camille LaVey's, from eden-emu PR #4263, by way of ARMSX2 2.6.6.8. She licensed it GPL-2.0-or-later for use here: ARMSX3 derives from RPCS3, which is GPL-2.0-ONLY with no "or later" clause, so the original GPL-3.0-or-later terms could not be carried across. Every file records that. Eden is unaffected -- "or later" leaves its own use exactly as it was. Why it is worth having: the current implementation runs behind a dlopen'd .so with its OWN VkDevice, so every frame crosses devices as an AHardwareBuffer -- allocated, imported on our device, handed over, imported again on theirs. These passes run on our device in our own present path and that round-trip disappears. It also brings adaptive pacing: instead of a fixed x2, generate as many frames as it takes to hold a target refresh rate, which is the answer to a game oscillating between 60 and 30 on a 60Hz panel. Porting notes, all of it concentrated in three seams rather than spread: - LsfgVkCompat's Device adapter wrapped GSDeviceVK and now wraps vk::render_device. 28 of the 31 files never mention either and were not touched. - GSConfig lives in FrameGenConfig.h, mapping RPCS3's mode enum and cfg fields to the names the passes read, so a later merge from Eden touches passes not wiring. - LosslessDll's platform calls (FileSystem/Path/GSXXH) became fs:: and an inline FNV-1a; the hash only has to notice the DLL changed since the cache was written. Two changes outside the tree were prerequisites, not cleanups: - vkCreateDevice now ENABLES vulkanMemoryModel and robustness2's nullDescriptor when the device reports them. Both were already probed and never enabled, and a shader that declares the memory model on a device where it was not enabled is invalid usage rather than a soft fallback -- desktop drivers shrug it off while Adreno takes the device down mid-frame, so it would have looked fine until it was not. Only nullDescriptor is turned on, not robustness2's expensive half. - The Android Vulkan loader gained vkFreeDescriptorSets, which it never loaded. New settings: Frame Generation Target Rate (0 = fixed multiplier) and Frame Generation Lossless Path. Nothing ships the shaders; they are read from the user's own legitimately purchased copy, exactly as before.
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