Commit Graph
14017 Commits
Author SHA1 Message Date
Adrià 0c9e980b72 Merge pull request #5111 from XairRrR/fix/agc-depth-array-slice-htile
fix(agc): give each slice of a depth array its own HTILE
2026-10-14 20:17:23 +02:00
Yunus Shaikh 226421e7e4 docs: list the performance overlay with the diagnostics in USAGE
Its section moves from after HDR output to before Windows crash diagnostics, next to the other switches for looking into a run. Other open changes add their own sections right after HDR output.
2026-10-14 11:14:37 -07:00
GalaxyGamingFRandClaude Opus 5.5 a310f9688c fix(tools): link top-of-file insertions to line 1 in pr_overlap
A -U0 hunk for an insertion before line 1 starts at line 0, so two PRs
inserting at the top of one file produced a link to the nonexistent
line L0. hunks now clamps the start to line 1 and derives the end from
the clamped start. A test covers the clash range and the rendered link.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

Claude-Session: https://claude.ai/code/session_012zyXkUzTZGh3nBwNMtrLaW
2026-10-14 11:08:27 -07:00
LeandroLP23andClaude Opus 5.5 c692334e00 ci(build): keep the Linux relinker tests when a manual build skips Linux
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 20:07:18 +02:00
LeandroLP23andClaude Opus 5.5 8087908232 ci(build): skip test jobs a push to main does not touch, and duplicate relinker hosts
A push to main ran every job: relinker on three hosts, register context
on four and write watch on two, next to the full Linux and Windows
builds. The eligibility gate now reads the files of the push (compare
before...after) and applies the same path rules as pull requests; when
it cannot (a first push, 300 or more files, an API error) every job runs
as before.

Whenever the full builds run (push and manual builds), the Linux and
Windows relinker jobs repeat tests the full builds already run: the
relinker-only ctest lists (150 and 145 tests) are subsets of the full
Linux and Windows ones (1052 and 1069) in run 38397922579. The relinker
matrix now keeps only macOS then; automatic pull request builds, which
have no full build, still run all three.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-14 20:07:06 +02:00
MarcZX100 7ccf79a6f7 fix(relinker): preserve DF_SYMBOLIC on guest modules 2026-10-14 18:04:55 +00:00
Dean Galvin 69702ef105 fix(agc): save the bytes a GPU-side store writes outside the write watch
A write-back stored on the GPU over memory outside the write watch left its
units without saved guest bytes (only the CPU path saved them), so the next
store of results landing there threw (#5711), and every refresh re-uploaded
the image. The stored ranges are now copied from the retile scratch into a
host-visible buffer behind the store and become the saved bytes when the
batch completes; a store or refresh that needs them first syncs that batch.
Units without a write generation pending when their range leaves the watch
save their bytes there too.

The second-store fixture waits for the GPU before its surface is freed on
every return, as #5790 does for the other cases.
2026-10-15 07:03:17 +13:00
Adrià Franch ededc2eb65 test(agc): drop the refusal cases main's relaxed geometry check no longer produces 2026-10-14 20:01:37 +02:00
Dean ed835aa76f Merge pull request #5756 from oneandonlydean/fix/raise-address-lock-1488
fix(libkernel): defer raises while a thread holds the address-wait lock on Windows
2026-10-15 07:01:27 +13:00
Dean 0c4e4302d4 Merge pull request #5829 from oneandonlydean/fix/compute-derivatives-linear-groups
fix(shader): group compute derivatives by four consecutive lanes
2026-10-15 07:00:57 +13:00
Dean 6229879f79 Merge pull request #5936 from hossiendehghan989/fix/mouse-internal-helper-nids
fix(videoout): keep mouse helpers out of NID exports
2026-10-15 07:00:35 +13:00
GalaxyGamingFRandClaude Opus 5.5 702c330576 fix(progress): do not treat a keyword before :: as a qualifier
`return ::Fail();` and `else ::Fail();` call the global wrapper, but
QUALIFIED took the keyword for a qualifier name and counted the export
as done. The name before `::` must now be an identifier that is not a
keyword, or a template's closing `>`.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_012zyXkUzTZGh3nBwNMtrLaW
2026-10-14 11:00:11 -07:00
Nuno Silva 03b7cb5a14 fix(agc): gather a sampled depth cube at the descriptor's layer offsets
A sampled depth texture whose layers are all backed by host depth surfaces is
gathered host-to-host, plane by plane. The gather located the surface for
layer n at base.address + n * DepthSliceBytes(extent), the host depth slice
stride, and required the guest descriptor's sliceLinearBytes to equal that
stride.

Bendy and the Ink Machine (PPSA27616) samples a 64x64 F32 cube over six D32
depth surfaces. The descriptor's per-layer footprint is the tiled depth slice,
but its linear footprint is smaller, so the check refused a valid resource and
the game aborted as soon as it sampled the cube.

Locate each layer at base.address + geometry.GuestLayerOffset(layer) instead.
That is the address the descriptor itself uses, and the one the guest-memory
fallback already used, so both ways of finding a layer agree by construction.
Keep the geometry check for the mixed case, where a layer has no host surface
and is filled from guest memory, because that path lays its layers out at
sliceLinearBytes.

The storage-image path still refuses a layer pitch that is not the depth slice
size; that is unchanged and out of scope.
2026-10-14 19:56:44 +02:00
Nicolas FalesyandClaude Opus 5.5 62d8eeae76 fix(libkernel): poll libSceNet sockets with the host wait
With libSceNet sockets on ordinary descriptor numbers (#4391), poll on a
libSceNet socket threw "neither a socket nor a pipe": poll only knew
libkernel sockets and pipes, while select already asks libSceNet through
its poller. libSceNet now lends libkernel the host socket behind a
descriptor, together with an owner that keeps it open, so poll puts it in
the same WSAPoll or poll call as libkernel sockets. ProsperoLight
(PPSA99002) stopped here on Linux and now reaches its PC list.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01EvDbpwUPTa78oCAJqe7m9K
2026-10-14 19:56:10 +02:00
Adrià 278765a073 Merge pull request #5040 from screamm/docs/app0-eboot
docs(user): stage the original eboot.bin in app0
2026-10-14 19:55:05 +02:00
Adrià 61cec42439 Merge pull request #5032 from kq62/docs-winlibs-link
docs(build): link the supported WinLibs release
2026-10-14 19:54:36 +02:00
Adrià ee6addff26 Merge pull request #5030 from johnmaia/fix/storage-writeback-overhang
fix(agc): store a storage image whose last block row runs past its allocation
2026-10-14 19:54:05 +02:00
Adrià 0b1304896d Merge pull request #5023 from fdfawef324/fix/agc-shader-prep-wait
fix(agc): settle registration preparations before a preparation scope locks
2026-10-14 19:53:34 +02:00
Adrià 5561db28ea Merge pull request #5018 from SandstromPL/fix/relinker-replace-outputs
fix(relinker): replace output files instead of rewriting them in place
2026-10-14 19:53:07 +02:00
Jan ŠléglandClaude Opus 5.5 e32f5e161d fix(shader): apply cube output modifiers whenever IEEE mode is off
v_cubeid_f32, v_cubesc_f32, v_cubetc_f32 and v_cubema_f32 refused any
output modifier with "VOP3 source modifiers are not implemented";
PPSA11386 stops there on v_cubeid_f32 v, v, -v, -v div:2.

On RDNA2 (gfx1036), over 2048 inputs in every combination of IEEE mode,
the four f32 denormal values and f16/f64 denormals flushed or kept, with
round to nearest even, the four instructions apply mul:2, mul:4 and
div:2 whenever IEEE mode is off, also with f32 output denormals kept,
where v_mul_f32_e64 in the same kernels ignores them, and ignore them
with IEEE mode on. Where applied, the result is the existing bit-level
f32 output modifier result, and clamp is applied after it.

The decoder accepts the modifier on the four instructions. floatCube
applies the shared f32 scaling, now scaleF32Result, in those modes and
writes with the modifier cleared, so clamp is still applied after it.
With IEEE mode on the signaling NaN quieting applies and the modifier is
ignored; with it off the quieting does nothing and the modifier is
applied. agc_driver_vop3_cube_clamp checks each instruction with each
modifier against tables captured on gfx1036.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Fnrk5Dazjb2tLooVSpdRQq
2026-10-14 19:52:46 +02:00
Adrià f7628decf2 Merge pull request #4994 from krishalivaibhav/codex/path-service-lifetime
fix(libc): preserve path services through process exit
2026-10-14 19:52:39 +02:00
Adrià f6835a6084 Merge pull request #4925 from MarcZX100/codex/systemservice-loadexec-path-4793
test(libSceSystemService): retain rejected LoadExec paths in errors
2026-10-14 19:52:05 +02:00
Get-fix 8997cac1b8 fix(relinker): stop module syscall scans at the PLT and skip the PS4 loader path
OpenOrbis modules keep read-only data after their code, as executables
do. The syscall scan of sce_module modules decoded it, and the module of
the OpenOrbis library sample (libExample.prx) failed with "Forbidden
syscall instruction". For modules with a PT_SCE_DYNLIBDATA segment, the
scan now stops at the end of the PLT after the last unwind function,
found by FindSceCodeEnd as for executables.

The same modules begin their executable segment with the
/libexec/ld-elf.so.1 string but have no PT_INTERP header, so code
analysis decoded the string and failed with "Unsupported Windows guest
TLS instruction (bytes: 64 2d 65 6c 66 2e)", which is the text "d-elf.".
When no PT_INTERP header covers the start of a PS4 code segment, code
analysis now starts after that exact string.
2026-10-14 20:52:02 +03:00
Get-fix f12d2de271 fix(libkernel): export _readv, _writev, _fcntl, _fstat, __sys_socketex
OpenOrbis programs and modules import these PS4 libkernel names (the
graphics, library and networking samples). The underscore names
forward to readv, writev, fcntl and fstat, as _ioctl already does;
_fcntl passes its argument on as a full 64-bit value, so the record
lock commands keep their whole pointer. __sys_socketex creates a
socket like socket(); its name argument is ignored, as sceNetSocket
does.
2026-10-14 20:52:00 +03:00
Get-fix 901b92c794 feat(libSceVideoOut): register PS4 display buffers
Add the PS4 functions sceVideoOutSetBufferAttribute and
sceVideoOutRegisterBuffers on top of the existing registration. The PS4
call uses the first free attribute set and returns its index. It
accepts linear A8R8G8B8_SRGB and A8B8G8R8_SRGB buffers, which map to the
PS5 B8G8R8A8 and R8G8B8A8 formats. It throws for tiled buffers, whose
PS4 layout differs from the PS5 one. Linear PS4 buffers may be 4 KiB
aligned: the OpenOrbis graphics sample places its second 1920x1080
buffer 8,294,400 bytes after the first. PS5 buffers keep the 64 KiB
rule. A handle with PS4 buffers writes the PS4 flip status (64 bytes)
and vblank status (32 bytes). Writing the 128-byte PS5 flip status into
the sample's stack structure overwrote its saved frame pointer.
2026-10-14 20:52:00 +03:00
Adrià e442f4c2e1 Merge pull request #4924 from nicolasfalesy/fix/libkernel-fcntl-scenet-sockets
fix(libkernel): answer fcntl status flags on libSceNet sockets
2026-10-14 19:50:41 +02:00
Adrià 4d5411d7b5 Merge pull request #4873 from GustavoGamarra95/fix/agc-depth-copy-padded-slices-main
fix(agc): copy a depth surface's plane through the texture's padded linear slices
2026-10-14 19:49:44 +02:00
Adrià FranchandClaude a15f163245 docs(debt): FMASK decompress over multisampled targets
Co-Authored-By: Claude <[email protected]>
2026-10-14 19:49:32 +02:00
Swastik-51 02974ea767 fix(agc): reject DCC on multisampled targets outside FMASK decompress 2026-10-14 19:49:32 +02:00
Swastik-51 8c76693344 test(agc): tighten FMASK decompress tests 2026-10-14 19:49:32 +02:00
Swastik-51 9394a6f51a fix(agc): handle FMASK decompress on MSAA targets 2026-10-14 19:49:32 +02:00
XairRrR b3e5acc8cc fix(agc): store a covering storage image into the newest pairing of its plane
DepthSurfaceStoreBack walked the surfaces oldest first and let the first
one whose plane the storage image covers take the copy. A depth plane
bound with several stencil planes has one surface per pairing, so the
copy could land in an older pairing while DepthSurfaceStorage,
DepthSurfaceTexture and DepthSurfaceAt read the newest one, and a store
back through a replaced view was accepted by an older pairing instead of
throwing.

The surface's own view and the replaced views are now checked on every
surface first; only then does the newest surface covering the plane take
the copy, the order DepthSurfaceStorage resolves a plane in. Reported
with the repro and the fix by nikowolf123; the repro is the new
RunPairings test.

AI-assisted: yes
2026-10-14 19:48:20 +02:00
XairRrR a84afe931c fix(agc): store a written storage image over a depth plane into the surface
DepthSurfaceStoreBack took only the storage image a depth surface had
handed out for its plane. A storage image over the same plane that the
surface did not hand out (one cached before the surface existed, kept by
a dispatch whose resources revalidate from their records) was written
and never reached the depth image: later depth tests and plane reads
used the surface's old contents.

A written storage image that covers a depth surface's depth or stencil
plane exactly (the plane's address and extent, level 0, one 2D layer,
the plane's 32-bit float, 16-bit unorm or 8-bit uint format) is now
copied into that plane when it is stored back, as the surface's own view
is. A view the surface's own view replaced still throws.

Uncharted: Legacy of Thieves Collection (PPSA05684) writes a 640x360
downsampled depth with a compute shader and then tests its mist
particles against it as a depth target; the depth target stayed at its
clear and the mist drew over foreground geometry.
2026-10-14 19:48:20 +02:00
Adrià 26ce6e954a Merge pull request #4779 from MarcZX100/codex/null-tsharp-type-4139
fix(agc): treat type-0 texture descriptors as null
2026-10-14 19:47:43 +02:00
Kovalev Vladislav a95e122dca test(agc): isolate the reported read-tracking check 2026-10-14 23:47:08 +06:00
AnzouBeli 6bd076c191 test(agc): account for unknown pending DCC key writes
(cherry picked from commit 1b3f2e0982)
2026-10-14 23:47:04 +06:00
Adrià e9817cd775 Merge pull request #4663 from fdfawef324/fix/agc-settle-stored-units
fix(agc): advance stored layers when a write-back keeps CPU-written blocks
2026-10-14 19:46:53 +02:00
Adrià 276608d2cf Merge pull request #4475 from Pipodi/feat/image-table-indirect-columns-v2
feat(agc): image-table records that hold a pointer to the T# or split it over two loads
2026-10-14 19:46:11 +02:00
Ondra97 0948f77208 fix(libkernel): reject invalid ftruncate descriptors safely 2026-10-14 19:45:54 +02:00
XairRrR 8fec47a4b2 fix(agc): give each slice of a depth array its own HTILE
A slice of a depth array target (DB_DEPTH_VIEW SLICE_START) offset its
depth and stencil addresses but kept the array's DB_HTILE_DATA_BASE as
its HTILE. Every slice then shared slice 0's metadata: a fast clear of
slice 0's HTILE cleared every slice, and a clear of any other slice's
HTILE matched none.

A slice's HTILE now starts at the base plus the slice times one slice's
pipe-aligned metadata, as addrlib addresses it (sliceSize * slice in
Gfx10Lib::HwlComputeHtileAddrFromCoord; HtileMetadataBytes is that slice
size). The recognized HTILE clear kernel now reports the bytes it
clears, 16 per thread (global_store_dwordx4 at the thread index << 4),
and a surface takes the clear when that range covers its HTILE, as a
DMA_DATA fill does; a clear over a whole array still clears every slice.

Uncharted: Legacy of Thieves Collection (PPSA05684) renders its sun
shadow cascades into the four slices of a 2048x2048 D16 array; each
slice's HTILE lies 256 KiB after the previous one.
2026-10-14 19:45:03 +02:00
Adrià 8ba869d303 Merge pull request #4450 from Pipodi/feat/tessellation-instanced-hull
fix(shader): number an instanced draw's hull patches across its instances
2026-10-14 19:44:52 +02:00
TripyFoxandClaude Opus 5.5 3c1f43948b fix(shader): fault only where a table call misses its linked callees
An s_swappc_b64 whose target is not resolved compiles to a faulting call
only at the fallback the table-call linker emits; the linker lists those
calls in the request (GuestContext::linkedCallFallbacks), and every other
computed call is refused at compile time again, as on main. The new
agc_driver_compute_table_calls test runs a linked two-record table on
Vulkan in wave32 and wave64, with SCC 0 and 1 reaching the callee, and a
record past the table reporting the UnlinkedCall fault.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-15 06:44:25 +13:00
TripyFoxandClaude Opus 5.5 9c8fb780e8 feat(shader): link callees of calls whose target is loaded from a table
An s_swappc_b64 whose target pair comes from an s_buffer_load of a buffer
whose descriptor is loaded from user data now calls the targets that buffer
holds: at dispatch the driver reads the buffer, links one copy of each
distinct callee after the caller and rewrites the call into a compare chain
that s_call_b64s the matching copy. A target that matches no copy, and any
other computed call, records an UnlinkedCall fault that the driver reports,
instead of failing the shader at compile time.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-15 06:44:07 +13:00
Dean 8b8bfe0b6e Merge pull request #4820 from nicolasabosch/feat/agc-sample-msaa-color
feat(agc): sample a multisampled color target through its 2D MSAA texture
2026-10-15 06:42:29 +13:00
Adrià 38c0bfa33a Merge pull request #5131 from parl0v/docs/nvidia-610-compiler-crash
docs(usage): note the NVIDIA 610.47 shader compiler crash on Windows
2026-10-14 19:41:27 +02:00
Adrià Franch dec6e0dcbf test(videodec2): pass the picture height to the VP9 hashes
The VP9 superframe and render-size tests added after this PR's base call hashNv12 without a height.
2026-10-14 19:40:03 +02:00
Adrià 4ae78dc136 Merge pull request #5012 from ideabsassistenza/fix/registration-bracket-comments
fix(tests): ignore bracket comments in registration audit
2026-10-14 19:39:57 +02:00
RickandClaude Opus 5.5 6fd0e33431 fix(libSceVideodec2): report the coded picture size
Decode and Flush let FFmpeg crop every picture to its display size, so a
1080p H.264 stream came out as 1920x1080 with the chroma after 1080 luma
rows. The console reports and writes the coded picture: EVO-PLAYER-PS5's
hardware run of a 1080p H.264 IDR returned 1920x1088 with pitch 2048 and
the chroma after the 1088 luma rows, and ProsperoLight rejects a 1080p
H.264 or HEVC picture whose height is not 1088. FFmpeg's cropping is now
off, so the frame size, the chroma offset and the sizes in the AVC
picture info are those of the coded picture. The pitch is unchanged, and
the frame size QueryDecoderMemoryInfo reports, which aligns the maximum
height to 32 rows, still holds a picture coded within the maximum and the
macroblock-padded H.264 picture of a maximum given as the display size.

libSceVdecsw derived its crop offsets from the difference between that
size and the macroblock grid, which is now zero. It takes the crop FFmpeg
exports for the picture from libSceVideodec2 instead.

The H.264 fixture is coded at 64x48 with frame_crop_bottom_offset 4: its
pictures are checked at 64x48 and the crop through Vdecsw. The HEVC and
VP9 fixtures are coded at 64x40 and keep their hashes. The new hashes come
from FFmpeg 8.1 decoding with apply_cropping 0, hashed as the tests do;
the same method reproduces every previous H.264, HEVC and VP9 hash.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-14 19:39:34 +02:00
Adrià c2b55c66fb Merge pull request #4974 from ideabsassistenza/fix/stubgen-readonly-cleanup
fix(stubgen): clean read-only staged files after failure
2026-10-14 19:39:04 +02:00
Adrià 5d0e8fc70a Merge pull request #4970 from Zurisen/fix/progress-history-python310
fix(progress): extract history archives on Python without tarfile filters
2026-10-14 19:38:43 +02:00