Commit Graph
6138 Commits
Author SHA1 Message Date
Adrià FranchandClaude 9e7c59962e test(recompiler): drop the comments in the look-back scan test
Co-Authored-By: Claude <[email protected]>
2026-10-07 11:09:17 +02:00
Michon 58eb55dddf test(recompiler): a hand-written look-back kernel instead of the game's; record the dwordx2 loads that can still tear
LookBackScan runs a 43-instruction decoupled look-back written for the
test: one aggregate per block, the block index from an atomic counter,
{flag, value} published with buffer_atomic_swap_x2 and read back with
glc buffer_load_dwordx2. Seven single look-backs and 50 scans of 4096
blocks are checked against a CPU prefix sum; without the recompiler
change the first whole scan fails (3 of 3 runs).

TechnicalDebt records that only glc, aligned, in-bounds dwordx2 loads
in programs with the 64-bit storage view are one atomic load: loads
without glc, and loads in programs without 64-bit buffer atomics, can
still tear against a concurrent swap_x2.
2026-10-07 11:09:04 +02:00
MichonandClaude Opus 5.5 55447e1c77 fix(recompiler): read a coherent dwordx2 as one 64-bit atomic load
A glc buffer_load_dwordx2 is one 64-bit access on the GPU, so it never
sees half of a buffer_atomic_swap_x2. It was emitted as two dword loads,
which can: the first can read the flag from before the swap and the
second the value from after it.

GTA V gives its BVH nodes their record indices with a single-pass
decoupled look-back prefix sum. Each workgroup publishes a {flag, value}
pair for its block with buffer_atomic_swap_x2 and reads the previous 64
blocks' pairs with glc dwordx2 loads. A torn read counts earlier blocks
twice, two nodes then share records, the BVH is corrupt and the ray
tracing refit hangs. It only happens in scans of more than 64 blocks (the
largest BVHs) and depends on timing.

In a program that has the u64 storage-buffer view (it uses 64-bit buffer
atomics), a coherent raw two-dword buffer load that is 8-byte aligned and
in bounds is now read with one device-scope OpAtomicLoad on that view and
split with OpUConvert and a shift (not OpBitcast to a uvec2, which
crashes NVIDIA's shader compiler). All other loads keep the per-dword
path.

tests/execution/LookBackScan runs the game's scan kernel: the look-back
from given blocks, and 50 whole 125-block scans checked against a CPU
prefix sum. Without this change the first whole scan fails.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-07 11:08:58 +02:00
Adrià e2b527bb09 Merge pull request #295 from MichonGoddijn231849/split/pixel-ancillary
fix(shader): packed pixel ancillary as SampleId and Layer, gl_Layer via Geometry, Z export formats
2026-10-07 11:06:33 +02:00
Dean 57e9f0d6aa Merge pull request #734 from alfalfa-star/feat/ppsa14632-missing-exports
feat(libs): declare the exports PPSA14632 imports that no library provides
2026-10-07 22:00:08 +13:00
Dean dc4d9a16b7 Merge pull request #828 from MathiasDevelopes/claude/gifted-meitner-oi88g5
fix(savedata): serialize mount slot access in libSceSaveData.native
2026-10-07 21:59:38 +13:00
Dean c0b452e649 Merge pull request #1057 from MathiasDevelopes/claude/project-thread-2tinn8
refactor(libSceAvPlayer): build libSceAvPlayer.native from shared Export.cpp
2026-10-07 21:59:08 +13:00
Dean c644f46b22 Merge pull request #1041 from NahuelGenchi/test/drop-recompiler-stub-test
test(agc): drop the recompiler stub test
2026-10-07 21:58:38 +13:00
Adrià 46f2050eb5 Merge pull request #896 from alfalfa-star/feat/image-atomic-64
feat(recompiler): implement 64-bit image atomics
2026-10-07 10:54:09 +02:00
LeandroLP23andClaude Opus 5.5 db26339a5f fix(agc): release the current address space with the image mirrors
ClearImageMirrors drops the mirror map before the device is destroyed,
but the current address space in Spaces() still held its mirrors, so
they were freed by the cache's static destructor from the driver's DLL
detach, after the Vulkan driver was unloaded, and every exit crashed on
Windows. The teardown now releases the current address space too.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 10:53:33 +02:00
Adrià 219a1cf8d2 Merge pull request #916 from adriadam10/feat/s-bfe-i64
feat(shader): implement s_bfe_i64
2026-10-07 10:36:58 +02:00
alfalfa-starandClaude Opus 5.5 1e28efbd26 feat(agc): accept 64-bit image atomics in graphics shaders
A pixel or vertex shader with a 64-bit image atomic declares Int64Atomics,
Int64ImageEXT and SPV_EXT_shader_image_int64, which graphics shader
validation rejected ("SPIR-V requires unsupported device capability"),
so the draw was dropped. Compute dispatches are not validated this way.

The device records whether it enabled shaderImageInt64Atomics
(imageInt64Atomics in the device state and the graphics Context), and
ValidateShaders accepts the two capabilities and the extension when it
did.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 10:35:24 +02:00
alfalfa-starandClaude Opus 5.5 9df592926b feat(recompiler): implement 64-bit image atomics
image_atomic_* with a two-dword data mask (four for cmpswap) is the
64-bit form of an integer image atomic. The decoder rejected it with
"invalid MIMG data mask". PPSA14632 (Unreal Engine) uses
image_atomic_umax this way in a compute shader during its first frames.

Swap, add, sub, signed and unsigned min/max, and, or, xor and cmpswap
now decode with 64-bit data and translate to new ImageAtomic*64 IR
opcodes. An image updated by them gets its own descriptor binding
range, declared as an R64ui image of 64-bit integers, and the module
uses Int64ImageEXT from SPV_EXT_shader_image_int64. The driver enables
shaderImageInt64Atomics when the device offers it and binds an
R64_UINT view of the 32_32 UINT, SINT or FLOAT surface. Without the
feature, recompiling such a shader throws.

64-bit inc, dec and the float atomics still throw, as does any other
access in the same shader to an image it updates with 64-bit atomics.

The new agc_driver_image_atomics64 test runs every operation on 32_32
UINT, SINT and FLOAT surfaces and checks the returned and stored values
against edge cases across the dword boundary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 10:21:32 +02:00
Adrià fbf3d6da87 Merge pull request #869 from ahir061/fix/preserve-pixel-export-mapping
fix(shader): preserve pixel export mappings in replay
2026-10-07 10:16:53 +02:00
Adrià cffaab57ee Merge pull request #894 from alfalfa-star/fix/structurizer-shared-merge-budget
fix(recompiler): merge a loop selection where its other arm joins or leaves
2026-10-07 10:10:00 +02:00
Michon 048d9982cd fix(agc): the Z-format precheck gives no verdict for a missing SPI_SHADER_Z_FORMAT
DrawRejection read 0x1c4 with read(), which throws when the register is
absent, against the function's rule that a missing register gives no
verdict there; it now reuses the value read with value() for the
DB_SHADER_CONTROL check. Tests pin the Z-export rules: formats 1, 2, 3
and 9 with Z_EXPORT_ENABLE accepted, format 0 rejected, the sample-mask
export accepted with 32_ABGR and rejected with 32_R, formats 4 to 8
rejected, and a missing 0x1c4 accepted.
2026-10-07 10:09:51 +02:00
LeandroLP23andClaude Opus 5.5 ac9287c2ef refactor(recompiler): share the stage input info helpers
StageOf, VertexInfo, PixelInfo and ShaderWorkgroupInput were defined
in the anonymous namespaces of up to three SPIR-V backend sources with
identical bodies; they are now declared next to FailEmit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 10:03:28 +02:00
Adrià 80d4f6b716 Merge pull request #833 from LeandroLP23/fix/shader-lds-lock-uniform-exit
fix(shader): serialize locked LDS updates with a wave-uniform loop exit
2026-10-07 09:57:07 +02:00
Adrià 2a12b6833f Merge pull request #815 from Celegans12/feat/agc-sampler-reduction-mode
feat(agc): implement min and max sampler reduction modes
2026-10-07 09:40:20 +02:00
Adrià d4c196c207 Merge pull request #832 from MathiasDevelopes/claude/spirv-fail-emit-helper
refactor(recompiler): share the SPIR-V emission failure helper
2026-10-07 09:34:20 +02:00
Adrià FranchandClaude 9213355711 docs(TechnicalDebt): record measured min/max reduction footprint
Co-Authored-By: Claude <[email protected]>
2026-10-07 09:22:02 +02:00
Celegans12 1c5ed6594d feat(shader): accept more than 32 buffers per shader up to the device limit
The resource tracker refused a program's 33rd distinct V# with "buffer
resource limit exceeded". The 32 was a recompiler constant, not a
Vulkan limit: every buffer is one constant-indexed element of the guest
buffers binding, which ShaderResources checks against the device's
storage-buffer limits.

Drop ShaderInfo::MaxBuffers and the tracker's refusal, and size the
SPIR-V emitter's per-buffer offset list from the binding layout. When
the user data and offsets do not fit in the push constants, they all go
to the shader data buffer as before. ShaderResources counted only
storage buffers against maxPerStageResources (200 on Intel UHD) and now
adds the stage's sampled and storage images.

agc_driver_many_buffers reads and writes 52 and 124 buffers, and
agc_driver_graphics rejects buffers plus an image above the limit.
2026-10-07 09:17:47 +02:00
Celegans12 1afcd20281 feat(agc): implement min and max sampler reduction modes
An S# with FILTER_MODE (word0 bits 29-30) set threw in
DecodeSamplerResource. Modes 1 and 2 now map to Vulkan's MIN and MAX
sampler reduction through VK_EXT_sampler_filter_minmax, which the device
enables when it reports both filterMinmax properties; mode 3 throws.

Min/max still throws with anisotropy, a linear mip filter (lavapipe and
NVIDIA disagree there), depth comparison, color-texture compare
emulation, and, in PointFilteredSamplerWord (S# words 0 and 2), when it
filters between texels or mips of an image the recompiler point-samples.
A texture sampled through a linear min/max sampler needs
SAMPLED_IMAGE_FILTER_MINMAX on its view format; the image-sampler pairs
travel in DescriptorBinding::imageSamplers (shader disk cache format 5).

Adds the agc_driver_image_sample_reduction GPU test and extends the
sampler, emulated color compare and disk cache tests.
2026-10-07 09:04:26 +02:00
Celegans12 26e153dfa2 feat(agc): implement 8_sint sampled images
GFX10 format 6 (8_SINT) T#s threw "sampled image descriptor uses an
unsupported format": neither the recompiler's format table nor the
driver's texture format table had a row for it. Format 6 now reads as
a SINT image through an R8_SINT view, so image_load sign-extends each
texel (0x80 reads -128) and image-table entries of format 6 decode.
8_SINT storage still throws.
2026-10-07 09:02:20 +02:00
Adrià db3e659870 Merge pull request #805 from Celegans12/feat/agc-image-10-11-11-unorm
feat(agc): implement 10_11_11 unorm images through 32-bit uint views
2026-10-07 09:00:03 +02:00
alfalfa-starandClaude Opus 5.5 745412779d fix(agc): keep RADV's descriptor pool overrun inside the pool's pages
RADV (Mesa 26.0 and later) initialises a FREE_DESCRIPTOR_SET pool's
allocator with bo_size + RADV_POOL_HEAP_OFFSET as its size, so a set can
be placed up to 32 bytes past the pool's buffer. The chain pools are
0x26000 bytes, a page multiple, so a set at the end of a full pool has
its last descriptors on an unmapped page: the CPU descriptor write
faults, or the shader's scalar load raises a GPU page fault and the ring
is reset.

Two more storage buffer descriptors make the pool 0x26020 bytes; the
buffer's last page then holds those 32 bytes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 08:59:10 +02:00
Adrià 78b8f058fb Merge pull request #771 from Kikoarl/feat/sopp-control-flow
feat(shader): decode s_setkill as s_endpgm
2026-10-07 08:50:36 +02:00
Adrià 8a126b7b88 Merge pull request #799 from Celegans12/feat/agc-unnormalized-sampler-coordinates
feat(agc): implement unnormalized sampler coordinates on single-level 1D and 2D views
2026-10-07 08:50:16 +02:00
Adrià FranchandClaude c50181f6fa docs(TechnicalDebt): trim s_setkill entry to the measured behaviour
Co-Authored-By: Claude <[email protected]>
2026-10-07 08:39:47 +02:00
Kikoarl c8e4a17f89 feat(shader): decode s_setkill as s_endpgm 2026-10-07 08:39:41 +02:00
Claude 5625fe6043 refactor(libSceAvPlayer): build libSceAvPlayer.native from the shared Export.cpp
libSceAvPlayer.native/Export.cpp was a byte-identical copy of
libSceAvPlayer/Export.cpp. Point add_sce_avplayer_library at the guest
directory's Export.cpp, as the Audiodec and Font library functions do, and
remove the copy.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_017pTZqAyVSZy2FZmaqakPHZ
2026-10-07 06:19:46 +00:00
Claude fb1ef4f404 refactor(recompiler): share the SPIR-V emission failure helper
Nine SPIR-V backend sources each defined an identical FailEmit in an
anonymous namespace. Declare it once in SpirvEmitterHelpers.hpp and
define it in SpirvEmitterHelpers.cpp; the message is unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01MBXJqzgohLeVAeHsn4Jpm7
2026-10-07 06:05:14 +00:00
Adrià a9ec7be287 Merge pull request #546 from adriadam10/fix/buffer-format-loads
fix(shader): convert unorm and snorm buffer format loads with correct rounding
2026-10-07 07:58:12 +02:00
Celegans12 94cf99e361 feat(agc): implement 8 srgb color targets through rgba8 srgb proxies
CB_COLOR_INFO format 1 with number type 6 (8_SRGB) threw at decode.
It now decodes as R8_SRGB with component swap 0; the other swaps and
8_8_SRGB still throw.

A device that cannot attach and blend R8_SRGB (NVIDIA, lavapipe)
renders a resident 8_SRGB target through an RGBA8_SRGB view of an
RGBA8 copy of its R8 image: the image is blitted in before the pass
and back when the pass ends, and the write mask keeps R only, so the
encode, decode and blend are the device's sRGB attachment rules.
APS5_SRGB_ATTACHMENT_PROXY=1 forces the copy. Linear, mipmapped and
3D 8_SRGB targets throw on such a device.

PPSA26344 renders its G-buffer slot 5 and a multiply-blend pass into
8_SRGB targets.
2026-10-07 07:47:00 +02:00
Merijn b92894c628 Merge branch 'main' of https://github.com/boykopovar/AnyPS5 into feat/kernel-raise-exception-windows
# Conflicts:
#	core/libs/prx/libkernel/CMakeLists.txt
#	core/libs/prx/libkernel/System/src/Exception.cpp
2026-10-07 07:45:49 +02:00
Claude 928cf9b42d fix(savedata): serialize mount slot access in libSceSaveData.native
Mount, unmount, param, icon and mount-info calls read and wrote the
global mount slot table without a lock, so two threads mounting at
once could take the same slot and one would later fail to unmount its
own mount point. Guard the table with a mutex and make the initialization
count atomic.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01MBXJqzgohLeVAeHsn4Jpm7
2026-10-07 05:26:59 +00:00
alfalfa-starandClaude Opus 5.5 e91fe0f063 feat(libs): declare the exports PPSA14632 imports that no library provides
LEGO Horizon Adventures imports 19 functions that no library exports
and no open pull request adds, so it fails eager binding. They are
declared as throwing stubs. The two libSceAjmWVorbis imports have no
known name and are exported by NID from libSceAjm.native.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 07:10:13 +02:00
alfalfa-starandClaude Opus 5.5 b567bb8eed feat(libkernel): accept the audio coprocessor memory protection bits
A title maps direct memory with protection 0x3f2, which adds bits
0x100 and 0x200 to the CPU, GPU and AMPR bits, and the mapping threw.
They are the audio coprocessor (ACP) read and write bits, as named in
the KytyPS5 and etaHEN headers. The coprocessor work runs on the host
CPU, so they map to host read and read/write access like the GPU bits.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 07:09:42 +02:00
JAB-dev 2dc53674f5 Merge branch 'main' of https://github.com/boykopovar/AnyPS5 into feat/kernel-flexible-internal-hint 2026-10-07 07:09:08 +02:00
JAB-dev e493328eb7 Merge branch 'main' of https://github.com/boykopovar/AnyPS5 into feat/ngs2-reverb-rack 2026-10-07 07:01:30 +02:00
Dean 9ab937b261 Merge pull request #973 from ebarr24/codex/libc-posix-memalign-errors
fix(libc): return posix_memalign allocation errors
2026-10-07 18:01:22 +13:00
Dean cb3405d037 Merge pull request #1037 from Raghav314/fix/agc-unwritten-user-data
fix(agc): read unwritten user data registers as zero
2026-10-07 18:00:41 +13:00
Dean b62e84c8ca Merge pull request #1035 from hugodearaujo/feat/agc-register-defaults-internal
feat(libSceAgc): implement sceAgcGetRegisterDefaultsInternal
2026-10-07 18:00:00 +13:00
Dean ed8dda83ec Merge pull request #1030 from hugodearaujo/feat/agc-dcb-clear-state
feat(libSceAgc): implement sceAgcDcbClearState
2026-10-07 17:59:18 +13:00
Dean b33ac687c9 Merge pull request #1029 from hugodearaujo/feat/agc-dcb-set-cf-register
feat(libSceAgc): implement sceAgcDcbSetCfRegisterDirect and RangeDirect
2026-10-07 17:58:36 +13:00
Dean 63e02557ef Merge pull request #1026 from hugodearaujo/feat/agc-wait-reg-mem-patch-mask
feat(libSceAgc): implement sceAgcWaitRegMemPatchMask
2026-10-07 17:57:55 +13:00
Dean 1acbeefef9 Merge pull request #1032 from gjonn/feat/ngs2-stereo-surround-mix
feat(libSceNgs2.native): mix a stereo mastering voice into a 6 or 8 channel render buffer
2026-10-07 17:56:41 +13:00
Dean 000f2f748f Merge pull request #1039 from NahuelGenchi/test/guest-locale-ctest
test(libc): match the immortal classic locale and run guest_locale in ctest
2026-10-07 16:45:33 +13:00
Dean a89f95f4f8 Merge pull request #732 from alfalfa-star/fix/prx-runpath
fix(libs): keep a $ORIGIN runpath in the patched prx libraries
2026-10-07 16:45:29 +13:00
Nahuel Genchi b8bdd24a05 test(agc): drop the recompiler stub test 2026-10-07 00:07:00 -03:00