Commit Graph
12196 Commits
Author SHA1 Message Date
LeandroLP23andClaude Opus 5.5 f161a741db fix(agc): key the compute pipeline replay's module by the pipeline library mode
The replay rebuilds a captured compute pipeline to time it. With the
library feature off, production now flips the SPIR-V generator word
before vkCreateShaderModule. The replay creates the same module, so it
hits the same AMD driver cache entries as the run it reproduces.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 18:06:42 +02:00
PYTHONRETARDEandClaude Opus 5.5 d093d3b520 fix(agc): key shader modules by the pipeline library mode
AMD's Windows driver compiles pipelines differently when
VK_EXT_graphics_pipeline_library is enabled on the device, but its
on-disk cache (%LOCALAPPDATA%\AMD\VkCache) does not key on it. A process
in one mode is then served pipelines compiled in the other, and their
writes never land (#4768, #5271).

With the library feature off, every module now flips bit 15 of the SPIR-V
generator word, which no driver interprets, so the two modes hash to
separate cache entries.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 18:06:42 +02:00
Dean 77e31219c8 Merge pull request #8116 from dantdmdarealguy/fix/libc-readdir-fileno-windows
fix(libc): report the file number of each readdir entry on Windows
2026-10-21 04:55:57 +13:00
Dean 7ee65dcf12 Merge pull request #8012 from MarrasFederico/feat/razor-cpu-no-capture-tags
feat(libSceRazorCpu): run the data tag and logical file access calls without a capture
2026-10-21 04:54:42 +13:00
Adrià c9f680fb36 Merge pull request #7727 from leorossi2005/feat/voiceqos-packet-attribute
feat(libSceVoiceQoS): implement packet and local endpoint attribute functions to unblock Aliens: Fireteam Elite
2026-10-20 17:50:25 +02:00
Adrià 1a48337f13 Merge pull request #7634 from imellag/fix/macos-guest-arena-walk-test
test(libc): check that the macOS guest arena keeps free space beside host regions
2026-10-20 17:47:19 +02:00
Dean 10abe7d6da Merge pull request #8047 from fisherjoey/fix/template-texture-audit
fix(agc): fail a template's proof on a released texture and audit it with the full walk
2026-10-21 04:46:07 +13:00
Adrià 4036fab1b2 Merge pull request #7437 from lucaslima430/fix/libkernel-socket-fcntl-duplication
fix(libkernel): support socket fcntl duplication
2026-10-20 17:40:06 +02:00
Adrià 117fe9d608 Merge pull request #7625 from voidlakhan/fix/ampr-null-command-buffer
fix(ampr): validate null command buffer arguments
2026-10-20 17:36:49 +02:00
Adrià 2ee20b4200 Merge pull request #7575 from SeifKaroui/fix/signed-byte-memory-protections
test(libkernel): harden signed-byte memory protection coverage
2026-10-20 17:34:46 +02:00
Adrià 636aa09cb1 Merge pull request #7520 from milescoviello/perf/ir-single-use-list
perf(shader): keep one use list per IR value
2026-10-20 17:26:34 +02:00
Adrià b41a5ff685 Merge pull request #7516 from milescoviello/perf/f16-minmax-ordered-zero
perf(shader): leave out the both-zero select of f16 min and max
2026-10-20 17:26:28 +02:00
Muhammad Wasif Ali WasifandClaude Opus 5.5 243925113f fix(shader): order wave LDS accesses with a memory barrier on AMD's proprietary driver
A guest wave's lanes see each other's LDS writes without a barrier, so
the recompiler adds a subgroup-scope OpControlBarrier between an LDS
write and the next LDS access when the guest wave is one host subgroup
(WaveLdsScope). AMD's proprietary Windows driver 32.0.21042.62 (Vulkan
driver 2.0.353, "AMD proprietary shader compiler", Radeon 0x13c0)
compiles that barrier to s_barrier, as the pipeline's internal ISA
shows (26 s_barrier for the guest's 9 in a small LDS reduction). In a
workgroup of several waves, the waves that enter a branch holding LDS
accesses then execute extra s_barriers, which pair with the other
waves' barriers, and those waves read LDS before it is written. LLPC
compiles a subgroup-scope control barrier to a wave barrier instead.

PS5LM Plus (PPSA99581) answered with garbage on that driver: the first
compute dispatch of its first graph, an RMS norm with a 512-thread
wave32 LDS tree reduction, scaled every row except its first 32
elements by a partial sum, while NVIDIA matched a NumPy reference and
the inputs were identical.

On that driver the barrier is now a subgroup-scope OpMemoryBarrier,
which it compiles to no instruction. A 32-lane subgroup is one hardware
wave there, which runs its lanes in lockstep and issues its LDS
instructions in order; Vulkan does not guarantee that, so it is
recorded as debt. Other drivers keep the control barrier. The flag is
part of the shader cache key, and agc_shader_replay takes
--wave-lds-memory-barriers to replay a request the way that driver
compiles it.

agc_driver_lds_tree_reduction sums over eight wave32 waves the way the
guest does, with its last four steps inside one wave and no s_barrier
between them: before, thread 32 read 1936 instead of 32896 on the AMD
driver; it passes on AMD and NVIDIA now. agc_subgroup_barrier checks
the driver quirk and the emitted barriers on every runner. PS5LM Plus
now answers " Paris. It is the largest city in Europe ..." on the AMD
iGPU without flash attention, as on NVIDIA and the CPU.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 20:24:01 +05:00
bluandClaude Opus 5.5 0ecef87c4c fix(libkernel): answer Windows reparse points that are not links
lstat and readlink threw NotImplemented for every Windows reparse point
other than a symbolic link or a drive junction. A tag without the name
surrogate bit (cloud files, deduplication) does not stand for another path,
so lstat now answers as stat does and readlink returns EINVAL, as FreeBSD
does for a file that is not a link and as CPython's os.lstat and os.readlink
do (bpo-37834). A name surrogate that is neither a symbolic link nor a
junction (a mounted volume, a WSL link) is reported as the reparse point
itself with the mode of its attributes, and readlink returns EINVAL.

The tests set reparse tags with FSCTL_SET_REPARSE_POINT, one without the
name surrogate bit and one with it. A compact /exe (WOF) file cannot serve
as the fixture: on Windows 11 24H2 the WOF filter hides the reparse point
from GetFileAttributesW and FileAttributeTagInfo alike. Windows refuses
every open of an unhandled tag without FILE_FLAG_OPEN_REPARSE_POINT, so the
test requires lstat to agree with stat rather than to succeed.

mashingaan's boykopovar/AnyPS5#6447 returned EINVAL for other reparse
points without the tag check.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-10-20 08:21:33 -07:00
Federico Marras 5f6c30547e Merge remote-tracking branch 'upstream/main' into feat/kqueue-read-on-kqueue
# Conflicts:
#	docs/dev/debt/libkernel.md
2026-10-20 17:18:22 +02:00
Federico Marras 0d6ba22d9f feat(libSceAudioOut): serve the low-latency AudioOut2 calls through their standard counterparts 2026-10-20 17:16:40 +02:00
Adrià d073fe6a1d Merge pull request #7524 from jotitadev/fix/macos-guest-math-bessel-reference
fix(tests): compare the Bessel exports with fixed reference values
2026-10-20 17:16:08 +02:00
Adrià 1e1a19bf48 Merge pull request #7075 from AlexOfTheForest/feat/kevent-pipe-write
feat(libkernel): support EVFILT_WRITE on the write end of a pipe
2026-10-20 17:15:03 +02:00
Savvanis SpyrosandClaude Opus 5.5 267d211318 fix(shader): refuse a call link escape only at the wave size it escapes under
When the graph is built without the wave size and the return address
escapes under only one of wave32 and wave64, the graph records that size
and its error instead of throwing, and translation throws it only at
that size. A wave64 program that reads a compare mask written over a
call's link pair from a scalar instruction is now recompiled, while the
same program at wave32, where the high dword still holds the return
address, is refused.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 18:13:18 +03:00
Dean 5ccf1824df Merge pull request #6679 from SleglJan/pr/merged-hull
feat(agc): run registered merged hull programs (binary type 3)
2026-10-21 04:12:03 +13:00
Dean 3177d1989e Merge pull request #8036 from ymatrix1/feat/ime-filter-text
feat(libSceIme): implement sceImeFilterText
2026-10-21 04:11:45 +13:00
Savvanis SpyrosandClaude Opus 5.5 e0095e5b49 fix(relinker): find more constant syscall numbers before a gap syscall
The raw-byte check that runs before a syscall pattern between PS4 unwind
functions is skipped now also accepts mov rax, imm64, merges a following
mov al, imm8 or mov ax, imm16 into the earlier constant, and walks back
over any number of register moves or zeroings that leave rax alone
instead of at most seven. Visited states keep the walk linear in the
bytes it covers.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 18:10:59 +03:00
Dean 1a3a1b2e0e Merge pull request #3998 from MrMha/feat/controller-timelines
feat(pad): queue timed controller button sequences
2026-10-21 04:08:30 +13:00
Dean d243cc5cab Merge pull request #7960 from Lindamea1/fix/savedata-ps5-64k-blocks
fix(libSceSaveData.native): count PS5 save data in 64 KiB blocks, at most 16384
2026-10-21 04:08:02 +13:00
Joey Fisher 56ddbbbd0d test(agc): report a missing host import in lookup-changed as a device skip
resource-lookup-changed skipped with its own texts when the device has no
host imports or refuses the import of the watched surface. Neither matches
DEVICE_LIMITATION in tools/check_skips.py, so a runner without host imports
would fail the job instead of recording a device skip. Both now print the
existing "skipped, host imports are unavailable".
2026-10-20 09:07:28 -06:00
Savvanis SpyrosandClaude Opus 5.5 cf12795014 fix(shader): check call link registers for both wave sizes when the size is unknown
The control-flow builder does not know the wave size (the front end is
shared across wave sizes), and with an unknown size it took a v_cndmask
mask to read two registers but a VOPC result to write only one. A wave64
compare that overwrote a call's link pair before a v_cndmask read it was
then rejected as a link register escaping the call/return model. The
check now runs once for wave32 and once for wave64 when the size is
unknown, so each read is matched with writes of the same width.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 18:07:21 +03:00
Adrià 286908f918 Merge pull request #7615 from XD3V3LOP3RX/codex/windows-remap-write-watch
fix(windows): restore write tracking after resident direct remaps
2026-10-20 17:06:48 +02:00
Federico Marras 0bc9d64443 feat(libSceSystemService): end the running title through sceLncUtilKillApp and sceLncUtilKillAppWithReason 2026-10-20 17:06:08 +02:00
Adrià 054852a76b Merge pull request #6942 from AlexOfTheForest/fix/path-errno
fix(libkernel): report ELOOP and ENAMETOOLONG from mkdir, rmdir and truncate
2026-10-20 17:05:43 +02:00
Adrià acda0b06f9 Merge pull request #7416 from mohammad-alosta/add/unimplemented-system-lib-stubs
feat(libs): add unimplemented PS5 system library stubs and debt docs
2026-10-20 17:00:33 +02:00
Federico Marras 6ead14f9e8 feat(libkernel): watch a kqueue with EVFILT_READ 2026-10-20 16:56:06 +02:00
fogydes d5463ce04f feat(libSceRemoteplay): export missing firmware remote play interfaces 2026-10-20 20:20:29 +05:30
xXPBSXxandClaude Sonnet 5.5 923a32c9c9 fix(libkernel_sys): fail link, symlink, pathconf and fchmodat through a regular file with ENOTDIR
FreeBSD 11.4 vfs_cache_lookup answers ENOTDIR when the directory it searches
is not a directory (sys/kern/vfs_cache.c:2104-2105), the lookup behind the
calls fixed in the earlier ENOTDIR changes. These four calls answered ENOENT
for a path such as file/child on Windows.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 16:48:47 +02:00
Zenodeon 9fe1f963c8 test(agc): verify incomplete array history against the backend 2026-10-20 18:48:22 +04:00
Zenodeon c19dcecfec fix(agc): expire collected write proofs on allocation changes 2026-10-20 18:48:22 +04:00
Adrià 7526640c3c Merge pull request #7839 from hypermoist/feat/libc-reentrant-time-xtime
feat(libc): implement gmtime_r, localtime_r, timegm and the Dinkumware xtime helpers
2026-10-20 16:47:07 +02:00
Adrià 4cfcb003de Merge pull request #7862 from parl0v/fix/storage-budget-sampled-reserve
fix(agc): reserve only the sampled textures alive from the storage image budget
2026-10-20 16:45:56 +02:00
Federico Marras c9ff98e249 test(libSceRazorCpu): let the guest unwinder see the test's frames on Windows 2026-10-20 16:43:51 +02:00
fogydes 919e5f64f1 feat(libSceVorbisDec): export missing firmware Vorbis decoder interfaces 2026-10-20 20:09:32 +05:30
orezraeyandClaude Opus 5.5 1965dc0dc4 test(videoout): skip the HDR probe check on a monitor Windows reports as HDR
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 11:37:50 -03:00
Adrià 75787d2f64 Merge pull request #6696 from al3w0f205/feat/player-selection-dialog-support
feat(libScePlayerSelectionDialog): add common dialog lifecycle and tests
2026-10-20 16:36:40 +02:00
Dean GalvinandJoey Fisher 1cb64823ef Merge main into fix/template-texture-audit
Co-authored-by: Joey Fisher <[email protected]>
2026-10-21 03:35:29 +13:00
Zenodeon b8f6d316a9 test(agc): expose cached write history across allocation replacement 2026-10-20 18:31:03 +04:00
Zenodeon 5012f736d0 test(agc): scope unit history checks to write-watched hosts 2026-10-20 18:31:03 +04:00
Zenodeon 2421f6cfa0 fix(agc): retain write history for committed texture units 2026-10-20 18:31:03 +04:00
Zenodeon de0cf03efe test(agc): cover array slices beside uncommitted memory 2026-10-20 18:31:03 +04:00
Zenodeon c25566ca6d perf(agc): upload selected array layers through CPU staging 2026-10-20 18:31:03 +04:00
Zenodeon 2d677974d1 test(agc): cover CPU refresh of overlapping array targets 2026-10-20 18:31:03 +04:00
MiguelAdolfsenandClaude Opus 5.5 52a64aef65 perf(agc): refresh only the layers a use of an array color target covers
A color view of one slice of a 2D array target refreshed the whole array
image before each draw, sampled lookup and present. When the array's unused
slices lie over other live targets (ps5-opengl declares every target as a
two-slice array and allocates the next one over its second slice), each
refresh stored the other targets' pending results, wrote back its own and
uploaded the whole image from guest memory again, on every pass.

StorageTexture::RefreshLayers refreshes the tracked layers that hold the
given array layers alone: it flushes and compares their memory only, and
results of other images pending over the other layers stay pending. A layer
outside the range whose memory changed or that holds another image's pending
results is left behind; GenerationFor reports it as never current, so a use
over it takes the whole Refresh. It falls back to Refresh for volumes,
single-layer and DCC images, an alias, or results of the image pending
outside the range.

A draw into an array slice, a 2D view of one layer of an array image and a
present of one layer use it. The compare memo of untracked memory is kept
per range, so a layer refresh's compare is memoized like the whole image's.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 18:31:03 +04:00
Dean 5f7e30233e Merge pull request #7340 from teepean/perf/write-only-pass-continuation
perf(agc): draws that only store to a buffer continue one render pass
2026-10-21 03:23:29 +13:00