Uncharted-ARM

Uncharted-ARM is a port of Uncharted: The Nathan Drake Collection to Linux and Android for ARM devices, allowing gameplay on Snapdragon GPUs.

README

Uncharted: The Nathan Drake Collection for ARM (Linux and Android)

Leer en español · RedVorteX-TV on YouTube

A fork of Supermedo/uncharted_pc, through spacepepperoni/uncharted_Linux, its Linux and Steam Deck fork (that one is the version for the Steam Deck and x86-64 Linux).

Uncharted 1, 2 and 3 from the PS4 collection on ARM handhelds and phones with a Snapdragon GPU: Linux (AYN Odin 3 with Armada, an AppImage) and Android (an APK). The games' x86-64 code runs through FEXCore and their graphics go to Vulkan (Mesa Turnip on Adreno), on the same native-port base as the Linux and Windows builds of the collection.

Work in progress. All three games start and play, with known problems (below). This is an unofficial fan project, not affiliated with Sony Interactive Entertainment or Naughty Dog.

Status

Linux (Odin 3, Snapdragon 8 Elite)Android (AYN Thor, Snapdragon 8 Gen 2)
Uncharted 1Perfectly playablePlayable at 30 FPS cap
Uncharted 2Perfectly playablePlayable at 30 FPS cap
Uncharted 3Perfectly playablePlayable at 30 FPS cap
  • Perfectly playable: smooth and steady from start to end. Playable at 30 FPS cap: can be played through with the 30 FPS limit (the Low, Low-medium and Medium profiles).
  • On the Odin 3 the limit is the CPU's translation of every draw to Vulkan (about 2,000 per frame): Uncharted 2 runs at about 33 FPS in eco mode at 720p. On the Thor the limit is the GPU: with the 30 FPS limit the three games hold their frame rate well enough to be played through.
  • Render resolution: 1080p, 720p (the game's own PS4 720p mode) or 540p (for slower GPUs), in the in-game menu (L3 + R3, then "Save and restart the game") and in the launchers (Linux: Settings; Android: Graphics). 540p takes load off the GPU. With the batched skinning of 0.1.6, Uncharted 2 at 540p runs at about 25-45 FPS on the Thor, depending on the area.
  • Known problems: characters sometimes clip through scenery in Uncharted 2; a crash at the end of one Uncharted 2 cinematic was seen once.

What you need

  • Your own decrypted dump of the collection (CUSA02320, CUSA02343, CUSA02344, ...): the folder with eboot.bin, big2-ps4_Shipping.elf, big3-ps4_Shipping.elf, sce_sys, u1data, u2data and u3data. No game files are included or provided.
  • Linux: an aarch64 system with a Turnip Vulkan driver (Fedora-based Armada on the AYN Odin 3 is the tested one) and 8 GB of RAM or more.
  • Android: Android 9 or newer, an Adreno GPU (Snapdragon 8 Gen 2 or newer recommended), 8 GB of RAM or more. The GPU driver (Turnip) is bundled with the app.

Install

Linux (AppImage): download Uncharted-aarch64.AppImage from the releases, make it executable and open it. Choose the game folder in the launcher. The launcher updates itself from this repository's releases.

Android (APK): install the APK from the releases, open it, allow storage access, choose the game folder and press Play. With "Check for updates" on (Project section) the launcher tells you when a newer version is out.

Frame generation with Lossless Scaling (LSFG)

The port can use Lossless Scaling's frame generation (LSFG) at 2×, 3× or 4×. It needs your own Lossless.dll from a copy of Lossless Scaling that you bought. The DLL is not included and will not be provided. Choose the file in the launcher (Linux: Settings > Lossless Scaling (LSFG); Android: Graphics > Lossless.dll, which copies it into the app), then pick LSFG as the frame generation, there or in the in-game menu (L3+R3). It works from the finished frames only, so it adds a little latency and can show artifacts around fast-moving edges and the UI, more so the lower the game's own frame rate. On the Thor, use 2×.

Game display rate (60 / 120 Hz)

Settings (Linux) or Graphics (Android) > Game display rate. At 120 Hz a frame that takes a little over 33 ms is shown at once instead of being held until 50 ms: steadier frame times on 120 Hz screens such as the Odin 3's and the Thor's. Keep 60 Hz on a 60 Hz screen.

Build

  • Linux ARM (this branch, main): on the device, bash packaging/armada/build.sh builds inside a Fedora container (podman or toolbox) without installing anything on the system; BB_GAME_DIR=/path/to/dump bash packaging/armada/run.sh starts it, and bash packaging/armada/appimage.sh makes the AppImage.
  • Android (branch android): tools/android/build_bionic_deps.sh, build_bionic.sh, build_prepare.sh and build_frontend.sh (NDK, no Gradle); see the scripts' headers.

Logs are in logs/latest.log (Linux) and Download/Uncharted (Android). BB_FRAME_STATS=1 adds frame time, GPU waits and memory every few seconds.

Credits

ARM and Android port: RedVorteX-TV.

Built on the work of:

  • spacepepperoni/uncharted_Linux: the Linux and Steam Deck fork this port starts from (launcher, 720p mode, Uncharted 2 and 3 fixes), with ngin and its contributors.
  • Supermedo/uncharted_pc: the native port of the collection, and through it the fixes by Mevlock (the job wait behind Uncharted 2's water crash, Uncharted 1's physics at any frame rate, Elena's truck in Uncharted 2's convoy, aiming blur, the move action pool), drakolordx7 (Uncharted 3's sinking characters), kj2223 and Alex (flicker under the temporal upscalers).
  • ngin, through spacepepperoni/uncharted_Linux: the WriteData chaining, the bigger constant ring and stream buffer and the title update's own folder; iannitram: the audio codec and command processor crash guards; Cid, through ducvd89/Bloodborne-Android: GSR 2's 9-sample kernel and Catmull-Rom history.
  • deadinside28/bloodborne_pc (bbport): the native PS4 port base it runs on.
  • MaSieS4Fun/ARM_bloodborne_pc: the FEXCore layer that runs the games' x86-64 code on ARM.
  • ducvd89/Bloodborne-Android: the Android runtime, and the FSR 3.1 fixes for Adreno and Turnip.
  • Pepin208/uncharted_pc_linux: the first ARM attempt this port started from.
  • Mevlock's uncharted_pc-dev: the patch that skips the collection menu.
  • BilalReloaded's Uncharted PC port (GPL-2.0-or-later), as Tutuzaooo brought it to the Linux fork: the render resolution and the upscaling presets (scripts/render_res.py, cutscene movie scaling in gpu/shim/bbport_movie.cpp).
  • revvv991/uncharted-android (GPL-2.0-or-later): the batched skinning (vk_skin_batch.cpp and its host shaders), the constant copies bound again, the GPU threads on the fast cores and fewer wakeups of the game's submission thread; the movies below 1080p and the blur scale below 1080p.
  • Bachata S4 (GPL-2.0-or-later), through erickmendes22/uncharted-android: the launcher's graphics patches (patches/graphics_patches.json).
  • erickmendes22/uncharted-android (GPL-2.0-or-later): the Uncharted 2 and 3 camera and leg IK NaN fixes, saturate turning NaN into 0, Uncharted 2's streamed assets read whole and its mesh raycaster results reaching the CPU, the Vulkan driver's pipeline cache check, and on Android the texture memory budget from the free RAM and the performance hints (commits by erickmendes22 in this repository).
  • Snapdragon Game Super Resolution 2 by Qualcomm (BSD-3-Clause): the GSR 2 upscaler's shaders (gpu/shadps4/video_core/host_shaders/gsr2_*.comp).
  • StevenMXZ/Adreno-Tools-Drivers: the Turnip Gen8 builds the Android app bundles (V37, and V38 patched for Adreno 8xx).
  • Eden (PR #4263) and ARMSX2: the LSFG frame generation passes, from lsfg-vk's (gpu/shadps4/video_core/renderer_vulkan/lsfg).

And on FEX-Emu (FEXCore), Mesa (Turnip), shadPS4, FFmpeg and the projects listed in the Linux fork's README. Every commit in this repository keeps its author.

License

The source is under the GNU GPL v2 or later (LICENSE), like the projects it is built on. The LSFG frame generation files are GPL-3.0-or-later, so the binaries, which include them, are distributed under the GNU GPL v3 or later as a whole (COPYING.GPL-3). Third-party components keep their own licenses (their texts ship with the AppImage and the APK).