Commit Graph
14017 Commits
Author SHA1 Message Date
Dean 8fe6046a6a Merge pull request #6777 from MrMha/fix/overlap-nul-paths-20261016
fix: preserve quoted Git filenames in overlap detection
2026-10-18 12:57:00 +13:00
Dean f599860471 Merge pull request #6770 from MrMha/fix/oracle-path-compiler-20261016
fix: key oracle builds by the compiler selected through PATH
2026-10-18 12:56:57 +13:00
Dean 18e507557e Merge pull request #6739 from simonbronk/codex/stubgen-readonly-destinations
fix(stubgen): reject read-only outputs before replacement
2026-10-18 12:56:53 +13:00
Dean e14e281c82 Merge pull request #6624 from IshmamDC217/fix/conventions-multiline-string-comments
fix(tools): find Python and CMake comments across multi-line strings
2026-10-18 12:56:50 +13:00
Dean 027cc4efc9 Merge pull request #6577 from GalaxyGamingFR/fix/check-compile-merge-base
fix(check_compile): take changed units from the merge base
2026-10-18 12:56:47 +13:00
Dean 58cd04c7e9 Merge pull request #6576 from GalaxyGamingFR/fix/check-main-sync-fetch-base
fix(check_main_sync): fetch an explicit --base before resolving it
2026-10-18 12:56:43 +13:00
Dean 5b7ec4a9bd Merge pull request #7272 from OskarLGS/fix/relinker-decoder-osize-branches
fix(relinker): decode near branches with an operand-size prefix as AM…
2026-10-18 12:56:40 +13:00
thibautandClaude Opus 5.5 bea4be8f95 perf(agc): let the resource cache bound come back down
Halve the grown bound (not below 1024 entries) once a window of the
bound's uses times a shrink window was served by at most a quarter of
it, and reset the bound on Clear(). The shrink window starts at 8 and
doubles (up to 1024) each time growth undoes the last shrink, so a set
of keys that comes back over a longer span stops the bound from
oscillating. The entries over the bound leave at the next insert, with
the other evictions.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01XBXM4pgkMHYEtqN1EQni2P
2026-10-18 01:49:40 +02:00
Yunus Shaikh 8f03535c8f Merge main into perf/agc-async-settle
Main's #7269 keeps the synchronous settle's buffer, memory and fence
per device in ImportSettle, so clearing one device's imports releases
only that device's objects. This branch's settle batches move there
too: each device's ImportSettle holds its batch target, memory and
batches with their fences, so switching devices no longer drops a
device's batch handles, and clearing a device waits for and destroys
only its own batches. The per-import settle state is renamed
pendingSettles to stay clear of main's per-device map, and a submitted
settle records the device whose batch it is in.
2026-10-17 16:36:23 -07:00
Yunus Shaikh 79365acde8 Merge branch 'perf/agc-host-import-aligned-blocks' into perf/agc-remember-evicting-refusals
#6457's branch now carries main's per-device import settles. Its
ImportSettle sits where this branch adds EvictingRefusal; keep both.
2026-10-17 16:31:39 -07:00
MontyMcK 4d741c26de feat(libSceHmd2): report a console without a PS VR2 headset 2026-10-18 12:31:32 +13:00
Destroyers212x a37797625c ci(relinker): build and test the relinker for x86-64 on macOS under Rosetta 2026-10-17 23:31:02 +00:00
Yunus Shaikh 8e927be27f docs: say that a malformed trophy or stat record line fails the query 2026-10-17 23:30:58 +00:00
Yunus Shaikh be9ade0f01 docs: say which posted trophy unlocks are refused and what stops a title
USAGE.md describes the refused posted unlocks and their log line, and
says that the icon queries and a damaged or unwritable unlock or
statistics file stop the game with an error. The debt entries of
libSceNpTrophy2 and libSceNpUniversalDataSystem no longer say that any
posted id is stored. Both USAGE.md and the libSceNpTrophy2 entry say
that without trophy data the platinum is not unlocked when the other
trophies are.
2026-10-17 23:29:24 +00:00
Yunus Shaikh a8dd45faa3 fix(libSceNpTrophy2): refuse a posted unlock of an unknown, platinum or progressive trophy
With the title's trophy data loaded, an _UnlockTrophy posted through UDS
no longer records an id the data does not have, the platinum, or a
progressive trophy. Each refusal logs the trophy and the reason, returns
false and calls no listener.

The statistics path and the platinum award now use an internal record
that keeps part 1's behaviour, so a progressive trophy still unlocks
through its statistic and the platinum with the last trophy that names
it. Without trophy data every id of 0 or more is recorded as before.
2026-10-17 23:29:17 +00:00
Yunus Shaikh e9611f13ae test(libSceNpUniversalDataSystem): check that a stat with a sum aggregation unlocks nothing
A title whose uds file defines a stat with an aggregation other than
latest gets one log line naming the stat. Posting an event for it
through the exports stores no stat and unlocks no trophy.
2026-10-17 23:29:17 +00:00
Yunus Shaikh 75ca9e469a docs: describe trophy statistics in USAGE 2026-10-17 23:29:17 +00:00
Yunus Shaikh 4362803457 feat(libSceNpUniversalDataSystem): unlock trophies through the title's statistics
Events other than the trophy events go through the title's
sce_sys/uds/udsNN.ucp: stats_definition.json gives the statistics that
keep their latest uint32 or uint64 value, and stats_extraction.json the
event property ($.name, dotted for nested objects) that sets each one.
Statistics are kept per user and service label in
_trophy/<user id>_<service label>.stats.txt next to the unlocks.

After each event that sets a statistic, every trophy's unlockCondition
(ge, gt, le or lt against its targetValue) is checked on the values that
event set and the stored values of the other statistics, so a later
event setting the same statistic cannot hide what this one reached.
Reached trophies unlock through the same path as _UnlockTrophy.
Progressive trophies report their statistic as progress, and
APS5_TRACE_UDS prints each statistic an event sets. A missing udsNN.ucp
is ignored and a malformed one is logged once.
2026-10-17 23:28:56 +00:00
Yunus Shaikh 42ddbdf89e docs: describe trophy unlocks in USAGE 2026-10-17 23:28:50 +00:00
Yunus Shaikh 98c700ea02 feat(libSceNpUniversalDataSystem): keep event properties and record posted trophy unlocks
Events and property objects keep their typed properties instead of
dropping them. PostEvent records an _UnlockTrophy event with an int32
_trophy_id for the user and service label of its context, logs why a
trophy event is ignored, and prints every posted event with
APS5_TRACE_UDS.
2026-10-17 23:28:11 +00:00
Yunus Shaikh 95179c1d61 feat(libSceNpTrophy2): record trophy unlocks per title and user
Unlocks are kept in _trophy/<user id>_<service label>.txt in the title's
run directory, one "<trophy id> <RTC tick>" line per trophy, and each new
unlock logs "[trophy] <title id> unlocked trophy <id> for user <id>".
GetTrophyInfo, GetTrophyInfoArray, GetGroupInfo, GetGroupInfoArray and
GetGameInfo report the recorded unlocks, their times, the unlocked
counts by grade and the progress percentage. An unlock also unlocks the
platinum the trophy names once every trophy naming that platinum is
unlocked. Unlock listeners let a later notification subscribe. Removing a
listener waits for its running callback, and a listener removed during a
dispatch is not called by it.
2026-10-17 23:27:39 +00:00
Dean bd58561708 Merge pull request #7294 from Amoenus/codex/feat-thick-s4kb-x-main64df
feat(agc): support thick 4 KiB standard XOR volumes
2026-10-18 12:26:42 +13:00
Yunus Shaikh 61e12c75fd docs: describe trophy data in USAGE 2026-10-17 23:26:06 +00:00
Yunus Shaikh d374de5e38 feat(libSceNpTrophy2): report the title's trophy data from trophyNN.ucp
The title's sce_sys/trophy2/trophyNN.ucp is read on first use with a
bounds-checked .ucp reader and a small JSON reader. tropconf.json gives
each trophy's grade, group, hidden and reward flags, platinum and
unlock condition, and tropmeta_<tag>.json its texts in the console
language, then en-US, then the file's default language. Contexts
remember their user and service label, so the queries find the file.

The trophy, group and game queries report these names, grades, groups
and counts, list every trophy and group, and give progressive trophies
their target. Unlocks are not recorded yet, so every trophy reports as
locked and nothing is written to the host. A missing file is ignored
and a malformed one is logged once; either way the queries keep their
placeholders. A JSON document that nests deeper than 64 levels or holds
more than 1048576 values counts as malformed, which keeps the parsed
values to about 140 MiB.
2026-10-17 23:25:07 +00:00
Yunus Shaikh 287dd14bf8 Merge branch 'perf/agc-host-import-aligned-blocks' into perf/agc-host-import-blocks
#6457's branch now carries main's per-device import settles, which this
branch's GuestBufferMemory.cpp conflicted with.
2026-10-17 16:23:57 -07:00
Yunus Shaikh 978ce35ef4 Merge main into perf/agc-host-import-aligned-blocks
Main keeps an import settle's objects per device in ImportSettle, next
to where this branch adds ImportRefusal. Keep both. Main's fallback for
a refused host-write alias returns after this branch's failure records.
2026-10-17 16:22:59 -07:00
milescovielloandClaude Opus 5.5 3d5335ab3a test(agc): check the export check with a gap below a color target
The unused-slot case had no colors and one blend, which the pipeline
refuses before it validates shaders. A target at slot 1 with slot 0
unused is the gap a draw can have.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 23:22:46 +00:00
milescovielloandClaude Opus 5.5 d3d362583b fix(agc): accept any fragment export where the draw has no color target
The fragment output check demanded a float4 (or uint4 for integer and
packed targets) at every location below the draw's MRT count, at least
one. A location with no color target, a draw without color targets or a
gap between written slots, has no attachment there, and Vulkan discards
the output whatever its type. Crimson Desert's first draw binds no color
target and exports a uint4 at location 0, and stopped there.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 23:22:46 +00:00
Dean 98c251fc62 Merge pull request #7317 from oneandonlydean/ci/intake-maintainer-reopen
ci(intake): let a maintainer reopen bypass the open-PR limit
2026-10-18 12:21:16 +13:00
Yunus Shaikh e40191d7c9 fix(libSceNpTrophy2): give progress values a type and a 64-bit value
A progress value is {int32 type, 4 reserved bytes, uint64 value}, as
KytyPS5 lays it out, which makes the trophy details 1312 bytes and the
trophy data 32 bytes. Size checks for every query structure keep the
layout fixed, and the technical debt names its single public source.
2026-10-17 23:21:04 +00:00
Yunus Shaikh 619257798a refactor(libSceSystemService): share the console language setting
SystemServiceConsoleLanguage in SystemService.hpp reads ANYPS5_LANGUAGE
with the same default, range and error as sceSystemServiceParamGetInt,
which now calls it. Other libraries can pick the console language
without linking libSceSystemService.
2026-10-17 23:20:43 +00:00
Yunus Shaikh 6884e9c441 Merge #6243's head into perf/shader-image-table-reuse-v3-pr
#6243 now expects a per-lane table image store to be supported, since
main's #6402 runs image stores through image tables. This branch
carries #6243's test, so it takes the same expectation.
2026-10-17 16:18:44 -07:00
Dean 5361e69de3 Merge pull request #7291 from gjonn/fix/shader-iterative-ancillary-readers
fix(shader): collect packed ancillary readers without recursion
2026-10-18 12:18:20 +13:00
Dean 67e93af55b Merge pull request #7290 from gjonn/fix/recompiler-sample-adjust-reserved-dword3
fix(recompiler): drop a sample-adjust S# dword 3 that sets only reserved bits
2026-10-18 12:18:16 +13:00
Dean f1dc7b4c19 Merge pull request #7293 from milescoviello/fix/trace-title-shader-threads
fix(agc): trace the title threads that register shaders
2026-10-18 12:18:13 +13:00
Dean 3954aed289 Merge pull request #7289 from LaunchDoesntCode/fix/itimer-sigalrm-pending
fix(libkernel): leave a blocked SIGALRM expiry pending
2026-10-18 12:18:09 +13:00
Dean eea74c1b23 Merge pull request #7269 from JJenkx/fix/agc-settle-device-lifetime
fix(agc): retain import settle resources per device
2026-10-18 12:18:06 +13:00
Dean dbc4085952 Merge pull request #7309 from morten-holm/fix/relinker-wide-store-keeps-segment-access
fix(relinker): move a neighbour without an FS or GS prefix with a 256-bit store first
2026-10-18 12:18:02 +13:00
jagrat Singh e3790eaf4b feat(libSceVoiceQoS): export missing firmware functions from database 2026-10-18 04:44:45 +05:30
Cesar Rodriguez b771ce4f37 fix(libkernel): name module-relative call sites and thread ids in Linux wait traces
On Linux, APS5_TRACE_WAITS and APS5_TRACE_USLEEP used an image base and a thread
id of 0, so "exe+0x..." printed absolute addresses and every site reported
"tid 0". The call site is now resolved with dladdr1(RTLD_DL_LINKMAP) and printed
relative to its module's load address ("exe+..." for the executable, the module
file name otherwise), matching guest offsets in a disassembly; the thread id is
gettid(). Descriptions are cached per call site, so polling titles do not pay a
dladdr1 per wait. Windows output is unchanged.
2026-10-18 12:10:35 +13:00
blu 39dd854c84 fix(relinker): keep test artifacts in the build tree
The tests build their working directories with tempfile.TemporaryDirectory()
and std::filesystem::temp_directory_path(), so every executable they generate
lands in the user's system temp directory. On Windows, Microsoft Defender
quarantines those generated binaries as Trojan:Win32/Wacatac.H!ml, and the
nine tests that run one fail with WinError 5 (access denied) on a clean
checkout: autorun_exit_status, optional_plt, empty_tls, tls_function_coverage,
executable_segments, windows_icon, guest_needed_modules,
guest_module_directories and windows_import_modules.

Point TMPDIR, TEMP and TMP at a build-local directory for every test
registered here, so generated executables stay inside the build tree. Test
artifacts are then removed with the build directory, and a contributor who
needs an antivirus exclusion can scope it to the build tree instead of the
system temp directory.
2026-10-18 12:10:25 +13:00
Dean 5de7a46e0b Merge pull request #7312 from MarcZX100/codex/native-depth-command-pool-reset-7311
test(agc): allow native depth fixture command buffer resets
2026-10-18 12:09:04 +13:00
Dean 582de4cc1c Merge pull request #7300 from hugodearaujo/fix/ampr-busy-when-full
fix(ampr): return EBUSY when a command does not fit and EPERM before a buffer is bound
2026-10-18 12:09:00 +13:00
Dean 56da45636d Merge pull request #7306 from jagrat04/feat/libSceProprietaryVoiceChatHelperPrx-get-voice-chat
feat(libSceProprietaryVoiceChatHelperPrx): export sceProprietaryVoiceChatHelperGetVoiceChat
2026-10-18 12:08:57 +13:00
Dean cfaba870d1 Merge pull request #7207 from gjonn/fix/agc-color-11-11-10-float
feat(agc): implement 11_11_10 float color targets through 32-bit uint attachments
2026-10-18 12:08:54 +13:00
Dean 5a86770667 Merge pull request #7242 from MarcZX100/codex/fix-mmap-flexible-replacement-7120
fix(libkernel): release flexible accounting after fixed mmap
2026-10-18 12:08:50 +13:00
Dean Galvin 7665cb3ef5 test(tools): check shader comments in one fixture repository
conventions_function_bodies_shard_4 timed out at 30 s on Windows in five runs on 17 Oct (main pushes 39076267931 and 39061030084, dispatches 39074123651 and 39044676931, relinker 39072918668). Shard 4 was the slowest shard in every Windows log (10-16 s on a quiet runner, 5-11 s for the others).

One case dominated it: test_comment_in_a_shader_is_reported built six fixture git repositories, 36 of the suite's 390 processes. Process start-up is what costs on Windows. #7314 doubled the shard count, but modulo sharding keeps that case whole, so its shard (now shard 10) still cost 0.63 s of the suite's 3.0 s locally against 0.76 s before.

The case now writes all six shaders into one fixture and runs the checker once (6 processes), still asserting each path. The slowest of the 12 shards drops to 0.39 s locally (43 processes), with no timeout raised.
2026-10-18 12:08:33 +13:00
Yunus Shaikh a53d23f810 Merge main into perf/shader-image-table-reuse-v3-pr
Main's #6402 stores to image tables: a table with a written entry takes
the fresh path, as it does on main, and so does one without a sampled
table binding, whose entries the fresh path rejects. The shared place
step uses the binding as a pointer. Main's #6614 frees descriptor sets
from shared pools one by one, while this branch keeps only dedicated
pools, so both stay. #7101's bulk key read counts its unmapped-page
skips as unmapped, and its key words sit next to this branch's write
stamp and compared runs.
2026-10-17 16:05:44 -07:00
Jota 9f000e8610 test(relinker): cover a PT_TLS inside an uncovered PT_SCE_RELRO 2026-10-17 20:05:14 -03:00
Romans Pokrovskis 4b674a72ba fix(agc): identify invalidated multisample DCC ranges 2026-10-18 02:03:58 +03:00