Commit Graph
4862 Commits
Author SHA1 Message Date
Adrià 6b3e8c476e Merge pull request #835 from adriadam10/feat/appcontent-addcont-info
feat(libSceAppContent): implement sceAppContentGetAddcontInfo and GetAddcontInfoList
2026-10-07 18:25:31 +02:00
Adrià 0da8f48cfc Merge pull request #831 from adriadam10/feat/audio3d-object-reserve
feat(libSceAudio3d): implement sceAudio3dObjectReserve and sceAudio3dObjectUnreserve
2026-10-07 18:24:56 +02:00
Adrià 5684bd9e92 Merge pull request #876 from YossiYad/feat/gpu-selection
feat(agc): choose the Vulkan device by name with ANYPS5_GPU
2026-10-07 18:24:13 +02:00
Adrià 4b16995d91 Merge pull request #807 from adriadam10/feat/kernel-timer-event
feat(libkernel): sceKernelAddTimerEvent and sceKernelDeleteTimerEvent
2026-10-07 18:22:56 +02:00
MichonandClaude Opus 5.5 29aa275653 fix(agc): accept fragment Geometry and SampleRateShading only when the device enabled them
The validator takes the geometryShader and sampleRateShading enables from the
context (set where #295 enables them), so a device without them refuses the
draw instead of creating a module that needs features it never enabled.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-07 18:18:47 +02:00
Adrià FranchandClaude cc789786de feat(libSceLibcInternal): implement _sceLibcInternalForceTlsDestructor
Co-Authored-By: Claude <[email protected]>
2026-10-07 18:18:13 +02:00
MichonandClaude Opus 5.5 f3fd29db0d fix(agc): accept a fragment SampleMask output
Pixel shaders that export a coverage mask write gl_SampleMask, an
int[1] (or uint[1]) output. The validator rejected array interface
types; it now spells them elem[N] and accepts SampleMask as int[1] or
uint[1].

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-07 18:18:12 +02:00
MichonandClaude Opus 5.5 78726f3836 fix(agc): fragment SampleId, Layer and FragDepth interfaces
The recompiler emits SampleId and Layer fragment inputs (pixel ancillary
data) and a FragDepth output with the DepthReplacing execution mode
(depth export), but the validator refused them, so those draws were
skipped. They are now accepted, as are the Geometry and SampleRateShading
capabilities those inputs need in fragment shaders. The device enables
both features when it has them.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-07 18:18:12 +02:00
MichonandClaude Opus 5.5 131adc17ae perf(agc): draw cache keys on the user words each stage reads
The draw key mixed all 32 user data words of every stage. It now mixes only the
words a stage's RSRC2 counts, so draws that differ only in words their programs
never read share an entry. The RSRC2 registers stay in the key.
APS5_DRAW_KEY_ALL_USER_WORDS=1 mixes all 32 again.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-07 18:18:00 +02:00
Adrià FranchandClaude 5b331ed022 feat(libSceAppContent): implement sceAppContentGetAddcontInfo and GetAddcontInfoList
Co-Authored-By: Claude <[email protected]>
2026-10-07 18:14:04 +02:00
Adrià FranchandClaude 9ab637a575 fix(libkernel): wake infinite equeue waits for timers, document timer choices
Co-Authored-By: Claude <[email protected]>
2026-10-07 18:14:04 +02:00
Adrià 2b8f0b215e Merge pull request #803 from adriadam10/feat/rtc-dos-time
feat(rtc): implement sceRtcGetDosTime and sceRtcSetDosTime
2026-10-07 18:07:20 +02:00
Adrià FranchandClaude 0781225d43 fix(rtc): decode the DOS year as unsigned, move TechnicalDebt line
Co-Authored-By: Claude <[email protected]>
2026-10-07 18:06:11 +02:00
Adrià Franch c3871dcb99 feat(libSceAudio3d): implement sceAudio3dObjectReserve and sceAudio3dObjectUnreserve 2026-10-07 18:01:24 +02:00
Adrià FranchandClaude d081e6749d feat(libkernel): sceKernelAddTimerEvent and sceKernelDeleteTimerEvent
Co-Authored-By: Claude <[email protected]>
2026-10-07 17:55:57 +02:00
Adrià def8119927 Merge pull request #550 from Pouare514/fix/memory-prot-gpu-bits
fix(libkernel): accept GPU coherency prot bits for host mapping
2026-10-07 17:54:41 +02:00
Adrià FranchandClaude c94949aedb feat(rtc): implement sceRtcGetDosTime and sceRtcSetDosTime
Co-Authored-By: Claude <[email protected]>
2026-10-07 17:52:56 +02:00
Raihan Abdul MajidandClaude Opus 5.5 0a6a8a7b5c feat(font): accept sceFontGlyphDefineAttribute as a silent stub
PPSA01325 stops on sceFontGlyphDefineAttribute right after generating a character glyph: it sets attribute 0x11 to 0 on that glyph, deletes it without using it, and draws the character with sceFontRenderCharGlyphImageHorizontal. The meaning of the attributes is unknown, so the call checks the glyph and ignores the rest; TechnicalDebt lists it under silent stubs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01UTjpbMX7BUFMZZaxJE98zV
2026-10-07 22:46:48 +07:00
Raihan Abdul MajidandClaude Opus 5.5 267b893b59 feat(libs): provide the exports PPSA01325 imports that no library has
Astro's Playroom (PPSA01325) fails eager binding on three imports. The two voice chat group requests follow the offline model of the other sceVoiceChatRequest* calls and return SIGNED_OUT; sceRudpActivate, whose signature is unknown, is declared as a throwing stub.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01UTjpbMX7BUFMZZaxJE98zV
2026-10-07 22:43:08 +07:00
Pouare514 c25ff91a65 fix(libkernel): accept GPU coherency prot bits for host mapping 2026-10-07 17:29:28 +02:00
Pouare514 9c5205973b fix(libs): export recomputing Vrr names without APS5_EXPORT alias 2026-10-07 17:25:07 +02:00
Pouare514 0b3dd07ba0 fix(libs): real Vrr names for VideoOut pair, generic Unknown00/01 for the rest 2026-10-07 17:25:07 +02:00
Pouare514 a620a2579d fix(libs): TLOU throwing stubs for VideoOut VrrPeg and VrrStatus 2026-10-07 17:24:59 +02:00
Mehran 7ef0d4c4d4 perf(agc): fill the device proc table before objects copy the context 2026-10-07 18:00:12 +03:00
TideOPL 88e742208b test(libc): require std::bad_function_call from the __sce_v2 thrower 2026-10-07 15:44:33 +01:00
eliasbruno124-dev 77becef75c fix(json2): support null-access callback spelling 2026-10-07 16:18:01 +02:00
alfalfa-starandClaude Opus 5.5 afb6d1e165 perf(agc): keep draw snapshots of storage buffers up to 1 GiB
Recorder::KeepDrawSnapshot keeps nothing larger than the pool's byte
budget, and the storage-buffer pool's budget was 256 MiB (the draw
input pool, for vertex and index data, has 1 GiB). A read-only storage
buffer a draw reads in place from an import is copied into a snapshot
per draw; one larger than 256 MiB was never kept, so every draw copied
it again even when the guest had not touched it.

PPSA14632 (LEGO Horizon Adventures) binds a 576 MiB direct-memory buffer
to many draws: each one memcpy'd all 576 MiB (about 100 ms), 176 times
in 60 s. With the budget at 1 GiB, as for draw inputs, the snapshot is
reused while the buffer is unchanged (394 reuses and 41 copies in 90 s),
and Graphics::Draw drops from about 7 ms to 1 ms per draw packet.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 16:14:10 +02:00
Achraf ReyaniandClaude Opus 5.5 42b88bfe83 refactor(libs): name the libc and Json2 stubs the NID database resolves
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 23:13:36 +09:00
Achraf ReyaniandClaude Opus 5.5 53495b2b35 refactor(libScePsml_debug): name the Mfsr stubs the NID database resolves
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 23:12:50 +09:00
TideOPL 1d806f804e fix(libs): drop the VrrPeg stubs that #518 already adds 2026-10-07 15:02:51 +01:00
TideOPL 3deba9fa47 Merge remote-tracking branch 'origin/main' into pr1125
# Conflicts:
#	core/libs/prx/libkernel/System/src/Coredump.cpp
2026-10-07 15:02:47 +01:00
Adrià 3c054008b8 Merge pull request #313 from RomainROCH/codex/fix-nothrow-allocation
fix(libc): return null on nothrow allocation failure
2026-10-07 15:54:01 +02:00
Gjon Gojcevic 02166268ea test(libSceNgs2.native): run the waveform parse tests in their own executable
On Linux ngs2_atrac9 aborted without any output once TestParseFile was part of
its main(). The exception that TestCorruptSuperframeAtPageEnd throws in the
Ngs2 module and catches in main() has to resume through a cleanup landing pad
inside main(). That resume goes through the unwinder statically linked into the
test executable, which then fails with _URC_FATAL_PHASE2_ERROR and aborts
silently. Whether main() gets such a pad depends on what the compiler inlines
into it, so adding any function with non-trivial cleanups to that main() is
enough to trigger it.

Move the PCM and file parse tests into a new ngs2_parse executable and restore
Ngs2Atrac9.cpp to its upstream content, so the test that catches exceptions is
unchanged. The new executable has no catch and never relies on that path.
2026-10-07 09:49:31 -04:00
RomainROCH 0e01d95abd fix(libc): narrow nothrow allocation failure handling 2026-10-07 15:45:15 +02:00
Pouare514 4fcfd3c2b3 feat(prx): stub TextToSpeech2, Vdecsw and Coredump unknown exports 2026-10-07 15:42:04 +02:00
alfalfa-starandClaude Opus 5.5 98405e8f25 fix(agc): run draws whose pixel stage cannot run without its program
A depth-only pass can leave a stale pixel program address in
SPI_SHADER_PGM_LO/HI_PS while never setting the pixel registers it does
not need. The draw then failed with "missing register at DWORD 0x1b3"
(SPI_PS_INPUT_ENA), although the hardware never launches that program:
with no color written (CB_TARGET_MASK & CB_SHADER_MASK == 0), no depth,
stencil or mask export (SPI_SHADER_Z_FORMAT 0 and those enables of
DB_SHADER_CONTROL clear), and neither KILL_ENABLE, EXEC_ON_HIER_FAIL,
EXEC_ON_NOOP nor EXEC_IF_OVERLAPPED set, the pixel shader has no effect
and is not executed.

PixelProgramUnset becomes PixelProgramSkipped: true for a zero program
address as before, and for such an inert pixel stage. Both use the
driver's null pixel program; the precheck and the decode agree.

PPSA14632 (LEGO Horizon Adventures) issues an HTILE expand this way
(DB_RENDER_CONTROL DEPTH/STENCIL_COMPRESS_DISABLE, CB disabled, depth
test and writes off) once per run.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 15:31:39 +02:00
Aarav 742fa2e395 test(libc): keep exception runtime assertions enabled in Release 2026-10-07 18:49:42 +05:30
alfalfa-starandClaude Opus 5.5 5822c26b59 fix(agc): bind a null index buffer to non-indexed mesh draws
A non-indexed mesh draw (DRAW_INDEX_AUTO, or a non-indexed indirect
record) gave the mesh program's hidden index buffer V# (user words 4..7)
a 4-byte range at the program's own code address, so the descriptor had
a guest address although the prologue never loads through it (the load
is predicated on the draw's index size). That range is bound from live
guest memory. When the program also reads guest memory by address, the
address build captures the program's code as an immutable snapshot, and
the two overlapped: the draw failed with "writable guest memory
overlaps an immutable snapshot", or, when the live bytes at the code
address had changed since the capture, "guest snapshot differs from the
writable memory it overlaps".

MeshIndexBufferDescriptor now returns a null V# (base and size 0, same
format word) for a non-indexed draw, which ShaderResources binds to its
empty placeholder buffer, and takes no unread address any more.

PPSA14632 (LEGO Horizon Adventures) hit this on its layered mesh-path
draws.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 15:18:10 +02:00
TideOPL cbdfcd8120 feat(libs): add the unimplemented exports PPSA16064 imports
PPSA16064 (Minecraft Dungeons II, Unreal Engine) failed to load because
these imports had no export:

- libkernel: sceCoredumpWriteUserString
- libSceSaveData: sceSaveDataConvert, sceSaveDataGetConvertProgress
- libSceVideoOut: sceVideoOutVrrPegToFixedRate,
  sceVideoOutVrrUnpegFromFixedRate

None of them is called during the title's start-up, so they are added
as unimplemented exports that throw with their name if a title calls
them. Their signatures are unknown; TechnicalDebt records them. The
built libraries export the NIDs the title imports.
2026-10-07 14:09:55 +01:00
TideOPL 1311bf6567 fix(libSceAgc): accept s_swappc_b64 null, s[6:7] as a front half's terminator
sceAgcUnknownGetFusedShaderSize and sceAgcUnknownFuseShaderHalves
require a front half to end with s_setpc_b64 s[6:7] (0xbe802006), the
jump to the back half, before its s_code_end padding. PPSA16064
(Minecraft Dungeons II, Unreal Engine) has front halves that end with
0xbefd2106 instead, and the size query threw "front half does not end
with s_setpc_b64 s[6:7]".

0xbefd2106 is SOP1 S_SWAPPC_B64 (opcode 0x21) with SSRC0 s[6:7] and
SDST 125, the NULL register (RDNA2 ISA, SOP1 and the scalar operand
table): it jumps to s[6:7] and discards the return address, the same
transfer as s_setpc_b64 s[6:7]. Fusion drops this instruction and pads
to the back half with s_nop either way, so both forms are accepted. Any
other last instruction still throws.

agc_shader_fusion runs the full fusion check on a front half ending
with the s_swappc_b64 form; on main it fails with the title's error.
2026-10-07 14:08:13 +01:00
TideOPL 7fdfc9208b fix(libSceAgc): treat a null cursor_down as a buffer limited by its top
Every command writer checked bottom <= cursor_up <= cursor_down <= top.
PPSA16064 (Minecraft Dungeons II, Unreal Engine) builds small one-packet
buffers (8 dwords) with cursor_down left null, and the first
sceAgcDcbCopyData into one threw "invalid command buffer cursors".

Nothing in the library allocates downward, so cursor_down only bounds
the space above cursor_up. A null cursor_down now means that bound is
top. Non-null cursors are checked as before. TechnicalDebt records the
assumption.

agc_commands writes six dwords into such a buffer and checks that a
further allocation past top fails without moving the cursor.
2026-10-07 14:08:13 +01:00
TideOPL 183491b263 feat(libc): export the __sce_v2 _Xbad_function_call and sized aligned delete
PPSA16064 (Minecraft Dungeons II) ships its own libc.prx, which imports
two C++ runtime symbols from libSceLibcInternal that no host library
exported, so the title failed to load:

- std::__sce_v2::_Xbad_function_call() (_ZNSt8__sce_v219_Xbad_function_callEv),
  the inline-namespace spelling of the existing std::_Xbad_function_call.
  It throws std::bad_function_call the same way.
- operator delete(void*, std::size_t, std::align_val_t)
  (_ZdlPvmSt11align_val_t), the sized form of the existing aligned
  delete. It frees the pointer the same way and ignores the size.

application_heap_default frees an aligned block through the sized form
and checks that a null pointer frees nothing. exception_runtime checks
that the new thrower throws a standard exception; it is built only on
Linux and was not run here (Windows 11, MinGW GCC 15.2).
2026-10-07 14:08:13 +01:00
TideOPL efceec9c56 feat(libScePad): implement scePadIsRemoteController
NID fCWdlnmB1Ks was exported as an unknown function that threw. The
name scePadIsRemoteController hashes to it. PPSA16064 (Minecraft
Dungeons II) calls it once per controller after
scePadGetControllerInformation, with the pad handle and the address of a
byte it has just zeroed, and ignores the result.

It reports whether the controller is connected through Remote Play.
Controllers here are local devices, so the answer is always false. An
invalid handle returns INVALID_HANDLE and a null output INVALID_ARG, as
the other pad calls do. Without it the title aborted at the main menu.

scePadSetAngularVelocityBiasCorrectionState, which the title imports but
does not call during start-up, is added as an unimplemented export.

guest_pad checks the handle and null-output errors and the result.
2026-10-07 14:08:12 +01:00
Kikoarl f5619c4dcc feat(shader): implement S_CALL_B64 2026-10-07 15:02:33 +02:00
Fishybeing cb3f3e74ff build(windows): guard NOMINMAX in Rtld.cpp
Rtld.cpp defined NOMINMAX unconditionally, which redefines the macro the build already passes and warns on MinGW. Use the #ifndef guard the rest of the tree uses.
2026-10-07 15:00:08 +02:00
Adrià e79c971f99 Merge pull request #327 from slick-daddy/opt-2
perf(shader): intern SPIR-V type and constant ids without a per-call allocation
2026-10-07 14:55:47 +02:00
Adrià 68010dfbf3 Merge pull request #1043 from Celegans12/perf/shader-bda-fallback-functions
perf(shader): share the BDA byte read fallback between read sites
2026-10-07 14:45:25 +02:00
Adrià 501f1fe01d Merge pull request #1023 from Celegans12/perf/shader-memoize-emission-failures
perf(shader): memoize SPIR-V emission failures
2026-10-07 14:41:19 +02:00
Adrià 8f510f31ab Merge pull request #1066 from Celegans12/feat/shader-buffer-limit
feat(shader): accept more than 32 buffers per shader up to the device limit
2026-10-07 14:20:34 +02:00
Raihan Abdul MajidandClaude Opus 5.5 bb7898af11 test(libc): run windows_exception_tests in ctest
The MinGW exception test was built only on request and never registered, so the cross-DLL unwinding it covers was not checked in CI. Build it with BUILD_TESTING and run it with the libc directory on PATH, as guest_locale does, since it imports libc.prx.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 19:16:51 +07:00