The console pairs each controller with a signed-in user, and scePadOpen
opens a user's controller, so RetroArch read only the first player's.
The joypad driver now connects controllers the way ProsperoEden does
(PS5_ProsperoEden b919847, headless/pad.cpp):
- Port 0 (player 1) is the user who started the title, and stays theirs.
- About once a second sceUserServiceGetLoginUserIdList is read again. A
new user's controller takes the first free port (1 to 3); a port is
let go, and announced gone, when its user signs out. A pad the process
already holds is reused through scePadGetHandle.
- Each port is announced to RetroArch's autoconfiguration on its own and
has its own buttons, axes, rumble and haptic stream. The pad script
still plays port 0.
The console's config already maps players 1-4 to joypad indexes 0-3.
For test runs, tools/run-title.sh --pad-monitor arms
/app0/pad-monitor.txt, which traces each port's whole button word as it
changes, including the bit that says the system holds the controller.
Evidence: evidence/multi-controller/ (capture.json, expectation.json;
console user ids masked). On the base PS5 13.40 with two DualSense
controllers and two signed-in users (build 95a82988):
run 211620: ports 0 and 1 opened, each with its haptic stream, and
both reported connected
the owner's own launch from the home screen: the launching user's
controller became port 0 and the other port 1; both were opened again
after RetroArch re-initialised input, and a racing game played with
both controllers
The committed source differs from build 95a82988 only in the monitor's
trace format, which the host test covers; that build was not run on the
console.
Host test: tests/test_input_ps5.py PASS (the four-player scenario: join,
separate input and rumble, sign-out, rejoin, the first player kept, an
open failure, a full house, the monitor, re-announcement after a reset).
Command:
tools/run-title.sh --no-build --no-deploy --pad-monitor --watch 120
Gates: tools/verify.sh PASS (format unit build integration evidence).
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/.
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>
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 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.
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).
Preserve the requested RGBA format in asynchronous image loading. Default the native joypad to ps5 and refresh controller autoconfiguration after a live reset clears bindings.
Three new regression tests failed before the fixes and pass afterward. All five tools/verify.sh gates passed with 74 tests and 278 frontend sources. Patch inventory is 179, including five configuration.c edits. Owner accepted the uploaded build: Perfect. Commit.
Evidence: evidence/thumbnail-input-defaults/; replay with bash tools/verify.sh format evidence. Accepted build: e11018a79a62ce91fa723deaad6939c1e48a47bace21b3527ae84f4452148451. Current logging unchanged; no PS5_Vulkan edits.
Register ps5_joypad with raw buttons/axes and a built-in controller profile.
Route controls through RetroArch's binding helpers and stop OR-ing hardcoded
pad state back into remapped input. Preserve held samples across the extra
binding-screen poll and keep disconnect/interception handling.
Add three upstream edits (105 -> 108): joypad declaration, registration and
built-in profile. No new dependency or toolchain flag. Host tests exercise
upstream mapping/analog helpers, native polling/lifecycle and ELF registration.
Validation: tools/verify.sh (all five gates, 37 tests, 17 evidence records).
Fresh patch replay: 107 applied + one existing marker; second pass unchanged.
Console: tools/run-title.sh --no-build --watch 120; owner confirmed flawless
stick navigation and binding capture, then confirmed manual close.
Follow-up: tools/run-title.sh --no-build --no-deploy --watch 30; full window
alive and script-closed, zero Vulkan refusals/API failures.
Evidence: evidence/native-joypad/{capture,expectation}.json.
Build: e6211dea9fd0bb512e83a9979a6a44c0c8c5fdf175564c753e3fd2a25067e0a9.
PS5_Vulkan unchanged.