Commit Graph
14017 Commits
Author SHA1 Message Date
fogydes 0f38f0fe58 feat(libSceVoiceChat): export missing firmware voice chat interfaces 2026-10-19 11:39:06 +05:30
Adrià 9817d53cc9 Merge pull request #6345 from hypermoist/feat/libc-exact-math
feat(libc): add exact long double and BSD math exports
2026-10-19 08:06:40 +02:00
JJenkx f085363ef2 fix(agc): reject late profiling output after shutdown 2026-10-19 02:05:16 -04:00
Josip Parlov 278ea58337 test(agc): name the device limitation when the clear-key hand-over test skips 2026-10-19 08:03:03 +02:00
Josip Parlov 4c8eb6d369 docs(env): list APS5_NO_CLEAR_HAND_OVER 2026-10-19 08:03:03 +02:00
Josip Parlov 15466d7c53 test(agc): skip the clear-key hand-over test when its watched case cannot run 2026-10-19 08:03:03 +02:00
Josip Parlov b176274da1 perf(agc): keep a CPU store over a handed-over unit ahead of the receiving image's write 2026-10-19 08:03:03 +02:00
Josip Parlov 26fecae5b4 test(agc): state the clear-key hand-over fixture's layout 2026-10-19 08:03:03 +02:00
Josip Parlov 92063916d2 perf(agc): hand pending results over to an image whose DCC keys are a clear code
A storage image refreshed over memory where other images still had results
pending stored those results first, then uploaded. When the image's DCC keys
are a clear code its upload is a GPU clear that reads none of that memory, so
those stores were dead for it. Unreal's render graph does this whenever it
hands transient memory to a new texture it fast-clears.

In write-watched memory the results now stay pending. Anything that reads the
memory before the image is written stores them as before. Once the image's own
results cover their 64 KiB units they are dropped, as its write-back stores
every byte of those units; an image written again since keeps its newer
results, and a unit stored after the hand-over no longer counts as a CPU store
against the image's write. The path is chosen from the keys read before any
flush, and only when no flush is needed. APS5_NO_CLEAR_HAND_OVER=1 stores the
results first as before.
2026-10-19 08:03:03 +02:00
Josip Parlov 1208bb5a54 test(agc): expect an unmap inside a host import to keep its larger side 2026-10-19 08:02:13 +02:00
Josip Parlov 2d90ce58a8 test(agc): check a trimmed import whose kept side is unmapped and mapped again
While a trimmed import waits for the next refresh it pins no registered
range, so the guest can unmap its kept side and map new pages at the
same address without waiting for it. The new pages must be imported
again: the GPU has to read their bytes, not the old pages the trimmed
memory still pins.
2026-10-19 08:02:13 +02:00
Josip Parlov df72da5dbf docs(agc): describe trimmed host imports and backing serials 2026-10-19 08:02:13 +02:00
Josip Parlov 9af0914ff4 test(agc): check trimmed host imports after protects and unmaps inside them
agc_trimmed_import imports 32 MiB of singly mapped direct memory whole
and then cuts it: a 16 KiB page made inaccessible nearer its start or
nearer its end, an unmap of a 2 MiB resident run inside it, an unmap of
its first 2 MiB run, and an unmap of the first 1440 KiB of that run. It
checks that the larger side keeps the import's memory, or, when the
unmap replaced pages of the kept side's run, that it is imported again;
that the smaller side is imported apart from it; and that the GPU reads
the guest's bytes through each import while the write watch collects CPU
stores and reports none nobody made. Each unmapped span is then mapped
again at the same address, and the whole range must be served by a new
import that matches the new pages and the kept side.
2026-10-19 08:02:13 +02:00
Josip Parlov 7357c85999 test(agc): time host re-imports after cuts at the tail and inside the range
The re-import bench only moved the start of the range. It now runs three
patterns, each on a fresh 1126 MiB range: the head or the tail loses GPU
access 1440 KiB at a time, or a 16 KiB page inside the kept side loses
all access (256 MiB in, then 1440 KiB above the one before). For every
cut it prints whether the kept side was trimmed or imported again, the
cut and import times and, for a cut inside, the import of the smaller
side. After each pattern it checks that the kept side still matches the
guest's bytes and write watch. The bench is registered on Windows only,
the one platform it runs on.
2026-10-19 08:02:13 +02:00
Josip Parlov b2a12bac84 fix(agc): hold a released trimmed import through the recorder
releaseTrimmed freed the trimmed import's memory at once when the
calling thread did not hold GpuMutex. It now hands the memory to the
active recorder whenever there is one, as retireImport does for the
imports importRunAt and refreshImports retire, so the memory outlives
the open batch and every batch submitted before it.
2026-10-19 08:02:13 +02:00
Josip Parlov 16473dbbe1 perf(agc): keep the larger side of a host import cut inside its range
A protect or unmap strictly inside a plain host import still retired the
whole import, and the next access imported both sides of the cut again.
The larger side is now kept as a trimmed import, as a cut at the head or
the tail already is, and only the smaller side is imported again. Equal
sides keep the tail.
2026-10-19 08:02:13 +02:00
Josip Parlov 6970fb0b09 test(agc): check that a trimmed host import keeps its write watch and guest bytes 2026-10-19 08:02:13 +02:00
Josip Parlov f9caa09745 perf(agc): keep a host import across a split of its guest range 2026-10-19 08:02:12 +02:00
Josip Parlov 18d2ce913c test(agc): time host re-imports of a range whose start moves 2026-10-19 08:01:59 +02:00
Leonardo 6d95f1e3a0 docs(libSceVoiceQoS): classify packet calls as silent stubs 2026-10-19 08:01:14 +02:00
eth-j17andClaude Opus 5.5 ca4303a155 feat(trace): record host, title and per-frame benchmark data
The summary line names the CPU, its thread count, physical memory and,
with param.json, the title ID, name and content version.

APS5_TRACE_BENCH=1 with APS5_TRACE_SUMMARY_EVERY rewrites
aps5-bench-<commit>-<pid>.json.gz at each interval with the time between
every two presents, so reports can be recomputed and checked from raw
frame times. param.json's contentVersion is read when present.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 01:01:13 -05:00
fogydes c3775ea000 feat(libSceAgcDriver): implement command buffer submission 2026-10-19 11:28:13 +05:30
hypermistandClaude Opus 5.5 6b176d98e3 test(agc): exceed the device's own indirect dispatch limit
The over-limit row was a fixed 0xffffffff in X, which is a valid count
on devices that report that X limit (RX 9070 XT). Take the first axis
whose limit is below 0xffffffff and use limit + 1 there; skip when no
count can exceed the limits.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 18:57:39 +13:00
hypermistandClaude Opus 5.5 6a33a080bf Merge upstream main into fix/agc-gpu-indirect-dispatch-limit
recordDispatch now reads its indirect offset through HostImportOffset,
which adds the import's lead. The unchecked path passes that offset to
vkCmdDispatchIndirect; the clamp kernel reads from import.address plus
the guest offset, since import.address already includes the lead.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 18:57:30 +13:00
xdCloudy 753b03811c feat(prx): declare charset and VDECSW exports 2026-10-19 06:57:18 +01:00
xdCloudy 8f21bcbc98 feat(prx): declare notification exports 2026-10-19 06:57:16 +01:00
xdCloudy afc389c1bc feat(prx): declare NetCtlAp exports 2026-10-19 06:57:13 +01:00
Werner 9babdd83fb fix(relinker): merge zero-filled Mach-O segments past the dyld segment limit
Backing only the pages a pointer touches splits a zero-filled run into
one section per backed block. Each becomes a Mach-O segment, and dyld's
bind and rebase opcodes address at most 16 segments, so a module with
pointer slots on many separate zero-filled pages converted on main but
failed with --macos. When the segments would pass that limit, adjacent
sections with the same protection are merged again, smallest gap first.

Reported by jotitadev in the review.
2026-10-19 05:55:26 +00:00
Adrià 46f27623c2 Merge pull request #6278 from hypermoist/perf/unwind-dl-find-object
perf(libc): find unwind tables with _dl_find_object on glibc
2026-10-19 07:53:50 +02:00
Yunus Shaikh 53cc193a3c Merge main into fix/agc-sample-location-grid-exact
#6503 took request serialization 36 for its float32 flush flag, so this branch's sample order moves to 37. The version relabels in ShaderMemory.cpp and RequestSerializerTests.cpp drop both trailing flags and the sample order.
2026-10-18 22:52:06 -07:00
Dean 2dcc94109e Merge pull request #7733 from MarcZX10/codex/fix-spirv-validator-exit-unwind-7732
fix(cmake): link MinGW spirv validator exit test runtime
2026-10-19 18:52:02 +13:00
Dean 323ece2445 Merge pull request #7445 from elliot1377/fix/agc-dispatch-split-base
fix(agc): split oversized dispatches with workgroup offset specialization
2026-10-19 18:51:58 +13:00
Dean 819ced2e1d Merge pull request #7674 from thuanquang/fix/mesh-layer-block
fix(shader): write a mesh shader's layer through a per-primitive block
2026-10-19 18:51:54 +13:00
Adrià 5710355fbd Merge pull request #6242 from fogydes/feat/sysmodule-ps5-module-table-mappings
feat(libSceSysmodule): register missing user and internal sysmodule IDs
2026-10-19 07:51:24 +02:00
Jota 502b55722a fix(relinker): detect output aliases with a filesystem probe outside Windows
Fresh outputs whose names differ only in case, or that the volume treats as the same name otherwise, were not detected outside Windows. On default macOS APFS, for example, Ä/ä, Ω/ω, Ж/ж and canonically equivalent NFC/NFD names refer to the same file, so one output silently overwrote another.

Outside Windows, create the first name in an identity directory next to the outputs and check whether the second name resolves to it. This lets the filesystem decide instead of folding text, so case-sensitive volumes still report distinct names.
2026-10-19 02:50:43 -03:00
Adrià 79c7076e91 Merge pull request #6265 from fogydes/feat/usb-storage-dialog-exports
feat(libSceUsbStorageDialog): implement common dialog lifecycle exports
2026-10-19 07:50:21 +02:00
Adrià 13c63f9116 Merge pull request #6307 from fogydes/feat/contentdelete-firmware-exports
feat(libSceContentDelete): export missing firmware content delete interfaces
2026-10-19 07:49:17 +02:00
pushkarreddyy bfd5b6e388 fix(recompiler): constrain ActiveMaskImplies template and make bounded test key dynamic 2026-10-19 11:15:37 +05:30
pushkarreddyy b7e0189265 feat(recompiler): support waterfall select conditions and key bounds in pointer image tables 2026-10-19 11:15:37 +05:30
hypermistandClaude Opus 5.5 1181068a68 fix(libc): keep exact math results independent of the host libm
drem, dremf, remainderl and remquol now set EDOM themselves for an
infinite x or a zero y, as fmodl does. Apple's libm never sets errno and
MinGW skips it for long double, so the host could not be relied on.

Guest long is 64 bits, but the host long is 32 bits on Windows. The
lrint, lround and scalbln exports now take and return std::int64_t,
round through llrint and llround, and clamp scalbln exponents to the int
range, where the result is already infinite or zero. The test uses
INT64_MAX instead of LONG_MAX and covers remainderl, dremf and a 2^40
lrint result.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 18:45:08 +13:00
fogydes 144c1a58ca feat(libSceVideoRecordingP): export missing firmware 3.20 video recording interfaces 2026-10-19 11:13:20 +05:30
Scott SchusterandClaude Fable 5.1 e8377c9144 perf(agc): a DMA_DATA prefetch keeps the draw pipeline
A DMA_DATA whose destination is nowhere writes no memory, so the draws ahead of it have nothing to order against. RADV issues one per draw, and each drained the pipeline and idled the queue worker until the committer caught up.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-19 07:43:15 +02:00
bappisinsane bfb2cb0b74 chore: consolidate release notes tests and fix checklist 2026-10-19 11:40:59 +06:00
Adrià 9f5d4bd929 Merge pull request #6503 from ThatsLeo/perf/shader-hw-f32-flush
perf(shader): flush f32 denormals in hardware when a startup probe matches the emulation
2026-10-19 07:40:27 +02:00
TamaleroandClaude Opus 5.5 b574f2a51f fix(libkernel): claim a released direct memory range before unmapping its views
The checked release tested that the range was allocated, released the pool lock and then
unmapped a snapshot of its views. Two concurrent checked releases of one range both passed the
test and took the same snapshot; the second then unmapped views the first had already removed
and terminated on "unmap address is not registered" instead of returning ENOENT.

A release now claims its pages in the pool under the pool lock before it looks at the views,
and frees them, dropping the claim, after the unmap. A checked release of pages another release
has claimed returns ENOENT as if they were already free; a plain release waits for that release
to finish. The pages stay allocated while claimed, so they still cannot be reallocated during
the unmap's lease wait.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 22:40:10 -07:00
al3w0f205 55d4a9fa1d feat(libSceAgcDriver): support quad-list primitive type
Primitive type 19 (DI_PT_QUADLIST, 0x13) is used by Unity and other engines for UI quads, sprites and font glyphs. Because Vulkan lacks native quad-list primitive topology, quad draws are expanded on the CPU into indexed triangle lists with 6 indices per 4-vertex quad, respecting the first/last provoking vertex configuration and discarding incomplete trailing vertices. Adds unit tests and documents the functional debt.
2026-10-19 07:39:59 +02:00
hypermistandClaude Opus 5.5 298fbdc917 fix(libc): walk program headers outside the unwind cache lock
dl_iterate_phdr takes the loader lock. Calling it with the base cache
mutex held inverts the order against a thread inside dlopen whose
constructor throws and reaches FindFrameFast. Probe first, then lock
only for the lookup and the insert; racing misses compute the same
bases and emplace keeps the first.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-19 18:33:35 +13:00
fogydes a03d891ec0 feat(libSceUsbStorageDialog): implement common dialog lifecycle exports 2026-10-19 11:00:59 +05:30
Dean Galvin 9e32729ab5 Merge main into pr-7154
# Conflicts:
#	core/libs/prx/libSceAgcDriver/Graphics/include/DepthSurface.hpp
#	core/libs/prx/libSceAgcDriver/Graphics/src/ShaderResources.cpp
2026-10-19 18:29:52 +13:00
fogydes 52ac9dc161 feat(libSceContentDelete): export missing firmware content delete interfaces 2026-10-19 10:55:39 +05:30