The frontend now builds into a signed title, and the PS5 driver is in
RetroArch's table in the image that ships, not only in the source.
bash tools/build-title.sh
-> 225 of 225 sources compiled, archived into build/ra/libretroarch.a
-> dist/PPSA99169/eboot.bin, 8,026,239 bytes
container: signed, plaintext; 12 segments; integrity: valid
digest 71c88975040535a02b462618dd394a7a378034272c9bffa43ce0ca4b717ab9b7
(identical across two consecutive builds)
readelf -r build/ra/obj/gfx_video_driver.c.o
-> .rela.data.video_drivers holds exactly two entries: video_ps5, video_null
nm build/llvm-pie.elf
-> video_ps5, video_null, rarch_main and a single main
bash tools/check-manifest.sh
-> 7 files match their digests, none extra, eboot.bin magic 4f153d1d, and it
fails as it should when one byte of the image is changed
tools/verify.sh
-> PASS (format unit build integration evidence)
Registration and entry point. The port's changes are applied by
tools/apply-port-patches.py to the configured copy under build/ra-conf and never
to vendor/retroarch; patches/series names both. RetroArch's own main is compiled
out with -DHAVE_MAIN, the flag its desktop build passes, so src/main.cpp supplies
the only one and calls rarch_main.
Five faults fixed on the way, each recorded in docs/PHASE_LOG.md: the build read
sources from vendor/ and headers from build/ra-conf, so the driver table in the
image had no ps5 entry; 36 hand-written -DHAVE_* flags included six features
configure had turned off; config.h alone is not enough because a source can test a
feature before it is reached (libchdr without zlib); five Linux-only subsystems
were in the object list and are now off at their own configure switches; and two
link-time stubs the pipeline refuses needed -DNDEBUG and -DZSTD_TRACE=0.
The abandoned route is removed: deploy.py, console-launch.sh, check-payload.sh,
scaffold-native.sh, build-native-app.sh, install-title.sh and deploy.sh. Every
tool named by another tool now exists - tools/fetch-retroarch.sh was named by
three tools and three documents and had never been committed, and it now pins
RetroArch at v1.22.2 (69a4f0e) and drops the history so upstream cannot be
committed into. The gate scripts that had never been written are written:
lint-shell, lint-format, check-manifest. The template's unit test, which built a
test for a file that does not exist here, is replaced by tests/test_frontend.py.
The title has not run yet. It is built, signed and manifested; the folder has to
reach /data/homebrew/PPSA99169, and writes from this machine do not take on that
console.
4.4 KiB
PS5 RetroArch
A native RetroArch homebrew application for jailbroken PlayStation 5 consoles. RetroArch is the reference frontend for the libretro API; this project brings it to a console that was never meant to run it, so the emulators and games that already exist as libretro cores can run there too.
Status: project definition. The gates, the milestone map, the invariants and
the step ladder are written and committed; no code has been built or run on a
console yet. What is true right now is in docs/ACTIVE.md, and
the evidence behind each claim is in docs/PHASE_LOG.md.
How it fits together
Everything about this console's platform layer already has an owner. This repository supplies the RetroArch side of it and consumes the rest:
| Project | What it provides | How this project uses it |
|---|---|---|
ps5-payload-sdk |
the PS5 compiler, sysroot, and the console's public APIs (ScePad, SceAudioOut, SceVideoOut, SceUserService, networking) |
$PS5_PAYLOAD_SDK/toolchain/prospero.sh supplies the toolchain for every PS5 compile |
../ps5-opengl-sdk-0.2.0 |
a relocatable OpenGL 3.3 Core stack with a hardware acceptance run | the OpenGL backend, for a menu or a core that needs one |
../PS5_Vulkan |
the Vulkan driver being built for this console, with vendored Vulkan headers | the backend the XMB menu needs once the driver reaches rung 1.0; RGUI needs no GPU at all |
RetroArch itself is upstream, unmodified on disk and patched by a committed
series: the pinned release tarball is fetched into vendor/, which is never
committed and never edited by hand. Every change to it is a file in patches/.
What this repository owns: the RetroArch platform layer — a context driver that takes a display and a graphics context, a platform driver that owns the title's lifetime, a pad driver and an audio driver — plus the build, the staging, the console deployment and the evidence pipeline that prove a step.
Build
Requirements: Linux with clang, clang-format, clang-tidy, make,
python3, curl, tar and pkg-config, plus the PS5 payload SDK unpacked
somewhere and pointed at with PS5_PAYLOAD_SDK (default
~/ps5-payload-sdk).
export PS5_PAYLOAD_SDK=~/ps5-payload-sdk
tools/verify.sh # format, unit, build, integration, evidence
tools/verify.sh is the only entry point a step needs: it runs the five gates
in order and stops at the first failure. tools/verify.sh --list prints what
each gate runs, and docs/TESTING.md says what each one means.
Install on a console
The application ships as a homebrew title folder, not a retail package:
dist/<TITLE_ID>/
├── eboot.bin the signed application image the console runs
├── retroarch.cfg the configuration seed
└── sce_sys/ param.json, icon0.png
Copy that folder to homebrew/ on the console's internal storage or a USB
drive, so it ends up beside the other homebrew titles, and start it from the
console's own homebrew launcher. This project does not configure a console, does
not install a loader and does not register titles — see
docs/DEPLOYMENT.md.
Documentation
The documentation is the project's memory, and it is layered so that an agent session pays only for what it reads:
| File | Role |
|---|---|
AGENTS.md |
frozen rules: read order, volatility, work loop, gates, evidence |
docs/PLAN.md |
the gates, the milestone map, the invariants |
docs/ACTIVE.md |
what is happening now, what is next, what was last verified |
docs/REFERENCE.md |
the step ladder, the environment, the pins, the graphics contract |
docs/TESTING.md |
what the gates mean and what counts as evidence |
docs/DEPLOYMENT.md |
staging, upload, observing a run, rollback |
docs/TROUBLESHOOTING.md |
symptom → cause → fix, and known-benign messages |
docs/FINDINGS.md |
append-only measurements and what they force |
docs/PHASE_LOG.md |
append-only, dated entry per landed step |
Licence
RetroArch is GPL-3.0-or-later, and so is this port; the upstream licence travels
with the sources that get fetched into vendor/. Files in this repository carry
their own copyright and SPDX headers.