Commit Graph
6138 Commits
Author SHA1 Message Date
Dean 69363a01ea Merge pull request #1428 from NahuelGenchi/fix-flip-compute
test(agc): match the unreadable-code error and run the flip compute mode in ctest
2026-10-09 21:03:47 +13:00
Dean 0905b51f6a Merge pull request #1931 from johnmaia/feat/videodec2-hevc-vp9
feat(libSceVideodec2): decode HEVC and VP9
2026-10-09 21:03:44 +13:00
Dean 31ca81bfc3 Merge pull request #1910 from TheAggie/fix/pad-vibration-mode-compatible
fix(pad): accept the compatible vibration mode
2026-10-09 21:03:40 +13:00
Dean f97205908a Merge pull request #1828 from LeandroLP23/test/patched-libraries-load
test(libs): load every patched library with its imports bound
2026-10-09 21:03:35 +13:00
Dean eaed9371ce Merge pull request #1820 from hugodearaujo/fix/audioout2-main-port-formats
fix(audioout2): match measured MAIN port format validation
2026-10-09 21:03:31 +13:00
Dean 6a7f40514d Merge pull request #1771 from TideOPL/pr/savedata-mount-status
fix(savedata): report a CREATE2 mount of an existing save as not created
2026-10-09 21:03:27 +13:00
Dean e4492fac50 Merge pull request #1712 from LuisBiceps/test/libc-guest-errors-thread-errno
test(libc): reset errno after the worker thread in guest_errors
2026-10-09 21:03:23 +13:00
Dean cb6d833295 Merge pull request #1705 from muhzain05/fix/ult-finalize-busy
fix(ult): reject finalize with outstanding ulthreads
2026-10-09 21:03:19 +13:00
Dean 812c86cde7 Merge pull request #1481 from awake-devel/feat/http-auth-info-callback
feat(http): accept sceHttpSetAuthInfoCallback
2026-10-09 21:03:15 +13:00
Dean 3e66276cba Merge pull request #1367 from Raghav314/fix/videoout-window-at-start
fix(videoout): create the window and the device when VideoOut starts
2026-10-09 21:03:10 +13:00
Obi Newman 881fb01069 feat(libs): report Http2, Ssl and Net memory pool statistics (#1119)
sceHttp2GetMemoryPoolStats, sceSslGetMemoryPoolStats and
sceNetGetMemoryPoolStats threw. PPSA16064 (Minecraft Dungeons II,
Unreal Engine) queries all three while its HTTP module starts, and
aborted there.

Each library now records the pool size given at sceHttp2Init,
sceSslInit or sceNetPoolCreate and reports it with a peak and current
use of 0: the offline Http2 and Ssl models and the host-socket Net
library allocate nothing from these pools. The layouts follow the PS4
SDK's *MemoryPoolStats structures. Net returns EBADF for an unknown
pool and EINVAL for a null output, like its other pool calls; Http2 and
Ssl throw for both, as their error codes are unknown. Terminating a
context or destroying a pool forgets its size.

sceHttp2SetResolveRetry, which the title calls next, accepts and
ignores its value like the other Http2 settings. The four Http2
WebSocket exports the title imports are added as unimplemented.

guest_http2, guest_ssl and guest_sce_net check the reported sizes;
guest_sce_net also checks the null-output and unknown-pool errors.
2026-10-09 21:03:06 +13:00
Dean d3a926ad36 Merge pull request #2077 from johnmaia/feat/np-entitlement-info-list
feat(libSceNpEntitlementAccess): report signed out for entitlement info lists
2026-10-09 21:03:01 +13:00
Dean bf65cfb2be Merge pull request #2004 from NahuelGenchi/feat/json2-object-empty
feat(libSceJson2): implement sce::Json::Object::empty
2026-10-09 21:02:56 +13:00
Dean a04350ae25 Merge pull request #1861 from fisherjoey/fix/ajm-atrac9-multichannel
fix(ajm): decode multichannel ATRAC9 streams
2026-10-09 21:02:52 +13:00
Dean d51e8f020a Merge pull request #1838 from LeandroLP23/feat/net-resolver-multiple-records-ex
feat(libSceNet): implement sceNetResolverStartNtoaMultipleRecordsEx
2026-10-09 21:02:48 +13:00
Dean 9e8db341d8 Merge pull request #1775 from MathiasDevelopes/fix/libscehttp-wait-request
fix(libSceHttp): sceHttpWaitRequest reports no ready requests
2026-10-09 21:02:43 +13:00
boykopovar 20cfc0130f fix(agc): preserve write tracking for shared host import aliases 2026-10-09 10:59:50 +03:00
boykopovar 0e1d25a8a2 fix(agc): avoid redundant transfers for untracked imported textures 2026-10-09 10:50:49 +03:00
Zheorgyan 688df0b880 test(libc): wait for std::async thread teardown in host_thread_local 2026-10-09 09:45:21 +02:00
Dean Galvin c8c90995a0 fix(shader): match half-wave reductions in vertex programs
A program's entry EXEC is the ballot of !gl_HelperInvocation in a pixel program and the ballot of true in vertex, local and tessellation programs (emitEntryPrologue). The half-wave reduction matcher only accepted the pixel form, so a wave64 vertex program that scans keys selected under its EXEC and reads lane 63 threw that the lane is outside the 32-lane host subgroup.

EntryLaneWalk now also accepts a ballot of true as within the entry EXEC for those stages. Every invocation is live at their entry, and a later ballot of true holds only invocations that are still active. Pixel programs keep the !gl_HelperInvocation form, because a ballot of true there includes helper invocations. Compute and mesh programs keep their own form too, because their entry EXEC can bound the local invocation index.
2026-10-09 20:36:07 +13:00
Dean Galvin ac2d172e0b perf(agc): bind misaligned draw buffer regions in place through the view adjustment
A draw's guest buffer region inside a host import at an offset off
minStorageBufferOffsetAlignment was copied per build (a new buffer, an
input snapshot, a vkCmdCopyBuffer that ends the open render pass), and
DirectRegions refused such builds as templates.

Descriptor already binds any DWORD-aligned view from the aligned offset
below it and passes the remainder through the shader's memory offset
slot. A draw build that is not address-based and whose every guest buffer
element has such a slot (a push constant byte, or a shader data byte
inside its data buffer) now binds a region whose offset in its import is
DWORD aligned in place, like an aligned one: its read-only views are
snapshotted per draw by PrepareDrawBindings at address - adjustment, the
import serial keys the template, and Revalidate proves it per use.
Dispatches keep the copy (they read in-place inputs at execution, not at
record).

agc_driver_recorder_tests misalignedRegionTests: a misaligned read-only
draw region is read in place, the build is reusable, the push constant
carries the adjustment, and the per-draw snapshot starts at the aligned
offset below the view.
2026-10-09 20:36:07 +13:00
Dean Galvin 954864ea80 perf(agc): keep up to 1024 cached pipelines
CachedPipeline keeps at most 256 pipelines. A level with a larger working
set thrashes the LRU: every miss creates a new VkPipeline (modules,
layout, render pass and a driver compile from the pipeline cache). The
bound is now 1024. A cached pipeline is a pure function of its key, so
the bound changes only memory and time.
2026-10-09 20:36:07 +13:00
Dean Galvin 8a58185306 fix(shader): prove half-wave reduction keys through selected and merged lane bits
The half-wave reduction read (v_readlane_b32 of lane 31 or 63 after a DPP row scan) is exact on a narrower host subgroup only when the scan's keys are the identity outside the entry EXEC. EntryLaneWalk::ZeroBit now also proves that through a constant false, a SelectU1 whose two values both prove it, and a bool Phi whose inputs all do. A mask written inside a divergent branch reaches the key select in that form, so such a scan threw that lane 63 is outside the 32-lane host subgroup.
2026-10-09 20:36:06 +13:00
Dean Galvin 24876afca9 fix(agc): draw nothing for resummarize draws without depth or color work
A draw with DB_RENDER_CONTROL.RESUMMARIZE_ENABLE recomputes the HTILE summary of the bound depth surface from its depth values. HTILE is not modeled, so such a draw with depth and stencil tests off and no color writes changes no modeled state. It now passes the maintenance check and draws nothing, instead of throwing. Resummarize draws with depth, stencil or color work, and copy and decompress draws, still throw.
2026-10-09 20:36:06 +13:00
Adrià a8b032b236 Merge pull request #2083 from adriadam10/feat/shader-f32-nan-bits
feat(shader): choose f32 arithmetic NaN results on the bits
2026-10-09 09:20:59 +02:00
Adrià FranchandClaude 1910d1456d feat(shader): choose f32 arithmetic NaN results on the bits
Co-Authored-By: Claude <[email protected]>
2026-10-09 09:14:44 +02:00
LeandroLP23andClaude Opus 5.5 06f78c2030 test(libs): load every patched library with its imports bound
ctest loads the libraries from libs/unpatched, so an import that nid_patcher
renames out of another library's exports only shows when a title loads the
patched prx. patched_libraries loads each patched .prx with LoadLibraryEx on
Windows and dlopen(RTLD_NOW) on Linux, and depends on the libs target so the
patched files are current.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 09:05:19 +02:00
john.maiaandClaude Opus 5.5 530aa2088b feat(libSceNpEntitlementAccess): report signed out for entitlement info lists
The unified and service entitlement info list requests and polls threw.
They now return SCE_NP_ERROR_SIGNED_OUT, like the consume requests in
the same library. Their signatures are unknown, so they stay declared
without parameters.

PPSA15657 calls the unified request during start-up and continues past
the error.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_0134RWCyiyydJBbfKz8g9Bwe
2026-10-09 07:56:44 +01:00
jdmagicandClaude Opus 5.5 9d2e4188ca feat(libs): provide the exports PPSA01289 imports that no library has
Sackboy: A Big Adventure (PPSA01289) imports nine functions that no library
exports, so eager binding fails before it starts.

- libSceVoiceChat: sceVoiceChatRequestLeaveVoiceChatGroup and
  sceVoiceChatRequestDeleteVoiceChatGroup, offline requests like the other
  sceVoiceChatRequest* calls
- libSceNpSessionSignaling: sceNpSessionSignalingGetConnectionFromPeerAddress,
  a throwing stub; the signature is unknown
- libSceCdlgG2P, a new library: the six sceG2PDialog* functions, throwing
  stubs declared without parameters

TechnicalDebt records the assumed and unknown signatures.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 02:42:57 -04:00
LuisBiceps a551d3ee36 fix(libSceSystemService): match RommPS's web browser signature and test any arguments
The param is void*, as RommPS declares it. The test also passes a null and an empty URI and a param that must stay untouched, and compares against 0x8002002D itself. The debt entries now say the error is returned for any arguments and that the param layout and the console's argument checks are unknown.
2026-10-09 14:40:31 +08:00
jdmagicandClaude Opus 5.5 90864ffb8d feat(libSceAudioOut): accept sceAudioOut2MasteringTerm
PPSA01289 (Sackboy: A Big Adventure) calls sceAudioOut2MasteringTerm when it
replaces its world, which threw. Like Init and SetParam it has no effect, as
there is no mastering stage. The title creates its next world's audio device
before it destroys the previous one, so Init runs twice before Term runs
twice; whether the console reports an error for either is unknown, so both
return 0 and the case is recorded in TechnicalDebt.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 02:40:20 -04:00
LuisBiceps 9f7e2ca75d feat(libSceSystemService): report the web browser as unavailable
sceSystemServiceLaunchWebBrowser fails with the kernel's EOPNOTSUPP: there is no web browser to open. RommPS PPSA76677 stops on main at this import and shows a QR code instead when the browser does not open.
2026-10-09 14:31:04 +08:00
jdmagicandClaude Opus 5.5 8ae350caaa fix(libSceAmpr): sceAmprCommandBufferClearBuffer returns the detached buffer
sceAmprCommandBufferClearBuffer detaches a command buffer's memory and
returns it so the caller can free it. It returned 0. PPSA01289 (Sackboy: A
Big Adventure) frees the result after every streaming read, so each read
leaked its 16 KiB command buffer until the allocator ran out of memory
during the first world load.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 01:58:38 -04:00
Scott SchusterandClaude Opus 5.5 af9e60b690 fix(agc): accept RADV's point and line depth bias enable on triangle draws
With depth bias enabled, RADV sets POLY_OFFSET_PARA_ENABLE in
PA_SU_SC_MODE_CNTL next to the front and back enables, whatever the
topology; vkQuake's draws carry 0x3a46. The bit applies the offset to
points and lines, so it changes nothing for triangles, and Vulkan applies
depth bias only to polygons. It is now accepted with depth bias on
triangle topologies; point and line draws with it are still rejected.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 00:54:22 -05:00
Aryan Sharma 631654b649 perf(libc): limit the TZ initializer to Linux 2026-10-09 11:16:57 +05:30
AlexandClaude Opus 5.5 c9ab6a72a5 fix(agc): store labels the GPU cannot reach in stream order
A label in memory the device has no host import of was stored when its
batch was reaped, after later labels the GPU had already made visible.
A title that reused that memory saw its next command buffer overwritten
by the stale value (#1458). Wait for the recorded work and store it then.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 01:42:59 -04:00
Aryan Sharma 7b130700f6 feat(libc): implement malloc_stats_fast through the application allocator
A title that replaces the allocator through its libc parameters also
supplies malloc_stats_fast in that table, and PPSA28997 calls it. It is
now forwarded to the title's function. Without a replacement allocator
that provides it, the call throws.
2026-10-09 11:04:45 +05:30
Aryan Sharma 11b32af522 perf(libc): set TZ once on Linux
Without TZ, glibc's localtime and mktime run tzset on every call and
re-check /etc/localtime each time. PPSA28997 calls them every frame
during its intro, which then spent most of its time there. TZ is set
to :/etc/localtime when unset, so the zone is read once.
2026-10-09 10:59:48 +05:30
AlexandClaude Opus 5.5 254f354e72 fix(shader): flush v_div_fixup_f32 src1 and src2 denormals
With f32 denormals flushed, as in the 0xc0 float mode titles use, the
hardware flushes the denominator and numerator of v_div_fixup_f32 but
keeps a denormal quotient and result. The recompiler kept all three,
so a denormal divisor gave the quotient back instead of an infinity.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 01:19:28 -04:00
Arvind FrøilandandClaude Opus 5.5 7fc025e1c8 test(agc): check MSAA storage emission without the device's support
PrepareMultisampledStorage only inspects the SPIR-V that the recompiler
emits for multisampled storage writes and atomics, but it took its
target from the device, so on a device without
shaderStorageImageMultisample, such as MoltenVK, the emission failed
and agc_driver_prepared_shaders failed in all its variants. The target
now has the StorageImageMultisample capability, and the check that a
target without it is refused still removes it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 14:06:13 +09:00
Nahuel GenchiandClaude Opus 5.5 5c291a5557 fix(agc): read an unwritten pixel program address as unset
PixelProgramSkipped only treated SPI_SHADER_PGM_LO/HI_PS written as 0 as
a draw without a pixel program, while the draw decoder already reads an
unwritten address as 0 and binds the null pixel program for it. A
depth/stencil-only draw whose pixel program address was never written
was instead rejected by the precheck with "depth/stencil-only draws
without a pixel shader are not implemented".

An unwritten address is now unset in PixelProgramSkipped too, so such a
draw goes through the null pixel program like one with the address
written as 0, and one that writes color is rejected as before.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 02:05:48 -03:00
AlexandClaude Opus 5.5 f4131a546b fix(shader): clamp packed f16 min/max signaling NaN results to zero
With IEEE=1, v_pk_min_f16 and v_pk_max_f16 return a quieted NaN for a
signaling NaN operand, and DX10_CLAMP=1 clamps it to +0. The clamped
form skipped the bit-level NaN selection and saturated the driver's
min/max, which returns the other operand, so it gave that operand.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 00:43:35 -04:00
Nahuel GenchiandClaude Opus 5.5 b9d7ff46d2 feat(libSceJson2): implement sce::Json::Object::empty
Sonic Origins (PPSA05324) imports sce::Json::Object::empty() const
(i2l3IYvQ9UE) and fails to load without it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 01:33:58 -03:00
LuisBiceps 75345b07b9 test(libSceSystemService): reject app ID 0 and how -2 in the kill test
Also say in the debt entry that on the console sceSystemServiceKillApp returns and the shell ends the title, while here the call does not return.
2026-10-09 12:22:29 +08:00
LuisBiceps 38cbdfe34c fix(libSceSystemService): close the title through the libc exit coordinator
sceSystemServiceKillApp now ends the title as guest exit() does, so driver calls that wait for the exit park instead of throwing ProcessShutdown, and a second exit waits for the first. The test now fails when the kill returns, exits with a status other than 0 or bypasses the coordinator, and checks why a rejected call throws.
2026-10-09 12:21:09 +08:00
LuisBiceps cb43a4c306 feat(libSceSystemService): let the running title close itself with sceSystemServiceKillApp
Report an app ID for the running title from sceSystemServiceGetAppIdOfRunningBigApp, and shut the guest down and exit when sceSystemServiceKillApp receives that ID with the arguments -1, 0 and 0. SwanStationPS5 (PPSA98510) 1.0.6 closes itself this way and stops on both imports on main.
2026-10-09 12:10:19 +08:00
Scott SchusterandClaude Opus 5.5 1e5b8d9e7c fix(shader): report a truncated memory, image or export instruction as out of range
ReadRawComputeShader decodes a growing prefix of guest memory and reads
more when the decoder throws std::out_of_range, which the vector, scalar
and instruction-length checks throw for an instruction cut off by the end
of the span. The memory (SMEM, DS, MUBUF, MTBUF, FLAT), image and export
decoders threw std::runtime_error instead, so a two-word instruction
across a window boundary failed the read: vkQuake terminated on "truncated
FLAT instruction". These now throw std::out_of_range too.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 23:02:17 -05:00
LuisBiceps b38c8d6ae8 fix(agc): correct the default tessellation factor ring address
The hardware findings give 0xF_F000_0000, which is 0xFF0000000, not 0xFF00000000. Check the ring across threads, at ps5-opengl's size of 0x1b000 and with a canary after the outputs, and say in the debt entry that nothing is written to the ring.
2026-10-09 11:45:53 +08:00
David d658f73e00 fix(tools): decode overlap command output as UTF-8 2026-10-08 20:40:46 -07:00
LuisBiceps d8ecb8e4eb feat(agc): implement sceAgcDriverGetTFRing
Record the tessellation factor ring that sceAgcDriverSetTFRing receives and report it from sceAgcDriverGetTFRing, with the console's default of 0xFF00000000 and 128 KiB before a title sets one. VITA5 (PPSA39410) and Homebrew UI Lab (PPSA99050) stop on this import once sceVideoOutGetResolutionStatus resolves.
2026-10-09 11:37:05 +08:00