Commit Graph
192 Commits
Author SHA1 Message Date
MarcZX10 3a03e58b31 Merge remote-tracking branch 'upstream/main' into fix/pad-port0-connected-state
# Conflicts:
#	core/libs/prx/libScePad/src/PadState.cpp
2026-10-31 06:53:37 +00:00
Adrià 50a261e7e4 Merge pull request #13478 from JJenkx/fix/pad-injected-capture-hold
fix(pad): hold injected buttons that answered a dialog until released
2026-10-31 04:09:53 +01:00
JJenkxandClaude Opus 5.5 2e2f6b5eef fix(pad): expire a held injected button when its scripted press ends
A scripted button that answered a dialog stayed masked from the title
until a title read sampled it released. When the title did not read
during the release, a later scripted press of the same button was
masked as well. The mask now keeps only the buttons the command
timeline held without a break since the last read, so a press that
ends, or a new command, clears it whether or not it was sampled.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 20:57:09 -04:00
MarcZX10 672ead67ec test(libSceVideoOut): keep keyboard input out of port 0 while it is withdrawn 2026-10-30 23:48:23 +00:00
MarcZX10 68a4689e62 Merge remote-tracking branch 'upstream/main' into fix/pad-port0-connected-state 2026-10-30 23:46:32 +00:00
Adrià 93f5331fd7 Merge pull request #13463 from notHaze/feat/configurable-mouse-stick
feat(input): add configurable mouse stick target
2026-10-30 22:50:29 +01:00
MarcZX10 bc37a818a0 Merge remote-tracking branch 'upstream/main' into fix/pad-port0-connected-state
# Conflicts:
#	core/libs/prx/libSceVideoOut/include/PadInput.hpp
2026-10-30 18:52:51 +00:00
MarcZX10 156ca91120 test(libSceVideoOut): check the hold halfway through as well as at its edge
The removal and reconnect checks sampled only at the hold's edge, so a hold
of zero still passed them. A sample halfway through the hold must now stay
pending, which a zero hold does not do.
2026-10-30 18:51:20 +00:00
JJenkxandClaude Opus 5.5 c2a766ec22 fix(pad): hold injected buttons that answered a dialog until released
A scripted press that answers a modal dialog or the IME was merged into
the host state for the capture, but video out's heldThroughCapture only
sees host buttons, so once the capture ended Pad::ReadState OR-ed the
still-active injected press into the title's read. A 400 ms Cross that
answered the dialog then also reached the title for the rest of the
press.

Record port 0's injected buttons while the pad is captured and mask them
from the title until they are released, as host buttons already are.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:11:50 -04:00
Adrià cca2d08bd2 test(libSceVideoOut): count the three host volume default bindings 2026-10-30 16:29:56 +01:00
Adrià df480a5049 fix(libSceVideoOut): close the pad status request test before the volume tests 2026-10-30 16:29:56 +01:00
Adrià b18234a5fd fix(libSceVideoOut): close the pad status conflicts test before the volume tests 2026-10-30 16:29:56 +01:00
MarcZX10 a9124c157f test(libSceVideoOut): print the line of the pad_sdl check that fails
Require aborted without saying which check failed, so a failure on a CI host that cannot be reproduced locally left no trace of the assertion in the log. It now prints the source line before aborting.
2026-10-30 16:29:55 +01:00
MarcZX10 cb77b10b3d test(libSceVideoOut): cover the focus rule for the host volume
Nothing happens by default, focus lost silences and focus gained restores exactly unity with the option on, other window events, other windows and key events are ignored, and the user's own mute survives a focus round trip.
2026-10-30 16:29:55 +01:00
MarcZX10 addfd6a8ee test(libSceVideoOut): cover turning requests into host volume commands
Register pad_host_volume. An empty request set changes nothing, volume up and down move one step and return to exactly unity, mute toggles, combined requests run up then down then mute, and the other host requests are ignored.
2026-10-30 16:29:55 +01:00
MarcZX10 93a613aed4 test(libSceVideoOut): cover that the host volume keys collide with nothing
No built-in key is bound twice, the three host volume keys are bound by default as plain keyboard keys, a key the user shares with another action keeps both bindings as it does for the existing actions, and action names are exact and case-insensitive.
2026-10-30 16:29:55 +01:00
MarcZX10 562654de68 test(libSceVideoOut): cover the default ToggleMute binding
F8 is the only built-in ToggleMute key, a mapping line replaces it, the built-in table raises the request, and the key does not reach the pad state.
2026-10-30 16:29:55 +01:00
MarcZX10 67cc1b2888 test(libSceVideoOut): cover the default VolumeUp binding
F6 is the only built-in VolumeUp key, a mapping line replaces it, the built-in table raises the request, and the key does not reach the pad state.
2026-10-30 16:29:55 +01:00
MarcZX10 54e10becde test(libSceVideoOut): cover the default VolumeDown binding
F5 is the only built-in VolumeDown key, a mapping line replaces it, the built-in table raises the request, and the key does not reach the pad state.
2026-10-30 16:29:55 +01:00
MarcZX10 8402d91c86 test(libSceVideoOut): cover the ToggleMute input mapping action
It takes a key and alternates case-insensitively, ignores a duplicate line, and refuses mouse buttons, the wheel, unknown keys, empty sources and sources without a type.
2026-10-30 16:29:55 +01:00
MarcZX10 f57856aee2 test(libSceVideoOut): cover the VolumeDown input mapping action
It takes a key and alternates case-insensitively, ignores a duplicate line, and refuses mouse buttons, the wheel, unknown keys, empty sources and sources without a type.
2026-10-30 16:29:55 +01:00
MarcZX10 30d0a1392c test(libSceVideoOut): cover the VolumeUp input mapping action
It takes a key and alternates case-insensitively, ignores a duplicate line, and refuses mouse buttons, the wheel, unknown keys, empty sources and sources without a type.
2026-10-30 16:29:55 +01:00
MarcZX10 50c1d2f4a3 test(libSceVideoOut): cover the ToggleMute request from the keyboard
A bound key asks once per press, repeat and release ask for nothing, the other host requests stay false, and the pad state is unchanged.
2026-10-30 16:29:55 +01:00
MarcZX10 3ccda9b131 test(libSceVideoOut): cover the VolumeDown request from the keyboard
A bound key asks once per press, repeat and release ask for nothing, the other host requests stay false, and the pad state is unchanged.
2026-10-30 16:29:55 +01:00
MarcZX10 114b16ab41 test(libSceVideoOut): cover the VolumeUp request from the keyboard
A bound key asks once per press, repeat and release ask for nothing, the other host requests stay false, and the pad state is unchanged.
2026-10-30 16:29:55 +01:00
Florent Combet 26d36e9645 feat(input): add configurable mouse stick target 2026-10-30 15:41:51 +01:00
MarcZX10 0d0db3570b test(libSceVideoOut): check port 0 follows the controller in both modes
Runs the default mode first (port 0 and user 0 stay connected after the only
controller is removed), then controller mode with virtual SDL controllers:
the removal is committed after the hold, user 0 logs out and back in, a
withdrawn port 0 reads zeroed, and a brief removal does not flap port 0.
2026-10-30 13:58:49 +00:00
MarcZX10 e287eca76c test(libSceVideoOut): cover the port 0 presence rule with an injected clock
Checks the mode names and the error for other values, that default never
reports a change, that a removal and an attach are each committed only after
the hold, that a flap inside the hold is ignored, and that a controller
present at start connects at once.
2026-10-30 13:56:36 +00:00
JJenkxandClaude Opus 5.5 728d7aa34c fix(pad): let harness input answer system dialogs
APS5_PAD_INPUT_FILE input was merged only into guest pad reads. While a
modal dialog or the IME held the pad, the title saw the intercepted
state and the dialog saw only host SDL input, and without a controller
video out did not publish slot 0 at all. A message dialog opened by the
title (Void Terrarium++ "System data not found" on a fresh profile)
could then never be answered in a scripted run.

Merge the injected input into the host state handed to the capturing
dialog, publish slot 0 every frame while the pad is captured, and once
more when the capture ends so the title stops reading the intercepted
state.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 08:14:30 -04:00
Adrià cc7b82ac6f Merge pull request #12702 from MarcZX10/feat/overlay-pad-status
feat(overlay): show controller status on demand or on connect, disconnect and battery drop
2026-10-30 13:05:28 +01:00
Adrià 1c3faf2607 Merge pull request #13031 from wrocketdev/test/videoout-events
test(libSceVideoOut): delete registered flip and vblank events
2026-10-30 10:52:41 +01:00
Adrià 65df5a3630 Merge pull request #13008 from relativespace2K/feat/videoout-cursor-set2x-magnify
feat(libSceVideoOut): export sceVideoOutCursorSet2xMagnify
2026-10-30 10:42:00 +01:00
Adrià 7d4006607a Merge pull request #11196 from p3n1cillin/claude/videoout-unregister-busy
fix(libSceVideoOut): refuse to unregister the buffer set on screen as the console does
2026-10-30 06:21:30 +01:00
MarcZX10 00aa30e5f0 test(videoout): present with the pad status panel under the validation layer
A flip mode presents main-bus frames with the panel hidden, then shown
by a request, together with each page of the performance overlay, over
the system keyboard (where it must not be drawn) and after the keyboard
closes, so the layout chain through the new render pass runs in the
Vulkan validation layer. It asserts that every flip is presented and
that the panel is hidden until something asks for it.
2026-10-30 05:55:09 +01:00
MarcZX10 4522fa983a test(videoout): pin the SDL to pad status mappings
Every SDL game controller type (the table must cover each value up to
SDL_CONTROLLER_TYPE_MAX, so a type SDL adds later fails the test until
it is classified) and every joystick power level map to the expected
kind and level; the enumeration bounds and values SDL does not define
read as unknown. The test needs no SDL subsystem, window or device.
2026-10-30 05:54:47 +01:00
MarcZX10 92f9307aba test(input): pin the ShowPadStatus binding and request
InputMapping: F9 is the only default input of ShowPadStatus and the
only default binding on F9, the default table gained exactly that one
binding, the key moves, takes alternates once each whatever the case,
refuses mouse buttons, the wheel, unknown keys and an empty source, and
conflicts with other actions (a shared key, a pad button or the overlay
moved onto F9) keep both bindings. KeyboardMouse: F9 asks once per
press and nothing else, repeats and releases ask for nothing, no other
function key or mouse button asks, a rebound key replaces F9, and a key
shared with the overlay raises both requests.
2026-10-30 05:54:47 +01:00
ThomasandClaude Opus 5.5 30946703cc test(libSceVideoOut): delete registered flip and vblank events
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 23:50:18 +01:00
mrph28 6a2c3e7d99 feat(libSceVideoOut): export sceVideoOutCursorSet2xMagnify
PC5 (PPSA11018) imports the NID and the library did not export it, so the converted executable stopped at load with error 127. The call validates the handle and index like the other cursor calls and returns 0: no cursor image is drawn, so the magnification has no observable effect. The unmeasured behaviour is recorded under Silent stubs.
2026-10-29 17:54:07 -03:00
MarcZX10 e1dd271db6 test(libSceVideoOut): cover the mouse button reset and the dropped releases
video_out_mouse_tests holds a button, opens a dialog and releases it: the title
receives one reset instead of the release, later presses and releases are
dropped, and both reach the title again once the dialog closed.
2026-10-29 14:06:13 +00:00
MarcZX10 f1bd41962d test(libSceVideoOut): cover mouse button presses while a dialog is shown
video_out_mouse_tests checks that a button press made while a dialog is shown
produces no mouse data, and that presses and releases reach the title once the
dialog closed.
2026-10-29 14:06:13 +00:00
MarcZX10 f27176100f test(libSceVideoOut): cover mouse motion and wheel while a dialog is shown
video_out_mouse_tests checks that the wheel reaches the title without a dialog,
that motion and wheel produce no mouse data while a dialog is shown, and that
motion is delivered again once it closed.
2026-10-29 14:06:13 +00:00
MarcZX10 3ba1c9510f test(libSceVideoOut): cover the pad hand-off to a modal dialog
pad_sdl_tests opens a two-button dialog with a virtual controller: the title reads
only the neutral intercepted state while it is shown, a Cross press answers it
with the focused button, the same press stays hidden from the title until it is
released, and the next press reaches the title.
2026-10-29 14:06:13 +00:00
MarcZX10 22f89eecae test(libSceVideoOut): cover the modal dialog keyboard and mouse input
video_out_dialog_input_tests feeds synthetic SDL events to DialogInput with a
three-button dialog open: every focus key and the wheel, the confirming and
cancelling keys and buttons, repeats, events for another window, unmapped keys
and buttons, and events while no dialog is open.
2026-10-29 14:06:13 +00:00
Dean ca6987de8a Merge pull request #11414 from p3n1cillin/claude/videoout-register-past-last-buffer
fix(libSceVideoOut): return INVALID_VALUE for a registration past the last buffer as the console does
2026-10-30 03:00:15 +13:00
p3nicillinandClaude Opus 5.5 5768bc971f fix(libSceVideoOut): refuse to unregister the buffer set on screen
The console answers RESOURCE_BUSY (0x80290009) when the set holding
the buffer on screen is unregistered, and the set stays registered:
EVO Player measured it with a re-registration then failing
SLOT_OCCUPIED, and Prospero Win on firmware 12.02 after its flips went
idle. The set was released and 0 returned instead.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-29 12:18:02 +00:00
Adrià b9246db364 Merge pull request #11853 from ionut27001/fix/wf-videoout-flipmaster-measured-codes
fix(libSceVideoOut): answer the flip-master calls as measured on a PS5
2026-10-29 12:57:56 +01:00
Adrià 2a90fb105b Merge pull request #9431 from Get-fix/ps4/agc-gcn
feat(libSceAgcDriver): draw PS4 (GCN) command buffers
2026-10-29 09:31:13 +01:00
p3nicillinandClaude Opus 5.5 cce9311f34 fix(libSceVideoOut): answer 0 and UNAVAILABLE_OUTPUT_MODE when the output has no 120 Hz
PS5_Vulkan measured on a base PS5 set to 1080p output that
sceVideoOutIsOutputSupported(15) answers 0, neither 1 nor an error, and
that sceVideoOutConfigureOutput(15) then returns 0x80290019, in a title
declaring high-frame-rate output. A host display below 120 Hz answered
0x80290016 to both instead. Titles that branch on the answer being 1
are unchanged; the undeclared-title answer stays 0x80290016.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:48:19 +00:00
p3nicillinandClaude Opus 5.5 60c8b94725 test(libSceVideoOut): move the past-last-buffer check away from the slot check
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:48:16 +00:00
p3nicillinandClaude Opus 5.5 338ea713f2 fix(libSceVideoOut): return INVALID_VALUE for a registration past the last buffer
PS5_Vulkan measured on a PS5 (firmware 13.40) that
sceVideoOutRegisterBuffers2 refuses a set at buffers 15 to 19 with
0x80290001. The call threw instead. The other out-of-range arguments
keep throwing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-28 13:48:15 +00:00