Commit Graph
5577 Commits
Author SHA1 Message Date
Chad b89b7f953c fix(agc): expand comp-to-single DCC keys in a DCC decompress pass
Key 0x10 (GFX9_DCC_CLEAR_SINGLE in Mesa) marks a 256-byte block whose texels all equal its first texel. A CB DCC decompress pass over uniform comp-to-single keys now writes that texel over its block and stores uncompressed keys; a fast-clear eliminate over them throws.
2026-10-11 01:38:27 +02:00
Zayd Zaari 718eb9cc3e fix(libkernel): return EBUSY when destroying locked rwlock 2026-10-11 01:37:26 +02:00
Scott SchusterandClaude Opus 5.5 dc48c61050 test(agc): a strided buffer's rounded-up last record stays within its own allocation
When another readable allocation starts right after the buffer's allocation,
the bound range still ends at the first allocation: the bytes past it are
outside the buffer the descriptor's records describe, and binding into the
neighbour would send the range back to a copy on every draw.

AI-assisted (Claude Code).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 01:37:00 +02:00
Scott SchusterandClaude Opus 5.5 b352406f70 fix(agc): bound a strided buffer's rounded-up last record by its allocation
RADV rounds a strided buffer descriptor's record count up, so stride * records
can run up to one stride past the end of the buffer's allocation. The guest
buffer region then no longer fits inside the allocation's host import and is
copied on the CPU, whole, for every draw that binds it.

When a strided descriptor ends less than one stride past the end of the
readable registered allocation that contains its base, the range is bound up
to the allocation's end. RetroArch's Dolphin core binds a 48 MiB stream buffer
with stride 20 (records 0x266667, 12 bytes past the allocation) on every draw.
With this change the buffer is bound in place from its import.

AI-assisted (Claude Code).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 01:37:00 +02:00
xXPBSXxandClaude Sonnet 5.5 6825e02372 fix(agc): ignore the window offset enable bit of the raster mode
The window offset register is already required to be zero, so the enable bit has no effect on a draw that gets this far.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-11 01:35:53 +02:00
Adrià c07638834d Merge pull request #2941 from CnRJay/fix/recompiler-selection-merge-loop-escape
fix(recompiler): merge a loop selection whose arm leaves the iteration where its arms rejoin
2026-10-11 01:35:31 +02:00
Adrià 6d71420c69 Merge pull request #2938 from MarcZX100/fix/agc-resize-idle-on-recreate
fix(agc): drain the device only when the swapchain is recreated
2026-10-11 01:35:27 +02:00
Adrià 29083579f4 Merge pull request #2873 from CouchRiv/fix-shader-div-scale-denorm-flush
fix(shader): flush v_div_scale_f32 input denormals
2026-10-11 01:35:02 +02:00
Daan DehingandClaude Opus 5.5 2dd453dae0 fix(agc): drain the registration preparation pool before the device is reset
Background registration preparations (#2583) copy the device's
SpirvTarget, whose capability and extension spans point into the
device's shader profile. Driver::stop reset the device without waiting
for the detached pool, so a preparation still queued or running read
freed extension names and agc_driver crashed at exit on RADV.

Driver::stop now closes the pool after joining the queue workers: it
stops queueing and waits until no task is queued or running. A
preparation submitted after that runs on the caller's thread, which
holds its own reference to the device, like the existing fallback for
a pool without threads.

Fixes #2891

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 01:34:05 +02:00
Jan ŠléglandClaude Fable 5.1 580ac08478 fix(shader): correct v_log_f32 near 1.0 when the driver's log2 strays from a series
The driver's Log2 has an absolute error that does not shrink with the
result, so near 1.0 the relative error explodes: on an RTX 3080, v_log_f32
of 1 - 2^-24 is 23,947,836 ULP off. Measured on RDNA2 (gfx1036), the
hardware's log2 is within 1 ULP of the correctly rounded value, and an
eight-term series in x - 1 is within 2 ULP of both for |x - 1| <= 1/8.

The lowering keeps the driver's Log2 and takes the series only inside that
band when the two differ by more than 4 ULP, so RADV's native result stays
bit-exact and NVIDIA's is within 6 ULP inside the band.
agc_driver_log_near_one pins 64 inputs per type from the oracle with
per-lane tolerances.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Claude-Session: https://claude.ai/code/session_012GLfKH7Sqe51wX254k1XsV
2026-10-11 01:33:44 +02:00
Adrià 383851643f Merge pull request #2940 from CnRJay/fix/recompiler-sdwa-cvt-f16-16-byte-source
fix(recompiler): accept SDWA byte sources on v_cvt_f16_u16 and v_cvt_f16_i16
2026-10-11 01:33:36 +02:00
Adrià 76e9fd3a89 Merge pull request #2922 from XairRrR/fix/graphics-interface-diagnostic
fix(agc-driver): list both stages' interfaces when graphics interfaces disagree
2026-10-11 01:31:38 +02:00
Adrià 2cae6cc3cd Merge pull request #2917 from XairRrR/feat/agc-prepare-unpredicted-variants
feat(agc-driver): prepare shader variants registration did not predict
2026-10-11 01:31:32 +02:00
Adrià ad3369236d Merge pull request #2920 from XairRrR/fix/runtime-image-mode-diagnostic
fix(recompiler): describe the descriptor and modes when no runtime image mode matches
2026-10-11 01:30:51 +02:00
Adrià 1be7c79336 Merge pull request #2921 from XairRrR/fix/guest-buffer-view-bounds-diagnostic
fix(agc-driver): name the view and owner bounds when a guest buffer view exceeds its GPU owner
2026-10-11 01:30:43 +02:00
Adrià d962de918a Merge pull request #2916 from XairRrR/feat/agc-8-8-swap-alt
feat(agc-driver): render to COLOR_8_8 targets with SWAP_ALT
2026-10-11 01:30:20 +02:00
Adrià 181420f881 Merge pull request #2915 from XairRrR/fix/spirv-shuffle-struct-extracts
fix(recompiler): fold extracts into a vector shuffle only between vectors
2026-10-11 01:23:07 +02:00
Adrià 1e52f94ea1 Merge pull request #3147 from SleglJan/feat/libc-realpath
feat(libc): implement realpath
2026-10-11 01:22:38 +02:00
Adrià b7bbe45f32 Merge pull request #2913 from MarcZX100/codex/libc-opendir-eloop-db343
fix(libc): report ELOOP from opendir symlink loops
2026-10-11 01:21:40 +02:00
Adrià 4b9f07519c Merge pull request #2864 from MarcZX100/fix/agc-release-deferred-imports
fix(agc): release retired imports while waiting for pins
2026-10-11 01:21:06 +02:00
Adrià 2b5d119fc5 Merge pull request #3138 from MarcZX100/codex/carry-font-script-3125
feat(font): retain script language and typographic design settings
2026-10-11 01:19:31 +02:00
Adrià 7d294690e2 Merge pull request #2856 from CouchRiv/fix-agc-shared-code-two-headers
fix(agc): retain registered headers sharing shader code
2026-10-11 01:18:38 +02:00
MarcZX100andClaude Opus 5.5 890169e094 feat(libc): implement memrchr
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 01:16:53 +02:00
Adrià 53924632bb Merge pull request #2675 from husseinkad/fix/lds-atomic-mixed-width-lock
fix(shader): LDS 32-bit atomics take the workgroup lock of the program's 64-bit LDS atomics
2026-10-11 01:15:44 +02:00
AlexandCodex gpt-6.1-sol cf637814eb fix(shader): flush v_div_scale_f32 input denormals
Enable the existing input-only f32 flush policy for division scaling.
RDNA2 measurements pin all three sources and signed zeros; keep the
scaling rules unchanged and retain their separate technical debt.

Co-Authored-By: Codex gpt-6.1-sol <[email protected]>
2026-10-11 01:14:31 +02:00
Adrià 5b4709f283 Merge pull request #3140 from MarcZX100/codex/carry-dialogs-3107
feat(dialogs): run G2P and VR setup dialogs without UI
2026-10-11 01:14:15 +02:00
Adrià aa79dbdfe3 Merge pull request #2885 from MarcZX100/fix/relinker-linux-input-phdr-interp
fix(relinker): drop input Linux PT_PHDR and PT_INTERP
2026-10-11 01:13:32 +02:00
Adrià df52ac8354 Merge pull request #2898 from MarcZX100/fix/libkernel-windows-lstat-reparse
fix(libkernel): detect Windows reparse points in lstat
2026-10-11 01:13:25 +02:00
Adrià a75c0c5759 Merge pull request #1430 from fisherjoey/fix/depth-surface-record
perf(agc): prove sampled depth surfaces in the fast resource proof
2026-10-11 01:12:49 +02:00
Jan ŠléglandClaude Fable 5.1 e1f168a24d feat(libc): implement realpath
Resolves a guest path the way FreeBSD 11's realpath does: a relative
path starts from the guest working directory, "." and empty components
are skipped, ".." drops the last component and never climbs above "/",
every other component must exist, and one that is not a directory with
anything after it is ENOTDIR. Backslashes separate components as in the
rest of the path layer. The result is the guest path; the host is
consulted only for existence and type, so host symlinks are followed but
not expanded, and ".." is lexical, as in the rest of the path layer. A
null buffer is PATH_MAX bytes from the application heap, a null path is
EINVAL, an empty one ENOENT, and 1024 bytes or more in the input or the
result is ENAMETOOLONG. On failure the caller's buffer holds the path
that failed.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Fnrk5Dazjb2tLooVSpdRQq
2026-10-11 01:11:33 +02:00
Adrià 0d2546e87f Merge pull request #2876 from CouchRiv/fix-shader-minmax-f16-denorm-flush
fix(shader): flush f16 min/max denormal inputs
2026-10-11 01:10:52 +02:00
Adrià 14bb70878e Merge pull request #2875 from CouchRiv/fix-shader-div-fmas-nan-ieee
fix(shader): follow IEEE_MODE in v_div_fmas_f32 NaN selection
2026-10-11 01:10:28 +02:00
Adrià c7375433e9 Merge pull request #2838 from MarcZX100/fix/sdwa-cvt-f16-u16-byte-sources-2747
fix(recompiler): accept byte source selectors on v_cvt_f16_u16 SDWA
2026-10-11 01:07:03 +02:00
AlexandGPT-6.1-Sol fb45627bb7 fix(agc): retain registered headers sharing shader code
Keep each registered header and its prepared shader state instead of
replacing every registration for the same code address. Resolve explicit
ABIs by header and programs by type, preserving re-registration order.

Co-Authored-By: GPT-6.1-Sol <[email protected]>
2026-10-11 01:04:43 +02:00
Scott SchusterandClaude Opus 5.5 e5ae8dfcb0 fix(libkernel): keep the alarm state alive until the process exits
The detached alarm thread waits on a condition variable that was a
namespace-scope static. At exit its destructor ran with the thread still
waiting, and glibc's pthread_cond_destroy blocks then, so a process that
called alarm never exited on Linux. The mutex, condition variable, deadline
and started flag now live in one structure allocated once and never
destroyed.

AI-assisted (Claude Code).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 18:04:35 -05:00
XairRrR 70d7aa58e3 perf(agc-driver): import adjacent registered ranges as one host-import span
A host import covered exactly one registered range, so a buffer crossing
two ranges had no import and was copied on the CPU at every use, under
the GPU mutex. Titles that map a GPU heap piece by piece (Uncharted maps
1 MiB direct-memory pieces) hit this for every buffer larger than a
piece.

An import now covers the run of address-adjacent registered ranges that
are readable with the same write and GPU access. Runs never overlap, so
imports do not either; an import is retired when any range of its run
changes, and a refused run is remembered by its base. Callers already
address imports relative to their base.
2026-10-11 01:04:12 +02:00
Abdulrahman Elkordy 5ea89c7d4c feat(font): keep a handle's script languages and typographic features
sceFontSetScriptLanguage, sceFontGetScriptLanguage,
sceFontSetTypographicDesign and sceFontGetTypographicDesign threw. With
the signatures SharpProspero declares, a font handle now keeps the
language set for each script and the feature set for each typographic
design, under the handle's lock, and returns them, with 0 for one never
set. They do not change shaping or rendering yet; TechnicalDebt records
the assumptions.

Claude-Session: https://claude.ai/code/session_012SLQbhAiexxW6TtjYToW8a
(cherry picked from commit c4dcbe4403dc635fde2a823dec311a939816cefc)
2026-10-11 01:03:52 +02:00
MarcZX100 f5618d9124 fix(agc): release retired imports while waiting for pins 2026-10-11 01:01:14 +02:00
Scott SchusterandClaude Opus 5.5 383bffd8c7 feat(libc): implement alarm
RetroArch (PPSA99169) stops at alarm on main: `FAIL: unresolved ELF import DQXJraCc1rA from libSceLibcInternal.prx`.

alarm(seconds) arms one process-wide real-time alarm and returns the seconds left on the previous one, rounded up like FreeBSD's alarm.c (any partial second counts); alarm(0) cancels it. When it expires, SIGALRM's disposition as recorded by sigaction or signal applies: ignored, nothing happens; default, the process terminates as on FreeBSD (exit status 128 + 14); a guest handler throws, because asynchronous delivery to a guest handler is not implemented.

The timer lives in libkernel next to the signal dispositions (GuestAlarm_nid_no_patch); libSceLibcInternal, which the titles import alarm from, forwards to it.

AI-assisted (Claude Code).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 17:59:58 -05:00
Adrià 64baa79b65 Merge pull request #2770 from Yuva1024/fix/avplayer-unsynced-test-autostart
test(avplayer): stop the unsynced test racing the player's auto-start
2026-10-11 00:59:44 +02:00
Adrià 3099003f02 Merge pull request #2846 from MarcZX100/fix/write-watch-thread-test-starvation
test(libc): keep macOS write watch stress bounded
2026-10-11 00:58:50 +02:00
xXPBSXxandClaude Sonnet 5.5 aace6a3f38 fix(libkernel): report the largest free direct memory block from sceKernelAvailableDirectMemorySize
The call returned the first free gap in the range instead of the largest free block.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-11 00:58:28 +02:00
Adrià e4045bbbbe Merge pull request #2839 from CouchRiv/fix-shader-tininess-after-rounding
fix(shader): detect f32 tininess after rounding when flushing products
2026-10-11 00:57:20 +02:00
xXPBSXxandClaude Sonnet 5.5 272b9d1338 test(relinker): check Windows TLS thread pointer offset
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-11 00:56:01 +02:00
xXPBSXxandClaude Sonnet 5.5 8e03bb0af8 fix(relinker): place the Windows thread pointer after the TLS size rounded to its own alignment
The converted thread pointer was set to the TLS block plus the size rounded to max(p_align, 16), while the guest reads its first variable at tp minus the size rounded to p_align. For a PT_TLS with memsz 0x21 and p_align 8 (Resident Evil 4) that is 0x30 against 0x28, so the first variable was read from the second slot. The thread pointer now uses the size rounded to p_align; the block layout is unchanged. WIP: the test for this is still missing.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-11 00:56:01 +02:00
Get-fix 9a13dc8c78 fix(relinker): stop code scans at the PLT in executables with PT_SCE_DYNLIBDATA
A PS4 executable (CUSA00900) keeps 37 MiB of read-only data in its
executable segment after the code. The syscall scan and the call-site
resolution decoded the whole segment linearly, reached a float table and
failed with "Unsupported 0F 79 opcode without SSE4A prefix". In
executables with a PT_SCE_DYNLIBDATA segment they now stop at the end of
the PLT that follows the last function of the unwind table. The PLT is
found by searching forward from that function for its first entry, which
pushes the GOT entry at PLTGOT + 8 and jumps through PLTGOT + 16, since
code without unwind entries can sit in between (680 bytes of start-up
code in an OpenOrbis-built sample). When the executable has PLT
relocations and no such entry follows, the relinker fails instead of
guessing. Executables without the segment are scanned as before.

(cherry picked from commit a21e8fe4c0e6c03189d559e992c0f037c076700d)
2026-10-10 22:53:48 +00:00
Abdulrahman Elkordy 2a92eaa351 feat(libs): run the G2P and VR setup dialogs as common dialogs without UI
libSceCdlgG2P and libSceVrSetupDialog threw from every export. They now
run the common-dialog state machine libSceLoginDialog uses: Initialize,
Open, the status calls, GetResult, Close and Terminate follow it, the
dialog finishes at Open without showing anything, and GetResult reports
that the user cancelled, writing only the leading int32 result. The
signatures are assumed from the other common dialogs, as TechnicalDebt
records. 13 exports move from stubs to implemented.

Claude-Session: https://claude.ai/code/session_012SLQbhAiexxW6TtjYToW8a
(cherry picked from commit 07992adf80bae9b2d7da4b751cd21c040fa1c5b8)
2026-10-10 22:53:48 +00:00
Hussein Kadhim c9e1fa0ce1 fix(shader): 32-bit flat atomics in the LDS aperture take the workgroup lock
A flat_atomic_* whose address lands in the LDS aperture updated the dword without the lock, so it could lose updates against a ds_add_u64 or a 64-bit flat atomic on the same dwords. It takes the lock like the 32-bit ds atomics when the program has a 64-bit LDS atomic; programs without one emit the same SPIR-V as before.
2026-10-11 01:53:37 +03:00
Jan ŠléglandClaude Opus 5.5 60301adc6d test(agc-driver): add a split-lane case with per-lane operands to the LDS mixed-width atomic test
On RADV the race between ds_add_u64 under the workgroup lock and a
concurrent ds_add_u32 only shows when the lanes get their operands from
per-lane buffer loads: with v_mov_b32 constants or loads from one address
no increment is lost there. The new case has the split-lane kernel's
parity split and loads each lane's (0xffffffff, 0, 1, 0) row from the input
buffer at tid * 16 with buffer_load_dwordx4, so the input buffer now holds
256 rows. With SpirvMemoryInstructions.cpp reverted it fails on RADV and
on the RTX 3080; with the change it passes on both.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Fnrk5Dazjb2tLooVSpdRQq
2026-10-11 01:53:37 +03:00
Hussein Kadhim 5253c499dc test(agc-driver): add the issue's split-lane kernel to the LDS mixed-width atomic test
Even lanes run ds_add_u64 and odd lanes run ds_add_u32 on the slot's high
dword, one pass per dispatch, as in the reported kernel, and the dispatch
is repeated 32 times from one compiled shader.
2026-10-11 01:53:37 +03:00