Download and verify published packages on-console, stage changed managed files, preserve user data, and install after frontend shutdown. Set eboot execute permission explicitly so native installations relaunch.
Validation: tools/verify.sh (118 tests, native build and all gates); browser state checks; actual Alpha 6 download/install/relaunch and unchanged config. Evidence: evidence/webui-update/.
Lead with a real console Overview screenshot and port6769 URL legend.
Organize setup, guided global/core settings, systems, balanced graphics and
file locations before developer details. Preserve licensing and attribution;
separate source-build features from release availability and remove game names.
Validation: desktop/mobile GitHub-style previews, no page overflow or missing
image; actual Overview inspected; Impeccable finish review and final delta ship.
Screenshot provenance embedded. Evidence: evidence/readme-overview, replay with
python3 tools/evidence.py compare evidence/. All project gates passed this round.
Create content/Saturn and system/Saturn at startup. Route the default core
system directory and menu BIOS preflight consistently, retaining custom paths.
Patch Saturn's x86 code pools to use the SDK executable allocator and release.
Keep cropped frames in core-owned storage to avoid resized lent texture reuse.
Include the patch in core stamps, provenance and shipped notices.
Two deliberate frontend patch blocks increase the expected count 232 to 234.
Verification: bash tools/verify.sh, all five gates PASS, 96 tests.
Evidence: evidence/saturn-runtime; replay with python3 tools/evidence.py compare evidence/.
Console: 100s controlled gameplay with clean captures; final frontend repeats
100s boot/demo and exits0; explicit BIOS preflight passes. Settings restored.
Expose 846 options from 15 pinned PS5 core catalogs before first use,
with categories, descriptions, exact choices, saved-value preservation,
and Advanced mode. Include installed cores without saved profiles and
preserve first-use PPSSPP/Dolphin edits through their profile migration.
Bind dynamic runtime options to the catalog and core binary revision.
Validation: all five tools/verify.sh gates pass (96 tests), all 15 core
browser checks pass, and the deployed native menu-only run exposes all
846 catalog keys with matching JSON, build identity and normal return.
Restore original settings and stop the temporary helper after testing.
Evidence: evidence/webui-settings-guide/{capture,expectation}.json
Reproduce: python3 tools/evidence.py compare evidence/
Raw native record: klog/webui-guide/all-cores-20261002-130144/report.json
Keep the purple dashboard at a stable desktop scale and expose searchable global configuration, saved core options, and core overrides. Apply pending core edits once on startup and preserve later native changes.
Validation: all five project gates pass (93 tests), browser regression suite passes at desktop and mobile sizes, and three native PS5 runs verify persistence, isolation, stale-save rejection, and normal shutdown. Evidence: evidence/webui-settings/. Reproduce project gates with bash tools/verify.sh.
Serve the approved purple layout with local assets, streamed content transfers, release notes and next-launch settings. Keep the service within the title lifetime and preserve explicit launch overrides.
Verify: CCACHE_DIR=build/verification/ccache BUILD_JOBS=8 bash tools/verify.sh (all five gates; 92 tests), real browser integration including throttled keyboard cancellation, and two native console launches. Evidence: evidence/webui/{capture,expectation}.json; replay with python3 tools/evidence.py compare evidence/.
Design review and normal Impeccable completion passed in a hash-verified identical-source snapshot because the original-root fingerprint scanner failed; records remain in build/verification. No game performance soak claimed.
Adapt PR #6 with matched S16/F32 buffers, startup cleanup and serialized motor fallback. Preserve active levels when streaming fails and cover both formats and failure paths with AddressSanitizer.
Verification: all five tools/verify.sh gates pass; 87 tests. Console strong/weak/combined pulse run: 2269 buffers, 568 nonzero, zero output errors, normal exit. Evidence: evidence/dualsense-rumble/capture.json and expectation.json; replay with bash tools/verify.sh evidence. Physical feel remains unconfirmed.
Co-authored-by: rpf16rj <rpf16rj@gmail.com>
Keep saved overrides authoritative and upgrade cached frontend patch trees. Document the effective starting profiles for all non-RPCS3 cores.
Verified all five gates (87 tests), installed build 541d38f5, and ran the copied Ghost of Sparta state for 80 seconds with resolution/MSAA input overrides absent: 3 loads, 1 save, normal exit, no allocation failure. Saved output selected 2880x1632/x8. Evidence: evidence/ppsspp-msaa-default. Console profile updated after backup; original state/config preserved.
Use SDK f674976 for blocking heap contention and live direct-memory availability. Trim unused PPSSPP caches under pressure, drain retired GPU objects and retry framebuffer allocation once; close content on unrecoverable failure. Report CPU/GPU/free/largest memory around state loads and failures.
Verified: all five tools/verify.sh gates, 87 tests including 108 injected GPU failures, all 16 core builds; SDK 318 checks plus memory scanner tests. Console evidence: evidence/ppsspp-memory-recovery. Balanced and 6x/8x pass repeated state round trips; prior 10x/8x crash now recovers first load, then safely closes content after device OOM on second load. Build 8b635e9b installed; user settings/state unchanged.
10x with 8x MSAA still faults after loading the affected state. Balanced defaults and the saved 6x/MSAA-off profile pass repeated loads and a save/load round trip; 6x/8x and 10x/off controls also pass.
Evidence: evidence/ppsspp-balanced-state-run/. Verified with the isolated console harness, format/evidence gates (54 captures), and git diff --check. Raw console captures and backups remain ignored.
Use PPSSPP 6x without MSAA, Dolphin/LRPS2/DeSmuME 4x, Beetle PSX HW 8x without MSAA and Azahar 6x. Apply defaults in the frontend before saved options; preserve overrides and higher selectable values. Patch count 223 to 226 adds the helper and legacy/v2 call sites.
Verification: focused real-parser regression failed before and passes after; CCACHE_DIR="$PWD/build/verification/ccache" bash tools/verify.sh passes all five gates and 85 tests. Evidence: evidence/balanced-core-defaults/{capture,expectation}.json; built title f4e9de26. Console acceptance and the reported crash's root cause remain unverified.
Filter title candidates to directories. The regression fixture fails before the fix and passes after it, including rejection of two actual title directories.
Verification: python3 -m unittest tests.test_notices.Notices.test_default_title_lookup_ignores_release_zip -v. Full gate capture: build/verification/balanced-defaults-gates.log (85 tests, build, manifest and notices pass).
The OPTION action (858129f) calls RetroArch's core option manager, which the
host test did not link, so the unit gate failed. The test now gives it one
option to find and checks that OPTION sets it, and that an unknown key or
value leaves the options alone. bash tools/verify.sh: PASS (format unit build
integration evidence).
The v0.5.6-alpha.5 gradient replaced a picture whose origin was not
recorded. The script now draws that look itself: a perspective grid fitted
to the old one's line positions (vertical lines within 2.4 px rms, the rows
within 3.8 px), its tile and line colours fading with depth as measured,
and about 2,500 stars placed by a fixed random seed with the old one's
count, sizes and brightness. The whole picture's mean colour is within one
level of the old one's.
The BC7 blocks now come from a mode 6 encoder in the script (49 dB against
the drawing, checked with Pillow's decoder), and the DDS header is
byte for byte the one the console has shown (4f633ad): the gradient's had
left out the mip count and straight alpha.
My console test showed the factor does not change while a game runs, so
the README no longer says it does. Beetle Saturn's battery stops at its
BIOS check.
A legal notice at the top (piracy is not condoned; legally obtained backups
only; RPCS3 is in no release and must be compiled from source), repeated where
games, system files and licences come up. A section on building RPCS3 for your
own console. The N64 row: 4x by default, factor changes applied live. Links to
documents no longer published are gone; the release notes on GitHub are the
public record.
The title folder carries LEGAL.txt beside eboot.bin, and licenses/README.txt
begins with the same text: piracy is not condoned, only legally obtained
backups of games the user owns and system files dumped from their own
hardware; no release contains RPCS3 (GPL-2.0-only, incompatible with this
port's GPL-3.0-or-later), which a user must compile from source for their own
console and not redistribute.
pic0.dds and pic1.dds had been converted from a background image whose
origin was not recorded. They are now a gradient drawn from arithmetic alone
by tools/make-title-art.py (BC7 mode 6 blocks, each one colour, so no texture
compressor is needed and the files are the same on every machine), and the
notices name that script as their origin.
The README lists RPCS3 (God of War HD at 4K and 60 fps; GTA IV at 4K held at
30, its busiest drives at 24 to 27) as a console build only, in no release.
The core pin brings the frame-rate patches option's new default (a game with
only an Unlock FPS patch runs it at RPCS3's frame limit of 30), the SPU
analyser's two-way jumps and the native SPU program checks (off unless asked).
RPCS3 is GPL-2.0-only and combined with this port's GPL-3.0 code; until that
licence question is decided it goes on my console and its source stays public,
but no release carries it. A build with PS5_RELEASE_TAG leaves the core and its
system files out, and check-notices.py --release fails on any RPCS3 file.
The fork at its main (accurate SPU xfloat on single precision, texture
read releases written by the offloader and submissions queued behind its
copies, the frame windows' testing counters, the Null renderer and sleep
probes); the SDK at cd3b239, the revision every build since has used.
"leaves N" prints up to N leaf buckets a busy thread (60 by default):
RPCS3's RSX thread spreads its time over hundreds of functions, and the
top 60 covered a quarter of it.
For the GTA IV test drives: a scripted L2 or R2 pulls the trigger axes
too (the profile binds them there, so a core reading the triggers saw
nothing); a SCREENSHOT is encoded on the task thread at zlib's fastest
level (port patch 0100; a 4K frame at level 9 held a thread about 20 s);
SAVE_STATE and LOAD_STATE take a slot number for that action only, so a
run can start from a second saved scene without replacing the first;
MARK prints the core's new frames and the longest gap between two since
the last MARK (port patch 0101 counts them), a run's frame rate over
exact script times. Two port patches more: the count test's 223.
The docs, the README, plans and notes are kept and updated on this machine
only: .gitignore ignores *.md, and the 37 tracked files leave the index
(they stay on disk). No build or test reads them.
The fork's bin/game_configs (RPCS3's configuration database) is staged
with its patches, and the pin moves to the fork's revision with RetroArch's
own device negotiated, the SPU pack and the kept pipeline cache.
0098: a state load neither asks a core whose states are basic for its
state's size nor saves the running game for Undo Load State. For RPCS3 each
of those is a savestate (the emulator stops, writes the state and boots it
again), which the load then replaces; the undo backup is dropped so it
never restores another game's state.
0099: the FPS status line and Display Statistics' Frame Rate count the
frames the core made, not the repeats it hands back, and read 0 when it
makes none: RetroArch's own count read the display's rate (60 while GTA IV
made 35). The patch count test goes from 215 to 221 for the six edits.
The all-threads summary names each busy thread's top six stack groups with
their chains, which is how the RSX thread's waits, the SPU threads'
vm::writer_lock and RetroArch's own PNG encoding were told apart.
The fork's pin carries GTA IV 1.00's frame-rate patch (its render thread's
frame lock, which RPCS3's database only unlocks for 1.08), savestates that
resume a disc game kept in a dev_hdd0 folder and load over one another, and
files in /app0 written through the console's FTP server once the title's write
budget is spent (the SDK fork's offload streams: GTA IV reinstalled 1414 MiB in
4 minutes with the budget spent, byte for byte). From the baseline state at
300%: 50.4-51.5 fps where the game held itself to 30 (docs/RPCS3_PORT.md, GTA
IV; docs/PHASE_LOG.md).
The platform probe's "offload" word measures writing through that server
from the title. The sampler bounds its frame walk by each thread's stack, which
faulted with every core thread sampled, and reports each busy thread, which
the most frequent groups hid.
A refused staging (a core that is not its build report, a missing licence
text) removed nothing it had written, so the folder kept a licenses/ without
components.json. It now removes it; the test checks that.
Evidence: python3 -m unittest tests.test_notices: 7 OK; staging the published
v0.5.0-alpha.5 folder is refused (its Snes9x core is not today's build) and
leaves no licenses/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A licence audit found that no published ZIP carries the licence texts its parts
require, and that three release tags name commits older than the ones built.
- tooling/notices/components.json lists every part of the title, its licence,
its licence texts and where its source is.
- tools/stage-notices.py (run by tools/build-title.sh before the manifest)
writes licenses/ into the title folder, tying every executable to its
source revision; tools/check-notices.py checks it in the integration gate.
- tools/source-bundle.py archives each part's source at that revision.
- LICENSE (GPLv3), docs/RELEASING.md, docs/releases/SOURCE_CORRESPONDENCE.md,
README licence and trademark sections, docs/RPCS3_PORT.md licence facts,
runtime/README.md (what libc.prx contains, as verified).
Evidence: stage-notices on a copy of the current 16-core build staged 28 parts,
every core equal to its build report; check-notices passes, --release fails on
uncommitted source; source-bundle built 10 archives whose sums verify;
make test-unit 83 OK; lint-shell PASS; libc.prx rebuilt from committed files is
byte-identical to every release's (e6ff45d1...).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The title stages RPCS3's game patch database (the fork's bin/patches) in
system/RPCS3/patches, and the core turns each game's frame-rate patch on when
content loads ("Frame-rate patches", on by default; docs/RPCS3_PORT.md).
The platform probe's "routes" word times 1 GiB written with write() and
through a shared mapping, in /app0 and in the folder by its own path: which
route or path the title's writes are held back on after their burst.
The test pad script can push a stick all the way (LS_ and RS_ with UP, DOWN,
LEFT or RIGHT), for runs that walk a game's character somewhere.
The core's .info offers basic save states (RPCS3 savestates, kept in memory),
and the fork's RPCS3 settings are core options by section (docs/RPCS3_PORT.md).
The fork's pin also carries two RSX fixes GTA IV needs: a FIFO whose command
buffer is in local memory (system mode 0x200; GTA IV 1.00 stopped at its first
commands, RPCS3 issue #14194) and a ZCULL late fault that unlocks its page
(the 16K-page freeze of RPCS3 issue #19610).
The test pad script gains SAVE_STATE, LOAD_STATE and SCREENSHOT actions (the
last saves /app0/pad-shot-<n>.png), for runs that start from a known scene and
runs that walk through a game's screens.
Loading God of War HD's folder with "Use this directory" crashed the title:
canonicalising a relative path asks libc++ for the working directory, and the
title's own getcwd resolves to nothing (libc's calls __getcwd, which only
libkernel_sys has). The title now links it to ps5_getcwd, as the cores were,
and app-symbols.map keeps every __wrap_ symbol local: lld exported
__wrap_getcwd to interpose on libc's stubs, which the native converter
refuses. The fork (its folder loading) boots the game in a folder rather than
RPCS3's cache build of it.
RPCS3's native dialogs draw images from <its folder>/Icons/ui, which the title
did not have ("Image resource file ... could not be opened"). build-rpcs3.sh
stages the fork's bin/Icons/ui and the title copies it beside the fonts. The
fork turns RPCS3's GDB server off in the configuration the core writes.
The loader counted a core thread as running until its start routine returned,
and RPCS3's threads end in pthread_exit, so 122 were "still running" at every
Close Content: the core stayed mapped and the reload mapped a second copy. A
core thread now counts itself finished from its first-registered thread_local
destructor, which runs last of them whether it returns or calls pthread_exit,
and one that returns ends through ps5_pthread_exit, so its destructors run
while its TLS is whole. The loader allows 20 ms after the count reaches zero
for the key destructors that follow. RPCS3 unloads at Close Content and
reloads at the same base; PPSSPP's battery still passes.
RetroArch forgets --max-frames when a core closes, so the pad script's STOP
ends a run that reloaded content, as the frame limit does, with its
screenshot.
God of War HD at 300%: twelve minutes without a crash, 71 of 71 windows at
100%, and the Close Content + reload battery passes (docs/PHASE_LOG.md).
The fork (4560e6b) resolves paths as the Qt application does, answers the image
and photo callbacks, releases a waiter's mutex around its wait callback in the
atomic wait engine (EDEADLK on the console's error-checking mutexes), and gives
the RetroPads the handler's own bindings. The LLVM fork (98b45cc) lays out
TrailingObjects classes as other targets do: the PS5 ABI ignores alignas on
their empty aligner base, and each allocation came up 4 bytes short (SPU
compiles crashed in MachineInstr::hasOrderedMemoryRef).
The title's crash report now prints every register, the heap words around
them, and the code addresses on the crashing stack up to its top.
God of War HD boots to its first level at 100% and 300%, every 10 s window
after the boot at 100% (docs/PHASE_LOG.md).
The fork (78dfa8f) installs the firmware and a package on a worker thread while
the core shows a loading screen, until RPCS3's first frame, and takes the
resolution scale as a core option (300% by default). build-rpcs3.sh fetches
Inter 4.1, pinned by digest, and the title stages it with its licence in
system/RPCS3/fonts.
The platform probe's "writes" word runs the SDK's sustained write test (SDK
c769422): a title writes at full speed for a burst of a few GiB, then at about
2 MiB/s, which is why God of War HD's 6.3 GB package installs in half an hour
(docs/RPCS3_PORT.md).
A title's realpath answers EPERM, even for /app0, so RPCS3's package installer
could not normalise its installation path (std::filesystem's canonical paths
are built on realpath). The title and the cores now bind realpath to
ps5_realpath (SDK 8160289).
tools/build-rpcs3.sh builds rpcs3_libretro.so from the fork PS5_RPCS3 with
the pinned LLVM (tools/build-llvm.sh, the PS5_LLVM fork), FFmpeg 8.1.1 and
GNU libiconv 1.18 (both from signed release tarballs); rpcs3 is in the
title's core list. The SDK pin (a9fbb6a) brings the platform gaps the core
met on the console. core-imports.py binds weak imports weakly and aliases the
new platform functions; the core loader answers a core's dlopen(NULL) with the
process handle; check-core.py fails a core that makes a system call itself;
the sampler can sample every core thread. RPCS3's own gs_gcm_hello_world test
runs with the LLVM recompilers on RADV (docs/PHASE_LOG.md).
Phase 1 of porting RPCS3 as a libretro core. The fork is
github.com/mihawk-99/PS5_RPCS3, pinned at upstream 1707d7fc883e, the newest
master commit that passed all thirteen CI checks, FreeBSD's among them. The
document records:
- every 3rdparty item and CMake option with its decision;
- LLVM 22.1 as a pinned static build for the PS5 target, and FFmpeg from
source with software decoders;
- the libretro frontend in place of headless_application: Vulkan through the
negotiation interface, set_image and the queue lock, an audio backend, a
pad handler, firmware and package installs without Qt, and the core
options and PS5 defaults;
- the platform gaps (a)-(h), with what the console already measured (the
unlimited exec allocator, the reservation limits, the thread probe's 13
CPUs, the affinity call's ERANGE) and the probe steps still to run;
- the risks and the milestone ladder.
The game at hand is God of War HD, NPUA80490, a PSN package with its RAP, so
the first content path installs the package.
For profiling Rogue Leader's slow windows (docs/PHASE_LOG.md): the sampler
logs where the console's exported waiting functions are, so a sample inside
one can be named (the emulation thread's is sched_yield). It logs each core
thread's start address, so a run can name the threads to sample, and it scans
the stack for callers when a sample is inside a system library, whose callers
keep no frame chain (not yet run on the console). SDK 9a57ba7 adds the
thread probe's scheduling measurements.
The payload SDK fork's ps5_exec_allocate kept 128 regions, and Dolphin's
vertex loaders (4 KiB each) passed that between a Rogue Leader mission and the
main menu: a NULL block and a write fault at address 0. Small requests now
share arenas of whole 16 KiB pages and large ones are listed regions, with no
limit, for every JIT core. The platform probe proves it on the console, and
the battery passes for Dolphin, PPSSPP, Mupen64Plus, DeSmuME, Azahar and LRPS2.
The build identity now includes the SDK's revision, since a platform-layer
change alone left the identity as it was.
Patch 0097. Load Content, and the file browser's top level, list the
frontend's two roots: INTERNAL, the title's folder (/app0), and EXTERNAL, the
console's mounts (/mnt). A root shows its name, not its path, and Parent
Directory from a root goes back to the two roots, not to the sandbox's /.
Kiosk mode keeps upstream's list. The patch count is now 215, three blocks
more.
Inside the title's sandbox /mnt is ENOENT, so EXTERNAL is empty until the
title can see the console's mounts.
Beetle PSX HW, Mupen64Plus-Next, Beetle Saturn, VICE x64sc, MAME 0.289,
DeSmuME and Azahar, each built from my fork of it at a pinned revision
(tools/core-fork.sh, tools/build-<core>.sh), with the PS5 defaults at the
most each offers that holds full speed.
The loader grew to fit them. A core's file and image come from direct memory,
up to 1 GiB (MAME's image is 413 MB), and each image is zeroed when it is
reserved: direct memory is not, and a reloaded core's .bss held its
predecessor's bytes, which faulted every core on a reload. Each image's
.eh_frame is registered with the title's unwinder, for the cores that throw.
Initializers are capped at 65,536 (Azahar has 2,476). A load that misses imports
lists all of them. Aligned operator new comes from the core heap, a core's
atexit belongs to the core, and the imports the new cores need are bound to the
platform layer's getcwd, tmpfile, mkstemp and the rest (SDK fork ebd0fe2).
The port moved from ../PS5_LRPS2's ps5-port branch to main, pushed to
GitHub, so the build pins that revision and builds it as it is. The patch
was exactly the fork's diff from 6d14775 to 9c2eea4; both builds give the
same pcsx2_libretro.so, byte for byte.
- tools/build-title.sh links ../PS5_Vulkan's RADV release archive by default;
PS5_VULKAN_DRIVER=ps5vk still builds ps5vk, which v0.4.0-alpha.4 shipped. A
RADV build stages no libvulkan.so.1: both drivers are linked into eboot.bin
and nothing ever loaded that library (a title cannot load one).
- src/present_clock.h and src/radv_icd_ps5.c are clang-formatted, which the
format gate asked for.
- docs/releases/v0.5.0-alpha.5.md: RADV, PPSSPP's MSAA, the shader cache, the
title heap's arenas, what was tested on RADV and what only on ps5vk, and the
known issues (Dolphin's first start of a game with an empty cache).
- README.md and docs/ACTIVE.md describe the title on RADV.
Build f96bdb0e; tools/verify.sh PASS (format unit build integration evidence):
74 Python tests, 52 captures replay.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Small blocks went to one locked dlmalloc mspace, and threads compiling
shaders at once waited on each other's allocations. src/overflow_heap.c now
serves ps5_overflow_* from the platform layer's heap: up to eight arenas, one
for each allocating thread, each block going back to its own from any
thread. On RADV with an empty shader cache, PPSSPP's pipeline compiles went
from 5,480 ms to 2,043 ms (median 37.4 to 17.4 ms), and its windows after
boot are full. The release battery and PPSSPP's soak pass on RADV with it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every core with a game, including closing and reloading content through
the Quick Menu (three driver initialisations a run), with threaded video on
for half of them, and PPSSPP's ten-minute soak with 25 menu toggles: no
crash on RADV, and the soak's windows at 98-100%, as on ps5vk.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PPSSPP took the physical device's API version (1.4 on RADV) as the version it
could use. It treated render pass 2 as core and never enabled the extension,
while RetroArch had created the instance for 1.1, so vkCreateRenderPass2 was
null and PPSSPP's MSAA path faulted 3.6 s into God of War: Ghost of Sparta.
The port patch caps the device's version at the instance's in
VulkanContext::CreateDevice, and the libretro context asks for 1.1, the version
RetroArch creates anyway. Nothing changes on ps5vk (1.1 and 1.1).
docs/PHASE_LOG: the first console runs on RADV. The menu, PPSSPP, Dolphin
(Wind Waker) and LRPS2 (GTA San Andreas) render, at full speed once the shader
cache is filled, beside ps5vk's runs of the same content.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The RADV link binds access to the platform's ps5_access, which this pin
has; the title builds with PS5_VULKAN_DRIVER=radv.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RADV's archive (PS5_Vulkan e5ac336, ps5-port 884f954) keeps its compiled
pipelines on disk, and its link binds getpwuid_r and posix_fallocate to
the platform layer, which has them since 2823efe. The title builds with
PS5_VULKAN_DRIVER=radv at this pin.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PS5_VULKAN_DRIVER=radv links ../PS5_Vulkan's RADV release archive (or the
one RADV_ARCHIVE names) through that project's tools/radv-link.sh, whose
platform bindings the title takes but for the heap: the title's allocator
stays, as the cores' imports are bound to its routes. src/locale_shims.c
steps aside for the platform layer's locale functions, src/radv_icd_ps5.c
names RADV's ICD entry point vkGetInstanceProcAddr, and the stall sampler's
present clock is the title's own (src/present_clock.h): ps5vk's with ps5vk,
around vkQueuePresentKHR with RADV. The AGC driver link stub gains the calls
RADV makes. The SDK pin moves to 1e4da12 (nl_langinfo in the platform
layer); ps5vk stays the default until RADV passes the title's cores.
Builds and links; not yet run on the console.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I chose to make Dolphin itself faster on the PS5 rather than underclock the
emulated CPU; the work is queued while the driver's Vulkan 1.4 plan is
decided.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CPU culling off changes nothing, single core is worse where it is slow, and a
thread hand-off costs 7.6 us on the console (the payload SDK fork's thread
probe, pinned at 58f7765): the heavy stretches need about 40% more per frame in
Dolphin's CPU and GPU emulation. The emulated CPU at 75% brings them to 83-100%,
a change to the game's own timing, so not a default.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Profile 12 is the best picture that holds full speed with every accuracy
setting at Dolphin's default: RE4, Melee, Wind Waker and Mario Kart Wii at 100%
in every window after boot. The port makes it the default and, as the PPSSPP
port does, sets an earlier options file aside once
(dolphin-emu.opt.before-ps5-profile), making the options folder first so the
marker exists on a fresh console. Checked on my console: the file set aside,
the new one written with the profile, Wind Waker at 100%. Rogue Leader's dips
are the driver's CPU transfers, ../PS5_Vulkan R95. tools/verify.sh PASS.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The release notes (docs/releases/v0.2.0-alpha.1.md) cover build 870bd1bb:
Dolphin, LRPS2 and PPSSPP on the GPU, the tester reports it fixes, the
stability checks it passed and the issues still open, with the component
versions it was built from. The README describes the eight cores, the
measured 60 Hz fallback, the PS2 BIOS location, the current gate numbers and
the new cores' credits and licences.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The log flusher, audio worker, permission repair, sampler and core-thread
factory were created with no attributes, which is 64 KiB of stack on this
console; they ask for 256 KiB (src/title_threads.hpp). The release candidate
ran every core through boot, menu and a Quick Menu action, four with threaded
video, and PPSSPP for ten minutes with 25 menu cycles: no crash.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A tester's build crashed re-creating the video driver after content closed:
vk_enumerate_instance_extension_properties read its count 66 KB above the
stack pointer, unmapped. RetroArch creates its own threads with no stack size,
which is 64 KiB here (the payload SDK fork's thread probe; the main thread has
2 MiB), and with threaded video the driver is created on one. This build with
0096 withdrawn died at its first threaded video init, a write fault one page
below the thread's stack in vulkan_context_create_instance_wrapper.
0095 moves 0019's 66,560-byte extension list to the heap and frees the list it
replaces; 0096 gives RetroArch's threads 2 MiB. The payload SDK pin moves to
a110320 (the thread probe, word "threads"). The unit gate's patch count moves
203 -> 212: 0094's seven blocks, missing from its commit's count, and 0095 and
0096; 0019's old block is withdrawn for 0095's. The same trace's half speed
with V-Sync on and its PPSSPP crashes are ../PS5_Vulkan R93's.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The patch takes the fork's PS5 defaults (9c2eea4cb on ps5-port): the Vulkan
renderer at 6x (~2160p/4K), with MTVU and fast boot already on. A launch
with no core options set ran FFX's demo at 4K on the Vulkan renderer at 99%
in every window.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This console's fwrite() runs at 3-13 MiB/s, where write() of a megabyte or
more runs at 150-230 MiB/s (the SDK fork's file probe). A save state now goes
to the raw descriptor through the frequent-access hint: uncompressed in 4 MiB
chunks, compressed in 1 MiB ones. An LRPS2 state of 50.6 MB saves in 0.28 s
uncompressed (2.8 s before) and 1.8 s compressed (2.3 s). Small writers keep
stdio.
The title pins the SDK fork at 66f658e and its platform probe takes "files".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Profile 10 entry counted the frontend's "Saving state" and "Loading
state" lines, which it writes for operations it then skips. About half ran:
11 of 21 loads and 10 of 21 saves, all correct. The frontend runs one state
operation at a time and drops a press that arrives while another is going. A
bounded timing capture, removed since, put a save at 2.1-2.9 s, limited by
file writes at about 18 MB/s whatever the chunk size. The Dolphin entry's
counts rest on the same lines, which the correction says.
Two 30-minute LRPS2 soaks at 6x, one idle and one fighting throughout, ran
without a crash, flexible memory flat. LRPS2_PORT notes R92: no 50 or 100 Hz
output for PAL games.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dolphin Profiles 0 and 1 and PPSSPP pass on the title with driver R91 as they
did before. LRPS2's Profile 10 on God of War II at 6x: 21 saves written and
every load that ran correct, with 11 of 21 load presses producing a load
(requests bunch behind saves; open). A run with 4K thumbnails and a slot per
save wrote only 5 of 21 saves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The LRPS2 patch takes the fork's MTVU default for the PS5 (f6bc86ecb) and its
3x, 5x and 6x upscale options. With the driver's R89-R91 the Vulkan renderer
runs God of War II's demo, Final Fantasy X's demo and San Andreas at 6x
(2880x2160) at full speed from boot, memory flat. God of War II's combat went
from 47-61% to 99%: MTVU and the GPU clears each lift the EE thread, and
together they reach full speed.
PHASE_LOG has the measurements and the two open questions (FFX's 50 Hz
presentation on the 120 Hz output, San Andreas' radiosity haze at 6x), and
the Wind Waker soak on the adoption build. LRPS2_PORT's status moves to
Phase 3.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fork's setup now installs one at a time, so a make that runs its
targets in parallel no longer replaces the SDK under itself.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The title and its cores build with ../PS5_PayloadSDK at a pinned
revision (tools/setup-native-dependencies.sh): the v0.42 release with
the fork's headers and platform layer installed over it. The builder
links SDK archives by name (APP_SDK_ARCHIVES); the core stamps include
the fork's revision.
- The machine context: the fork's sys/_ucontext.h is the console's
layout, so the crash reporter, the sampler and the Dolphin, PPSSPP
and LRPS2 ports read uc_mcontext's fields; the six-word offset each
carried is gone.
- The libc gaps: src/ps5_directory.cpp and most of src/libc_shims.c are
the platform's ps5_* functions; src/platform_wraps.c binds the
title's --wrap links to them and tools/core-imports.py a core's
imports. The directory fixture test moved to the fork.
- Executable code and guest memory: Dolphin's, PPSSPP's and LRPS2's JIT
code is the platform's executable direct memory near each core, at
upstream cache sizes (Dolphin 128 + 64 MiB, LRPS2 305 MiB), and their
arenas are the platform's direct-memory objects, views and ranges.
- A profiled run reports the platform's live counters after its memory
line; the platform probe test aid gains the huge and full tests.
- docs/PLATFORM_FIRMWARE_ANALYSIS.md: the 10.01 modules' export tables
against the SDK, and where the platform layer lives.
- tools/run_clang_tidy.sh tidies each C++ test with the flags its
harness builds it with (the app-source pass still lacks the build's
include paths; a separate task).
Console (docs/PHASE_LOG.md): Dolphin Profiles 0, 1 and 9 and Rogue
Leader, PPSSPP God of War and LRPS2's BIOS run with no crash; Dolphin
has 58 MiB more flexible memory in game and LRPS2 160 MiB more, with
the caches at upstream sizes; the platform's counters return to zero
when content closes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tools/build-lrps2.sh builds libretro's PCSX2 core from my fork's pinned
revision with patches/lrps2/ps5-port.patch (the fork's ps5-port branch),
checks its ABI, stamps it and stages it in the title. LRPS2_DEV=1 builds
the fork's working tree. Its toolchain file and libc shims live in
tooling/lrps2; the title exports dirfd for it (ps5_dirfd).
On the console the BIOS boots on the software renderer and runs 150 s
with no crash and full-speed audio, and the Vulkan renderer creates its
1.1 device (docs/PHASE_LOG.md, docs/LRPS2_PORT.md).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Profile 11's remaining soaks on title 9a84b116: RE4 and Wind Waker for 30
minutes and Wind Waker for an hour, from my entry states. No crash; every
ten-second window after boot at 99.5% or better (the misses are the
screenshots' 4K reads); the driver's direct mappings level off within
minutes and flexible memory does not move. With Melee's 30 minutes, the
profile passes for all three games.
Rogue Leader's attract sequence from boot runs at 52-81%: shader
compilation on the first run, and on warm runs the driver's CPU copies
(ps5vk_queue_run_step waiting for the GPU) and per-draw cache flushes on
the thread that runs Dolphin's GPU emulation. The owning layer is the
driver; the work is in PS5_Vulkan's round plan for the LRPS2 port.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vulkan_init creates vk->hdr.ubo whenever the build has VULKAN_HDR_SWAPCHAIN,
but vulkan_free destroyed it only when the context reported HDR support,
which this console's surface never does. One 256-byte host-visible buffer
leaked each video init, two per core reload: the two direct-memory mappings a
reload that Profile 9 left unidentified. The patch count goes from 202 to 203
for this one block.
Title 9a84b116, four reloads of Melee: every reload returns to 180 live
mappings and memory:152 (evidence/dolphin-p9-reload-flat).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rogue Leader's attract sequence failed at the same point every run: the
GPU loop, resuming at a field with a chunk still queued, subtracted that
chunk from a distance the game -- resuming at the same moment -- had just
reset to 0. The negative distance read as more to fetch, the loop
decoded stale FIFO words as commands, and one faulted in LoadIndexedXF
(a tester's crash). A bounded capture of the FIFO register writes and
the loop's starts and stops, since removed, showed the interleaving.
The CPU's writes to the read pointer and the distance are now counted
before they land, and the loop commits a chunk's pointer and distance
by compare-and-swap only if none came while it was in flight, as a CPU
write wins on the hardware; gather-pipe bursts, which only add, retry.
Twice from boot for seven minutes: no alert, no crash. Profile 1 on the
three games and Mario Kart Wii unchanged.
PHASE_LOG also records Mario Kart Wii's black scenery (driver R79).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Melee's direct mappings level off at 356, so its rise in Profile 10 was
a plateau. The soak was stopped during RE4 to free the console.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
21 saves and 22 loads a game from a copy of my entry state in a test
directory, no error, no crash, correct pictures after each load, and
100% in the windows without state operations. A load stalls 250-400 ms,
most of it Dolphin recompiling its cleared JIT cache (6,000-9,400
blocks); a save about 20 ms. evidence/dolphin-p10-state-stress.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
DOLPHIN_DEV and PPSSPP_DEV build the source tree as it stands and do
not write the stamp, but the stamp an earlier ordinary build wrote
still matched, so the next ordinary build kept the dev build's output.
An instrumented Dolphin survived a gate build that way. A dev build now
removes its core's stamp, and the next ordinary build rebuilds from the
pinned revision and the committed patch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FTP runs as another user than the title, and RetroArch creates its
folders 0750 and some files with mode 0, so savestates/dolphin-emu
answered FTP with "550 Permission denied". mkdir, open and fopen are
wrapped at link time -- a core's imports bind to the same wrappers --
and give what they create 0777 (folders) or at least 0666 (files). A
thread started first in main gives everything under /app0 the bits it
lacks, which repairs what earlier builds made; only modes change.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Profile 10 stresses save states in a directory of its own, so the entry
state has to be there too, and the FTP account could not read mine.
/app0/state-copy.txt names a source and a destination; a test run
copies the one to the other before RetroArch starts. It never replaces
a file and never writes under /app0/savestates or /app0/savefiles, and
the file is swept with the other test files on a launch that is not a
test run.
The memory report's declarations had separated the terminate handler's
comment from its function; they sit above it again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Patch 0021 creates wide default and blank textures after upstream's 1x1
and 4x4 ones and stores them in the same slots, so the small ones --
image, memory and view each -- leaked on every swapchain change and
video init. Profile 9's four reloads showed the driver's direct-memory
count growing by 13 mappings a reload. Patch 0092 releases each small
texture before its slot is reused; the count now grows by 2 a reload
with the bytes flat (evidence/dolphin-p9-reload-before, -after).
The pad script gains `<seconds> RELOAD`, which loads /app0/args.txt's
core and content again as the menu's history does, for the reload
stress. There is no CLOSE: unloading a core from the input poll, inside
retro_run, crashed Dolphin, so scripts close through the Quick Menu.
PHASE_LOG records Profile 8 (cold and warm shader cache) and Profile 9.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PHASE_LOG records Profiles 3 to 7: torture, GPU and RAM EFB copies and
the 1x-6x ladder at full speed on RE4, Melee and Wind Waker; MSAA after
../PS5_Vulkan R75-R78 (2x, 4x and 8x at full speed, the maximum torture
correct and GPU-bound).
A profiled test run (the driver's /app0/ps5vk-profile.txt survived the
stale test file sweep) prints the flexible memory left every ten
seconds from the log flusher, beside the driver's direct_live, so a
soak's leak shows as a line that only moves one way. verify.sh: all
gates pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RetroArch emulates a swap interval above 1 by presenting each frame
that many times, so each frame takes that many of the queue's images.
At 119.88 Hz with the automatic interval of 2, the default three images
held one frame instead of two; the second present of every frame
waited for a vblank on the thread that runs the core, and Dolphin's
frame-stepped emulation ran Wind Waker under ubershaders at 80-99%.
Patch 0091 asks for (video_max_swapchain_images - 1) * interval + 1
images, five by default at 120 Hz: two frames and 33 ms of lookahead,
as three images give at 60 Hz. ../PS5_Vulkan R74 provides them.
Patch count 199 -> 200 (0091's one block).
Evidence: evidence/dolphin-p2-swapchain-before and -after (python3
tools/evidence.py compare). Title 5beca7cc: Profiles 1 and 2 (1x, 6x)
on RE4, Melee and Wind Waker at 100% in every steady window.
verify.sh: all gates pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
libretro asks for one video_cb per retro_run, NULL for a repeated frame.
Dolphin's presenters call it only for a frame they draw, and with
duplicate XFBs skipped (the default) a 30 FPS game's every other field
drew none, so those runs returned without presenting and only the audio
writes paced them. Wind Waker at 119.88 Hz crossed 40 ms 14-17 times in
130 s at full speed. The core now hands RetroArch NULL for a skipped
duplicate where Dolphin would have presented it (Presenter::ViSwap), and
at the end of a run that output no field.
Sending it only at the end of the run removed the late frames but left
the audio short: the present waited on the display after the frame step
had stopped the CPU thread. Kept as evidence.
Evidence: evidence/dolphin-pacing-before, dolphin-pacing-end-of-run,
dolphin-pacing-duplicates (python3 tools/evidence.py compare). Profile 1
on title f2585b8f: RE4, Melee and Wind Waker 1,200 presents per 10 s,
every window without a screenshot 480000 played and 0 silent.
Also: the sampler's stall-ms flag; FIFO recording at frame N; the core
copies its first 32 alerts to the trace. verify.sh: all gates pass.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RetroArch reads a save state whole, and loading Resident Evil 4's 260 MB
entry state while Dolphin booted left the JIT 45 MB of the 56 MB of
flexible memory it maps; the core then wrote its code through a null
pointer. Large frontend allocations now take direct memory first and
anonymous (flexible) mappings only when it refuses, which keeps flexible
memory for executable code and thread stacks. The Dolphin allocator
reports the flexible memory free when an executable mapping fails.
tooling/dolphin-profiles holds the acceptance profiles as core-option
files. PHASE_LOG records Profile 0 on the three games.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Wind Waker drew its 3D scenes as a corrupt near-camera surface, then (after the
first fix) thin triangles to the screen corner and a minimap spill. Both were
primitive-restart faults in ../PS5_Vulkan: R64 (34ca3ad, a bare restart write
after each draw landed mid-draw) and R65 (75f33eb, every submission a copy
splits off starts with restart off). Found with a console FIFO log played by
the core and by desktop Dolphin from the same tree, bisected by object range.
Evidence (evidence/dolphin-restart-strips, raw klog/dolrestart-evidence.txt):
the FIFO log's screenshots against desktop Dolphin, mean difference per channel
64-71 before, 1.23-1.53 after R64, 1.13-1.16 after R65 (resampling); my save
state on Outset Island (--entryslot=0, 3600 frames) loads, draws cleanly and
exits with rarch_main 0 and audio errors=0.
Core patch (patches/dolphin/ps5-port.patch, regenerated from the tree):
- Core/Core.cpp: single-core FIFO playback returns to retro_run with the FIFO
CPU core injected, as CpuThread does; running CPU::Run() there never
returned in single-core libretro mode (.dff playback hung).
- debug mode "objects A B" plays only objects A-B of each FIFO frame (debug
file only; $FIFO_OBJECTS on the host).
- the temporary host A/B hooks (depth clamp, draw log, restart) are gone.
Title: the stale-test-file list covers /app0/dolphin-debug.txt and
/app0/ps5vk-shader-cache-dir.txt (a previous run left the latter on the
console, redirecting the driver's shader cache; removed).
tools/verify.sh PASS (format unit build integration evidence), 40 captures.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>