Commit Graph
332 Commits
Author SHA1 Message Date
liskeeeandClaude Opus 5.5 0c572f1c25 feat(agc): persist costly compute pipeline binaries
Capture costly compute builds and restore matching recipes after checking
full recipes, driver fingerprints and Vulkan compatibility keys. Add size
and time thresholds, opt-out, atomic persistence and corruption/rejection
fallback.

Remember below-threshold recipes in separate files so competing decisions
cannot overwrite captured binaries. Prefer saved binaries and retry
capture when the time threshold is lowered.

Cover compatibility, fallback, deterministic competing writers and
cross-process capture, restore and corruption.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 11:56:06 +01:00
Nicolas GonzalezandClaude Opus 5.5 2cf5b41ec8 perf(agc): trap CPU reads of label readbacks on macOS instead of storing them
Before a label, a pending linear or small storage image that shares no page
with another pending or storing image now gets a write-watch read trap
instead of its store. The first access to its pages stores it through the
host-read hook; any other store releases the trap first.
APS5_NO_LABEL_READ_TRAP=1 keeps the store at the label.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 03:37:51 -03:00
Nicolas GonzalezandClaude Opus 5.5 132bceac18 Merge remote-tracking branch 'upstream/main' into perf/libc-write-watch-fault-ahead
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 00:49:29 -03:00
Adrià 01d65a198c Merge pull request #12536 from MarcZX10/feat/fps-limit-pacing
feat(videoout): add ANYPS5_FPS_LIMIT to cap the rate the window presents
2026-11-01 04:44:08 +01:00
Dean 5d3ad2112f Merge pull request #10720 from meh7an/perf/shader-fast-f32
perf(shader): let APS5_FAST_F32 compile f32 arithmetic with host float rules
2026-11-01 16:41:29 +13:00
MarcZX10 1ca4301c84 docs(env): list ANYPS5_FPS_LIMIT in the environment reference 2026-11-01 01:49:43 +00:00
Adrià a9ae365e54 Merge pull request #13803 from MarcZX10/feat/pad-identify-pulse
feat(libSceVideoOut): pulse each bound controller with its player number, opt-in with ANYPS5_PAD_IDENTIFY
2026-11-01 02:10:05 +01:00
Adrià 7c4dcf0ad8 Merge pull request #13774 from Celegans12/fix/shader-null-buffer-substitutes
fix(shader): reuse bound specialization fields for null buffer slots
2026-11-01 02:00:51 +01:00
Dean Galvin 7ec2940c11 Merge main into perf/shader-fast-f32 2026-11-01 13:38:19 +13:00
Adrià d7c7e5744d Merge pull request #10194 from harry-z-kang/codex/10041-memory-accounting
feat(agc): trace device memory allocations and cache budgets
2026-11-01 00:54:33 +01:00
MarcZX10 d0abb2f21d feat(libScePad): parse ANYPS5_PAD_IDENTIFY as off, connect or always
The mode is read once, the first time it is needed, and an unset
variable means off. Any other value, including an empty one, throws an
error that names the variable and the value. The variable is added to
the libScePad table of ENVIRONMENT.md. Nothing reads the mode yet, so
no pulse is sent by this commit.
2026-11-01 00:04:29 +01:00
Celegans12 068f2b3ecf fix(shader): reuse bound specialization fields for null buffer slots
Null buffer descriptors still split modules on unused specialization
fields after buffer presence moved to run time. Learn the first valid
bound fields per slot and use them for absent descriptors, retaining
actual runtime presence and independent bound formats.
Snapshot the learned fields once for result memo keys and materialization
so identical null captures cannot retain a module made before learning.
Cover direct, captured and prepared calls, null stores, and changed formats.
Keep the process-local table and an off switch for main's module selection.

AI-assisted: yes
2026-10-31 23:22:39 +01:00
AdriàandClaude Sonnet 5.5 c0a7281888 fix(main): let the frame-capture tests not depend on runner free disk
Culprit-adjacent #12862; failing run 41237240415 (linux agc_driver_frame_replay,
frame_capture_eop, frame_replay_*). The recorder stops with 'less than 4 GiB free
on the capture volume' and writes zero frames when the shared runner disk is
nearly full. APS5_FRAME_CAPTURE_MIN_FREE_BYTES overrides the threshold (default
unchanged); the tests set 0.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-31 22:10:26 +01:00
Kang, Harry Zixuan 465aa0a238 feat(agc): trace device memory allocations and cache budgets 2026-10-31 14:05:00 -07:00
Nicolas Gonzalez d6083b1d58 Merge remote-tracking branch 'upstream/main' into perf/libc-write-watch-fault-ahead 2026-10-31 17:10:54 -03:00
Adrià 0836dfdf4f Merge pull request #13701 from MarcZX10/feat/psn-unavailable-dialogs
feat(libSceIme): show a notice when PSN-only system dialogs open
2026-10-31 21:05:21 +01:00
Adrià 3197f0ad06 Merge pull request #13705 from MarcZX10/fix/pad-port0-connected-state
feat(libScePad): report port 0 as connected only while its controller is present, opt-in with ANYPS5_PAD_PORT0_STATE
2026-10-31 20:50:35 +01:00
MarcZX10 2318cf0b92 Merge remote-tracking branch 'upstream/main' into fix/env-reference-constant-names 2026-10-31 13:37:22 +00:00
Nicolas GonzalezandClaude Opus 5.5 2c15fa59b4 fix(libc): keep write-watch fault-ahead inside the faulting page's 64 KiB block
libSceAgcDriver decides per 64 KiB block whether a pending storage image
keeps the CPU's bytes. A window that ran into the next block marked it
CPU-written and dropped the GPU results there (agc_storage_write_back,
agc_idle_publish_wait, array layer and depth plane tests).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 02:32:46 -03:00
Nicolas GonzalezandClaude Opus 5.5 54080056ff perf(libc): unprotect the pages ahead of a sequential write fault on macOS
A guest thread that writes a large watched range in order takes one
write-watch fault per page. Under Rosetta 2 each fault is a Mach
exception round trip. When the two pages before the faulting one were
written since the last collection, the handler now unprotects up to 32
pages from it that have the same protection and records them as
written. APS5_WRITE_WATCH_FAULT_AHEAD sets the count; 0 or 1 keeps one
page per fault.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 23:13:12 -03:00
MarcZX10 5b7ba8484a Merge remote-tracking branch 'upstream/main' into feat/host-free-space
# Conflicts:
#	core/libs/prx/libSceSaveData.native/Export.cpp
2026-10-31 00:26:47 +00:00
MarcZX10 7c6e12bd6f docs: say that an empty ANYPS5_FREE_SPACE is unset on Windows 2026-10-30 23:49:25 +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à 6362046d10 Merge pull request #12569 from MarcZX10/feat/host-volume-mute
feat(libSceAudioOut): host volume and mute hotkeys, opt-in mute on focus loss
2026-10-30 21:46:25 +01:00
Adrià 3410406e07 Merge pull request #13373 from mrfelek/perf/adaptive-staging
perf(agc): keep a staged element in place when its frames are faster
2026-10-30 20:57:01 +01:00
MarcZX10 0ca4999296 docs(ENVIRONMENT): list ANYPS5_PSN_DIALOGS
Add the row for the mode that shows a notice when a PlayStation Network
dialog opens, with its unset and invalid behaviour. The row is in its own
libSceIme section because the variable is read in that library.
2026-10-30 18:49:35 +00:00
MarcZX10 5d510f67dc docs(env): document ANYPS5_FREE_SPACE in the environment reference 2026-10-30 18:48:57 +00:00
mrfelek 17c3920ac4 perf(agc): keep a staged element in place when its frames are faster
Staging a swept write-only element (#7618) costs a copy-in and a
copy-back per use. In PPSA03912's town that saves GPU time, but in its
main menu the 202 MiB element is faster in place (73 vs 91 ms of GPU
time per frame), so the menu lost about a fifth of its frames.

Decide per element by measurement. The busiest element is probed in
its current mode, the other mode and its current mode again; the other
mode is kept when its frames are faster by more than twice the
standard error. A repeated answer doubles the wait for the next probe
from 20 s up to 160 s, and a jump of the frame GPU time by more than a
quarter (a scene change) probes again at once. The frame GPU time comes
from the whole-batch timestamps, which the first probe turns on.
Resource builds made under the other decision are not reused.
APS5_NO_ADAPTIVE_STAGING=1 stages every eligible element, as before.

The policy is in AdaptiveStaging.hpp, fed by the caller with frame
counts and time; agc_adaptive_staging covers keeping the faster mode,
frame noise, the back-off cap, a scene change and the share threshold.

AI-assisted. Tested by me on my own machine.
2026-10-30 16:38:05 +01:00
Adrià d09e7a46e9 fix(libScePad): resolve the merge with ShowPadStatus in the volume actions 2026-10-30 16:29:56 +01:00
MarcZX10 737bcb8f69 refactor(libScePad): own the shared host volume state
The volume, mute and focus state that libSceAudioOut applies and libSceVideoOut changes now lives in libScePad, which both libraries already link, instead of in libSceAudioOut. The tests that compile the state directly and the environment reference follow the file.
2026-10-30 16:29:55 +01:00
MarcZX10 31e13ce13f docs(env): list ANYPS5_VOLUME and ANYPS5_MUTE_ON_FOCUS_LOSS
Both are read in HostVolumeState.cpp when video output starts, and both refuse an invalid value with an error naming the variable.
2026-10-30 16:29:55 +01:00
MarcZX10 0b30ab25ac docs(env): APS5_TEST_DIRECT_READBACK is a presence switch
Old claim: the Kind column says "set", a label no other row uses.

What the code does: the test only checks whether the variable is set
(std::getenv(...) != nullptr); the value is not read.

Permalinks at audited SHA b1b5353cfc:
- https://github.com/boykopovar/AnyPS5/blob/b1b5353cfcee098ed17e3ba8a6e616bee97c9215/core/libs/prx/libSceAgcDriver/tests/execution/LayeredVolumeDraw.cpp#L273
2026-10-30 14:20:21 +00:00
MarcZX10 264e371850 docs(dev): document two test-only environment names found by the scanner
The corrected scanner now finds two names that the table did not list, both read by test programs: ANYPS5_GUEST_ENV_TEST_4C27 at core/libs/tests/GuestEnvironment.cpp#L29 (https://github.com/boykopovar/AnyPS5/blob/b1b5353cfcee098ed17e3ba8a6e616bee97c9215/core/libs/tests/GuestEnvironment.cpp#L29) and APS5_LOAD_EXEC_STANDARD_ERROR at core/libs/tests/GuestSystemServiceLoadExecStandardError.cpp#L72 (https://github.com/boykopovar/AnyPS5/blob/b1b5353cfcee098ed17e3ba8a6e616bee97c9215/core/libs/tests/GuestSystemServiceLoadExecStandardError.cpp#L72). Both are read by getenv through a local or constant name, which the old scanner did not follow, so --check reported no undocumented name before this change.
2026-10-30 14:08:37 +00:00
MarcZX10 31d5d4e297 docs(env): document ANYPS5_PAD_PORT0_STATE
Adds the row for the port 0 connection mode read when the pad input starts.
2026-10-30 14:02:55 +00: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
Dean 957970b247 Merge pull request #12147 from milescoviello/fix/prebuild-compile-budget
fix(agc): bound the SPIR-V that background compute pipeline builds compile at once
2026-10-30 22:20:34 +13:00
Adrià a36ff7f47e Merge pull request #12584 from Biologisten/fix/audio-pad-speaker-mute
feat(audio): add controller speaker fallback override
2026-10-30 07:12:28 +01:00
Adrià e4f5516fd6 Merge pull request #12974 from MarcZX10/feat/host-game-mode
feat(libkernel): opt-in host game mode request (APS5_GAME_MODE)
2026-10-30 06:36:04 +01:00
MarcZX10 38184b17ca docs(env): document ANYPS5_PAD_STATUS
The row names the variable, its values (1 shows the controller status
panel for 4 s on a connect, a disconnect or a battery drop to a lower
class; unset or 0 never shows it by itself) and that any other value is
refused, as the environment reference requires for every name the code
reads.
2026-10-30 05:54:56 +01:00
Adrià 84e114e4eb Merge pull request #12715 from MarcZX10/feat/log-to-file
feat(libc): copy the runtime log into a file with ANYPS5_LOG_FILE
2026-10-30 05:51:34 +01:00
Adrià 0c9c5db748 Merge pull request #12690 from MarcZX10/feat/host-system-report
feat(agc): host system report and an actionable missing-Vulkan-feature message
2026-10-30 02:52:18 +01:00
Adrià d0cf19b2cb Merge pull request #12233 from beardsciences/fix/nvidia-mesh-window-buffer
fix(shader): keep mesh register windows out of local memory on NVIDIA
2026-10-30 02:31:36 +01:00
Adrià f6fddd60d8 Merge pull request #9243 from fisherjoey/perf/draw-cache-indirect-admission
perf(agc): cache CPU-path indirect draws behind APS5_DRAW_CACHE_INDIRECT
2026-10-30 01:51:25 +01:00
Adrià 7a225bb303 Merge pull request #12686 from MarcZX10/feat/pad-rumble-intensity
feat(libSceVideoOut): add ANYPS5_RUMBLE to scale or turn off host controller vibration
2026-10-29 23:46:17 +01:00
MarcZX10 1b96282a6c docs(env): list APS5_GAME_MODE in the environment reference
Name the values, the Linux and macOS mechanisms, that only a missing
library is silent and only in auto, and that no failure is fatal.
2026-10-29 17:15:29 +00:00
Christian 6f79055a00 fix(shader): keep mesh register windows out of local memory on NVIDIA
On NVIDIA's proprietary driver, function arrays that live in local memory
and are read under a data-dependent branch return wrong values in
subgroups 1-3 of a mesh workgroup; subgroup 0 is correct. A wave64
geometry program whose relative addressing keeps its VGPRs in the vector
window therefore loses register writes in every wave but the first. In
the clipping geometry program of Sony's PS5 PSP emulator (PPSA07550) the
empty waves never cleared their candidate primitive slots and wrote
degenerate triangles over wave 0's, so the 3D menu drew spikes.

On that driver a mesh program's window now lives in a device-local
storage buffer of 256 workgroup slots of 65536 dwords, claimed through a
per-slot lock and released after the final barrier. The pool is created
before the first draw that uses it records anything, and its header is
zeroed in a batch of its own that is submitted and waited for; the pool
is published only after that wait, and a failure releases it. Direct
register accesses keep one function variable per register; a direct
store also writes the buffer when a buffer read can see it, relative
reads load the buffer, relative writes store only to it, and a direct
read that may follow a relative write loads the buffer and refreshes the
variable. A buffer entry is zeroed only when a buffer read can see it
before a write. APS5_NO_MESH_WINDOW_BUFFER=1 keeps the arrays.
2026-10-29 08:56:39 -04:00
Adrià 5454cd2e45 Merge pull request #11130 from imellag/perf/macos-mimalloc
feat(libs): let relinked macOS games opt into mimalloc
2026-10-29 12:58:23 +01:00
Adrià b62989b8bb Merge pull request #12432 from kiansaeidnia/feat/agc-dump-shaders-address-filter
feat(agc): APS5_DUMP_SHADERS takes a list of program addresses
2026-10-29 11:23:04 +01:00
Adrià 071ecaba53 Merge pull request #9723 from Sam-mon7/feat/sample-worker-queue
feat(agc): select the queue worker to sample
2026-10-29 10:40:44 +01:00
Adrià 8ab0b15bb4 Merge pull request #9626 from MarcZX10/codex/6139-bounded-registration-preparation
fix(agc): bound registered shader preparation memory
2026-10-29 10:40:33 +01:00