Commit Graph
4120 Commits
Author SHA1 Message Date
JAB-devandClaude Sonnet 5.5 69be01d843 fix(agc): keep centre barycentrics of 2-sample merges whose samples sit at the centre
The recompiler refused centre-located barycentrics in a multisampled
merge on a device without interpolation functions and fragment shader
barycentrics. It did so even when every sample sits at the pixel
centre, as in a draw raised from a one-sample rasterizer, where the
barycentrics are the centre's anyway. The refusal now applies only
when the merge's sample locations are off the centre. The pixel
request carries those locations for such a merge.

The recompile test runs on two states. On a 2-sample rasterizer, the
missing barycentrics throw, and the shader compiles once they are
present. On a raised draw, the shader compiles without them.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:50 +02:00
JAB-devandClaude Sonnet 5.5 d2a5895b8d fix(agc): refuse 2-sample 4_4_4_4 merges of shaders that write memory
A merge into a multisampled 4_4_4_4 target runs the pixel shader once
per sample. A shader that stores to guest memory, runs atomics or uses
GDS would then repeat those writes for every covered sample. An
8-sample pixel would add to a counter eight times. Such a merge now
throws.

The recompile request carries the merge's sample count, not whether
the guest asked for per-sample shading, so this also refuses shaders
the guest iterates itself, where the console repeats the writes too.

A recompile test checks that a 2-sample merging shader adding to a
buffer counter throws, and that the same shader without the merge
compiles.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:50 +02:00
JAB-devandClaude Sonnet 5.5 a1814c5853 fix(agc): refuse per-pixel inputs that move when a 2-sample merge iterates
A partial write of a multisampled 4_4_4_4 target makes the draw shade
per sample. For a shader the guest runs per pixel, every invocation of
a pixel must then see the same inputs. Otherwise its colours and kill
decisions follow each sample, while the console runs one invocation.

The decode now throws in two cases when the guest did not ask for
per-sample shading. The first is a shader that reads the ancillary
word, whose sample number would become the invocation's. The second
is a shader that reads centroid, sample-located or pull-model
barycentrics, Z, 1/W, or a position at the centroid or a sample. That
case is allowed when every sample sits at the pixel centre, as in a
draw raised from a one-sample rasterizer. The recompiler throws for
centre-located barycentrics on a device without interpolation
functions and fragment shader barycentrics, where they would not be
rebuilt at the centre.

Decode tests run each moving input on a 2-sample rasterizer, where it
throws, and with PS_ITER_SAMPLE, where it decodes. The raised draw
keeps the located inputs and refuses the ancillary word. Centre and
upper-left positions, centre barycentrics, the front face and the
fixed-point position decode, and a recompile test covers the missing
barycentrics. The debt entry now lists what is kept and what throws.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:50 +02:00
JAB-devandClaude Sonnet 5.5 6f0873cde0 docs(agc): list the limits of merged 2-sample 4_4_4_4 partial writes
Per-sample shading of a merging draw makes centroid and sample-located
inputs and the ancillary sample number follow the invocation's sample
(centre-located inputs too on devices without interpolation functions
and fragment shader barycentrics), and the 2-sample merge was measured
on one GPU only.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:50 +02:00
JAB-devandClaude Sonnet 5.5 6ccb8c052e fix(agc): refuse memory-writing 4_4_4_4 merges only where tests can reject pixels
The refusal of a merging shader that writes guest memory under late
tests fired in two cases where the early tests change nothing.

The first was a draw with no depth, stencil or depth-bounds test. Early
tests reject no pixel there, so every write the console makes still
happens. The target merge now carries whether the draw has such a
test, and the refusal applies only then. This adds one byte to the
version 40 merge fields of the recompile request.

The second was any GDS binding, including a shader that only reads GDS.
The refusal now looks for GDS writes, atomics, appends and consumes.

Tests: the depth and stencil decode checks the new flag, and the
static shader key depends on it. A counter-adding shader under late
tests compiles without a test and throws with one. A late-test merge
that reads GDS compiles, and one that adds to GDS throws.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:49 +02:00
JAB-devandClaude Sonnet 5.5 7ca6e1e9d2 fix(agc): refuse killing 4_4_4_4 merges while occlusion queries count samples
A merged 4_4_4_4 write runs its pixel shader after early depth and
stencil tests. Vulkan counts a sample for an occlusion query at those
tests, so pixels the guest shader kills under late tests would be
counted, and on the console they are not. Once the game has read an
occlusion counter the recorder counts samples for every later draw,
so from then on such a merge throws. The check runs where the recorded
and recipe draw paths prepare their inputs. The state records
DB_SHADER_CONTROL.KILL_ENABLE for it, which fits in the existing
padding.

The execution test starts sample counting and then checks two cases: a
merge that kills a checkerboard under late tests is refused, and a
merge that kills nothing still draws. A decode test reads KILL_ENABLE.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:49 +02:00
JAB-devandClaude Sonnet 5.5 1babc10d42 fix(agc): refuse merged 4_4_4_4 writes from shaders that write memory under late tests
A partial 4_4_4_4 write merges inside a pixel shader that declares
early fragment tests. When the guest runs the shader under late tests,
pixels that the depth or stencil test rejects still execute it on the
console, so their buffer and image stores, atomics and GDS operations
happen there. Under forced early tests they would be dropped. Such a
merge now throws, unless the guest asked for early tests itself. The
merged target's own image write does not count.

A recompile test checks two things for a merging shader that adds to a
buffer counter: under late tests it throws, and under the guest's early
tests it compiles with its one atomic add beside the merge. The same
shader without a merge still compiles under late tests.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:49 +02:00
JAB-devandClaude Sonnet 5.5 74376b9172 fix(agc): refuse partial 4_4_4_4 writes under merged coverage
A one-sample target under a multisampled rasterizer whose
OVERRASTERIZATION_AMOUNT matches (radeonsi line and polygon smoothing)
decodes with mergedCoverage and is drawn through mixed-samples coverage
reduction onto its one-sample attachments. A merging draw leaves the
4_4_4_4 target out of the attachments, a combination that is not tested,
so a partial write of such a draw now throws; the limit is listed in the
technical debt file.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:49 +02:00
JAB-devandClaude Sonnet 5.5 f4adaff1fe docs(agc): list the limits of merged single-sample 4_4_4_4 partial writes
Occlusion counts are taken at the forced early tests, the refused merge
draws and why a late depth write was not used, and the one GPU the merge
was measured on.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:49 +02:00
JAB-devandClaude Sonnet 5.5 acdbc02c8f docs(agc): note that CB resolves of 4_4_4_4 color targets throw
A CB resolve from a packed color target throws, so a 2-sample 4_4_4_4
target cannot be resolved by the color block.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-10-20 19:09:48 +02:00
Dean 83751168dd Merge pull request #8202 from babyhuey/feat/libkernel-open-event-flag
feat(libkernel): implement sceKernelOpenEventFlag
2026-10-21 05:59:15 +13:00
Dean baae66415c Merge pull request #5799 from SleglJan/fix/cube-output-modifiers
fix(shader): apply cube output modifiers whenever IEEE mode is off
2026-10-21 05:38:37 +13:00
Dean ab07854a58 Merge pull request #8166 from savvaniss/fix/sce-gap-syscall-data
fix(relinker): treat data between PS4 unwind functions as data in the syscall scan and the code roots
2026-10-21 05:17:04 +13:00
Adrià 10e2cbf648 Merge pull request #7541 from ionut27001/fix/libkernel-sysctl-absent-names
fix(libkernel): return ENOENT for thirteen sysctl names, as measured on a PS5
2026-10-20 18:13:19 +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à 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
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 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
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
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
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
Yuri Olive 9a6f7c1bac chore(tools): drop the codepage generator, kept in the PR description 2026-10-20 11:25:58 -03: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
Yuri Olive e5543aad64 chore(tools): add the sceImeFilterText codepage generator 2026-10-20 11:20:19 -03:00
Adrià 5f7aa5570c Merge pull request #7563 from babyhuey/feat/libkernel_sys-fstatat
feat(libkernel_sys): implement fstatat
2026-10-20 16:08:26 +02:00
Adrià 6e9279c51a Merge pull request #7829 from JJenkx/fix/shader-bda-anchor-read-sync114
fix(shader): retain adjacent anchor byte loads on RADV
2026-10-20 16:05:32 +02:00
Adrià d28cb2a66e Merge pull request #7785 from pushkarreddyy/fix/savedata-umount2-icon-null
fix(savedata): return parameter error on null arguments in umount2, loadIcon and saveIcon
2026-10-20 16:01:09 +02:00
Jan ŠléglandClaude Opus 5.5 8b8219dcef feat(agc): run registered merged hull programs (binary type 3)
A registered type-3 hull program holds the local and the hull part of a
tessellation draw in one binary, addressed through SPI_SHADER_PGM_LO_LS
(SH 0x148) with no SPI_SHADER_PGM_LO_HS: the local part runs on the lanes
below s3[7:0] and writes LDS, an s_barrier follows, and the hull part runs
on the lanes below s3[15:8] and may store the registers the local part
filled. The draw decode asked 0x148 for a type-5 local half, and
PPSA11386 (007 First Light) stopped in its level load with "registered
program refers to an incompatible shader binary type".

The draw decode now gives a registered type-3 program both the local and
the hull role and marks the tessellation configuration mergedHull. The
local stage only passes gl_VertexIndex and gl_InstanceIndex in a 16-byte
record. The hull stage runs the whole program, one invocation per output
control point: v2 and v5 come from the record of control point
min(gl_InvocationID, inputs - 1), v3 is the relative vertex id, and the
LDS becomes a per-control-point output array that a control point writes
in its own record and reads in any record of its patch after the barrier.
Registers live across the barrier stay in the invocation.

The hull stage of a merged program runs at one lane per invocation on
every device (HostSubgroupSize 1). Its lanes are gl_InvocationID, not host
subgroup invocations, so the s_cbranch_execz around the local part tests
the invocation's own lane. With the device's subgroup it took a subgroup
ballot, and lavapipe, whose subgroup stages lack the tessellation control
stage, rejected the draw ("subgroup capability 61 is unsupported for
shader stage 2").

The lowering refuses more input than output control points, LDS writes
outside the own record, reads outside the patch's records, barriers that
some invocations do not reach or that sit in a loop, reads or writes of
another lane's register, outputs beyond the device limits, and fetch
subroutines. Type 3 is prepared with its stage group like type 5 and
takes its float mode from RSRC1_HS. The hull user-data address (SH
0x102/0x103) is optional for a merged program: s[0:1] take it, unchecked,
when the draw sets it and are zero otherwise.

Both stages refer to one binary, so a draw lists each code and header
region once (AppendProgramMemory); a request's memory regions must not
overlap. An indirect draw's record words go into every program whose user
data holds the register, so the hull stage of a merged program reads
them too.

mergedHull is part of the recompile cache key, the draw decode comparison
and the request serialization (version 39).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 15:55:50 +02:00
Dean 52f7807a55 Merge pull request #6581 from Thomas73737/feat/libscefont-words
feat(libSceFont): implement handle and glyph attributes
2026-10-21 02:43:40 +13:00
Dean 634fad812d Merge pull request #6513 from JJenkx/fix/audio-propagation-preserve-mix
fix(audio-propagation): preserve existing destination mixes
2026-10-21 02:41:53 +13:00
Yuri Olive c0af902132 Merge remote-tracking branch 'origin/main' into feat/ime-filter-text
# Conflicts:
#	docs/dev/debt/libSceIme.md
2026-10-20 10:30:49 -03:00
Adrià b5f9c21bbc Merge pull request #7680 from gohansharma79-svg/codex/avplayer-paused-preview-20261019
fix(avplayer): deliver the first paused picture after audio starts
2026-10-20 15:19:02 +02:00
Adrià 277671f838 Merge pull request #7683 from Longziip/fix/agc-indirect-register-reread
fix(agc): reread an invalid indirect register list where its packet executes
2026-10-20 15:18:56 +02:00
Adrià 3cde166e45 Merge pull request #7650 from alex73630/fix/agc-cached-image-msaa-guard
fix(agc): enforce MSAA guards for ordinary image cache hits
2026-10-20 15:18:50 +02:00
Savvanis SpyrosandClaude Opus 5.5 58a2a4962f fix(relinker): follow fs loads and report pointers taken as data between PS4 unwind functions
A relocation or lea target outside the unwind functions of a PS4 image
is now decoded up to its first jump, return or trap, or to the start of
the next unwind function, which also bounds the transfer check of the
tail rule. A target whose run holds an fs:[disp32] access, the form the
linear TLS sweep roots, is followed as code. The other targets taken as
data are counted in one message and kept as entry points that the
Windows TLS rewrite may not overwrite. The analysis merges nested
unwind ranges like the scans.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 15:48:42 +03:00
Savvanis SpyrosandClaude Opus 5.5 1ea49c741f fix(relinker): tighten the syscall skip between PS4 unwind functions
The skip of syscall patterns outside the unwind functions let some real
syscalls through. The scan now merges nested and overlapping unwind
ranges with the instruction scanner's MergeCodeRanges, so a pattern
inside an outer function is refused. A constant syscall number is also
looked for in the bytes in front of the pattern, whatever alignment the
decoding took: a mov eax, mov rax or xor eax, eax that ends at the
pattern or before register moves and zeroings that leave rax alone. The
decoded lookback requires each instruction to end where the next one
starts. Guest modules without PT_SCE_DYNLIBDATA get no unwind ranges,
so their scan stays strict even when their unwind table is read.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 15:48:42 +03:00
Dean 44e3389c88 Merge pull request #7807 from mazen320/fix/windows-stderr-dup2
fix(libkernel): keep host stderr off a guest dup2 onto descriptor 2
2026-10-21 01:45:30 +13:00
Dean 88942aa99d Merge pull request #8280 from thuanquang/fix/mul-lo-u16-keep-24-bit-factors
fix(shader): keep the 24-bit factor reads of 16-bit multiplies
2026-10-21 01:30:18 +13:00
Dean 02b5a8e55f Merge pull request #8028 from ymatrix1/feat/hmd2-missing-exports
feat(libSceHmd2): export missing firmware HMD2 interfaces
2026-10-21 01:24:37 +13:00
Savvanis SpyrosandClaude Opus 5.5 f154e132bc fix(relinker): take pointers into data between PS4 unwind functions as data
The code analysis of the Windows and macOS outputs followed every
relocation and lea target inside the code range as code. PS4 images keep
read-only data between unwind functions, and strings and tables there
decoded into garbage, failing the conversion. Outside the unwind functions
such a target is now code only when it is 16-byte aligned, starts less
than 256 bytes after an unwind function and decodes to a jump, return or
trap; lea targets go through the same rule instead of the graph's own.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 15:19:45 +03:00
ionut27001andClaude Opus 5.5 dfa96f1fe6 fix(libkernel): return ENOENT for thirteen sysctl names, as measured on a PS5
In a payload process on a PS5 (firmware 12.70), sysctlbyname returns -1
with ENOENT for thirteen names that threw here, and leaves the buffer and
the length alone, for a read, a size query, a null length and a null
buffer with a null length. sysctl does the same for the fixed MIBs of
seven of them. sysctlnametomib gives those seven MIBs and returns ENOENT
for hw.cacheline_size and hw.usermem, which threw too.

machdep.cacheline_size already returned ENOENT and is now tested with
the others. A write to the new names and MIBs throws, as the console's
answer to a write was not tried. The hw.realmem and vm.overcommit debt
entries now say that a payload process gets ENOENT for them as well.

AI-assisted: yes

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 13:46:29 +02:00