Commit Graph
12196 Commits
Author SHA1 Message Date
STL1teandClaude Opus 5.5 029dcdacac feat(agc-driver): null V#s access nothing, as on hardware
A V# without records (all zero, say, for a slot the taken path never
uses) makes every access out of bounds on hardware: loads read zero or the
format's default, stores and atomics are dropped. The recompiler now
specializes such a buffer as empty, so every access through it is out of
bounds, and the driver binds a small per-device placeholder buffer to the
element instead of rejecting the V#. A V# with records at address zero
still throws.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:18 +03:00
STL1teandClaude Opus 5.5 21cb5676c7 feat(shader): buffer access through V#s computed on the GPU
A V# the SRT walker cannot compute (loaded from a descriptor heap at a
GPU offset, or built by the program) has no binding to hold it. Raw
dword loads and stores of 1-4 dwords through one now decode the V# in the
shader, apply the RDNA2 bounds rules (OOB_SELECT, stride, swizzle,
ADD_TID, format 0) and go through the BDA page table, as Kyty does.

Stores need Write permission, which only ranges that are a writable
allocation's host import get, so a store into a mirror or a copy faults
rather than being lost. The shader notes each written page in an
open-addressed set behind the fault record; once the work completed the
host marks those pages GPU-written, and an overflowing set throws.
Formatted, typed, sub-dword and atomic access through such a V#, and
their use outside compute shaders, still fail.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:18 +03:00
STL1teandClaude Opus 5.5 c1692bf939 feat(shader): read the bits of a D32 depth plane as a 32-bit integer texture
A sampled T# of a 32-bit integer format over a depth layout (a Z swizzle
mode) reads the raw bits of a depth plane, and a host cannot view a depth
image with an integer format. Such an image is specialized as float and
bound as the depth surface's float view: a fetch returns the same bits,
which the shader keeps as they are, and swizzle constants read as the
integers 0 and 1. Filtering is forced to point, as for integer formats.
The same T# over guest memory rather than a depth surface throws.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:18 +03:00
STL1teandClaude Opus 5.5 19521c2ecd feat(agc-driver): occlusion counters from Vulkan occlusion queries
EVENT_WRITE PIXEL_PIPE_STAT_DUMP (event 0x39) dumps the DB sample
counters. The recorder, once a title asks for them, keeps an occlusion
query open over each batch (precise when the device supports it) and adds
the result to a running count when the batch is reaped. A dump drains
recorded work like a label and writes the count in the PS5 layout: 16 DBs
16 bytes apart, begin and end counters interleaved, the count in the
first and bit 63 marking each ready. Kyty and SharpEmu write a fixed
"visible" result instead.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:17 +03:00
STL1teandClaude Opus 5.5 30c0cf1dfb feat(agc-driver): sample depth and stencil surfaces from their GPU images
A depth target lives only in a GPU image (its guest surface is never
written), so a texture over its depth or stencil plane now samples that
image through a view of the plane's aspect: R32_SFLOAT for D32, R16_UNORM
for D16, R8_UINT for stencil, one level and slice at the surface's extent.
Other shapes, and storage access to a depth surface, throw. Depth images
get the sampled usage, and the barriers after a render pass and before a
dispatch include depth attachment writes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:17 +03:00
STL1teandClaude Opus 5.5 b7eaabbc1e feat(kernel): share direct memory mapped at two addresses read-only
A title maps physical pages at a new address while the GPU still reads them
through the old one. Every view of such a page gets the same contents and
loses write access while the page is shared; the last view left gets its
protection back. A CPU write to a shared page faults, and views that differ
when one is unmapped (a GPU write through an import) throw, instead of the
views silently diverging.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:17 +03:00
STL1teandClaude Opus 5.5 59a6998f1a fix(agc): EOP PatchData takes (cmd, data); -KRzWekV120 sets the index size
sceAgcQueueEndOfPipeActionPatchData is called with the packet and the new
64-bit label value only; reading a context id and a data selector from the
unused argument registers wrote garbage into the RELEASE_MEM, so fences
signalled with wrong values.

-KRzWekV120 is sceAgcDcbSetIndexSize with the per-instance object id flag
(VGT_INDEX_TYPE bit 14), as Kyty and SharpEmu build it. The no-op left the
previous index type in place, so 32-bit index buffers were read as 16-bit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:16 +03:00
STL1teandClaude Opus 5.5 502a79381a feat(libs): system services for a console without PSN, dialogs or streaming
- NP: signed-out callbacks and reachability; owned add-on entitlements
  from anyps5-entitlements.ini next to the executable (or the file
  ANYPS5_ENTITLEMENTS names)
- web browser, message, player invitation and player selection dialogs
  finish without a UI; Remote Play, IME keyboard, SharePlay, live
  streaming and video recording lifecycles for a console without them
- app content temporary data mount, format and free space (download data
  quota from param.json); content export, search and delete lifecycles
- pad output-only calls, system service notice-screen flags, RazorCpu
  markers, ulobjmgr
- throwing stubs for the remaining imports, so missing behavior fails
  loudly

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:16 +03:00
STL1teandClaude Opus 5.5 028d465e98 feat(audio): AJM MP3 through FFmpeg, 16-bit and ambisonic AudioOut2, voice
- AJM codec 0 (MP3) decodes with FFmpeg, prebuilt through the
  ffmpeg-core submodule as in Kyty; sceAjmBatchJobDecode and the Run job;
  the PCM encoding follows the job flags; other codecs throw
- AudioOut2 ports of 16-bit integer samples, and the ambisonics speaker
  array decode for the reported layout
- the voice library for a console with no headset, with a frame size for
  voice ports

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:15 +03:00
STL1teandClaude Opus 5.5 2476bfda56 feat(agc-driver): depth/stencil and mip-chain targets, more color formats
- Depth/stencil: draws that test depth or stencil against a bound surface
  render with a GPU-only depth/stencil attachment (DepthSurface), cleared
  to DB_DEPTH_CLEAR/DB_STENCIL_CLEAR when made. Z test/write/function and
  per face the stencil function, operations and masks (BACKFACE_ENABLE);
  replacements by another value where Vulkan's single reference can carry
  them. Clear and copy draws, add/sub other than 1, array or mip views
  and MSAA throw, and texture reads of a surface's memory are refused.
  Scaleform menus mask with the stencil (REPLACE 0, ADD_CLAMP, EQUAL);
  their masked content was skipped before.
- Mipmapped color targets render through the resident image of the whole
  chain with a view of the mip, so mips in the packed tail are drawn too;
  CB_COLOR_VIEW's mip level is read from bits 26-29 (GFX10).
- Color: SNORM targets, UNORM16/SNORM16 exports, one-component formats
  honouring COMP_SWAP (A8), 32_R/32_GR/32_AR exports, linear rows padded
  to 256 bytes, BLEND_BYPASS.
- INDIRECT_BUFFER jumps are followed when copying a submission; thin 3D
  textures in display and rotated XOR swizzles; only the bytes the GPU
  changed are written back; resource registration.
- VideoOut: a flip stalls the GPU queue while the flip queue is full and
  holds the submitter back.
- APS5_DUMP_FRAMES_EVERY dumps every k-th presented frame.
- The graphics test target builds again (missing sources, a hand-aligned
  64 KiB buffer, stale expectations updated) and gains DepthStencilTests.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:15 +03:00
STL1teandClaude Opus 5.5 fd4700b909 feat(agc): packet sizes, register writes, GS/HS fusion, jump patches
- packet sizes for the existing builders and the tessellation ring
  config
- direct register writes and end-of-pipe action data, type and cache
  patches
- GS/HS shader halves fused by merging their registers, after Kyty
- jump target patches; reserved jumps are allowed

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:14 +03:00
STL1teandClaude Opus 5.5 c206f7049a feat(kernel, libc): memory, files and threads for retail title boot
libkernel:
- direct memory keeps its contents per physical page across unmap and
  remap; a page mapped at two live addresses at once throws
- sceKernelDirectMemoryQuery answers from tracked allocations
- SCE protections read back as set, GPU and AMPR bits included
- APR prefix path resolve, file size and stat by id, positional reads,
  fsync/pread/pwrite; directories open as descriptors on Windows
- sceKernelCheckReachability, getpeername, shutdown
- Dinkumware C11 threads (_Mtx_*, _Cnd_*, _Thrd_*) in the title libc
  layout; any pthread stack size, rounded at thread creation

libc:
- unaddressed guest mappings go to the system-managed area from
  0x2_0000_0000, leaving the application area to fixed mappings
- the process starts in /app0
- guest sscanf on Windows; a null %s prints as (null) as on FreeBSD
- localeconv, _FNan, _FDtest, _FExp, __udivti3, wcsncpy_s, aligned
  operator new, _Throw_Cpp_error

Tests: direct memory following physical pages, guest formatting.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:13 +03:00
STL1teandClaude Opus 5.5 8e6614500a feat(shader): MIMG UNORM, _a sample aliases, LOD clamp, VOP3 carry-in
- MIMG word0 bit 12 (UNORM) is accepted on every op without a sampler
  (compute image stores set it, as the ISA asks); sample and gather still
  reject it, and rejections name the instruction words.
- The image_sample_*_a opcodes keep the plain address layout, as in Kyty.
- The _cl LOD clamp becomes the MinLod image operand (or clamps an
  explicit level) on devices with shaderResourceMinLod; a gather with a
  clamp fails loudly.
- v_add_co_ci_u32, v_sub_co_ci_u32 and v_subrev_co_ci_u32 in VOP3 form
  take their carry-in from the SGPR pair of their third source, not VCC:
  a glyph upload's reciprocal division corrected its quotient on the
  wrong lanes and UI text came out stippled.
- Pixel exports follow each MRT slot's component mapping and write only
  the components of their export format (32_R, 32_GR, 32_AR).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:12 +03:00
STL1teandClaude Opus 5.5 f4f8d5bbce feat(relinker): exclude single sce_module files, tolerate a zero code tail
- --exclude-sce-module <file> (repeatable) drops one title module from
  guest conversion, e.g. a title libc.prx, while the rest of sce_module
  is still relinked as guest modules
- the instruction scanner stops at zero padding that ends a code segment
  with an odd byte instead of failing on a truncated `add [rax], al`

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-29 21:22:11 +03:00
boykopovar 75a8668b5e Merge pull request #116 from oneandonlydean/fix/json2-reference-getters
fix(json2): referValue returns null for a missing member, getters return references
2026-09-29 20:51:57 +03:00
Digote e2c426f528 feat(shader): support 64-bit scalar bit compare 2026-09-29 13:37:38 -03:00
boykopovar ffe1427017 Merge pull request #139 from SamG-Coder/codex/font-module-names
fix(font): build PS5 module-named font libraries
2026-09-29 19:29:12 +03:00
Julien Legay bd3e41b28f Implement player invitation dialog HLE stub 2026-09-29 19:07:03 +03:00
boykopovar 83358bec94 Merge pull request #146 from Qznad/feat/jpegenc
feat(jpegenc): implement the JPEG encoder
2026-09-29 17:52:36 +03:00
Qznad f9f02e3736 fix(jpegenc): link libc into the guest test for Windows exception support 2026-09-29 15:38:30 +01:00
boykopovar 2e9761753d Merge pull request #86 from OverkillLabs/feat/misc-prx-additions
feat(prx): ConvertKeycode, VoiceChat stubs, PlayGo chunk-id fix
2026-09-29 17:30:06 +03:00
Qznad 6ef4ae3cec fix(jpegenc): hide shared encoder symbols and document grayscale output 2026-09-29 15:17:27 +01:00
Qznad aad41aa907 feat(jpegenc): encode images through the shared JPEG encoder 2026-09-29 15:17:27 +01:00
Qznad 94c7319202 feat(decoder): add shared JPEG encoder and decoder in core/Decoder/Jpeg 2026-09-29 15:17:27 +01:00
Qznad aa56049fbf feat(jpegenc): validate sceJpegEncEncode arguments 2026-09-29 15:17:27 +01:00
Qznad 2829cf92f4 build(jpegenc): add stb as a submodule 2026-09-29 15:17:27 +01:00
Qznad 98a5228cf7 feat(jpegenc): implement sceJpegEncCreate and sceJpegEncDelete 2026-09-29 15:17:27 +01:00
Qznad 16290424b9 feat(jpegenc): implement sceJpegEncQueryMemorySize 2026-09-29 15:17:27 +01:00
Qznad 442082612c feat(jpegenc): add parameter structs and real function signatures 2026-09-29 15:17:27 +01:00
OverkillLabs 020579d4fd refactor(prx): drop the PNG encoder from this PR
Per maintainer feedback: PNG encode/decode belongs together in a
future core/Decoder/Png shared by the relinker (icon loading) and
PRX layer, not a one-off libScePngEnc-only encoder. Reverts
libScePngEnc/Export.cpp to the upstream stub and removes the vendored
stb_image_write.h dependency, leaving ConvertKeycode, VoiceChat and
the PlayGo chunk-id fix.
2026-09-29 14:12:42 +03:00
boykopovar 563a1749dd Merge pull request #111 from oneandonlydean/fix/s-getpc-absolute
fix(shader): make s_getpc_b64 return the shader's absolute address
2026-09-29 13:11:55 +03:00
boykopovar 9edb1f9a95 Merge pull request #110 from oneandonlydean/fix/device-replacement-race
fix(agc): don't let a queue worker record on a device the presenter is replacing
2026-09-29 13:06:30 +03:00
boykopovar c0755b9ec8 Merge pull request #102 from asimplestray/feat/kernel-aio
feat(kernel): implement Aio request lifecycle
2026-09-29 11:07:10 +03:00
boykopovar 9d6ba601c9 Merge pull request #100 from Digote/feat/shader-s-clause
feat(shader): support S_CLAUSE scheduling hints
2026-09-29 10:58:40 +03:00
boykopovar d841b8420a Merge pull request #97 from SamG-Coder/codex/kernel-notifications
feat(kernel): deliver plain-text notifications to host output
2026-09-29 10:51:52 +03:00
boykopovar 4ed3199171 Merge pull request #84 from OverkillLabs/feat/pad-gamepad-haptics
feat(pad): motion sensors, rumble, adaptive triggers and light bar over SDL
2026-09-29 10:47:52 +03:00
boykopovar d998717588 Merge pull request #83 from OverkillLabs/feat/agc-shader-improvements
feat(agc,shader): remaining PM4 command-buffer opcodes and shader recompiler hardening
2026-09-29 10:35:36 +03:00
boykopovar 983109fe16 Merge pull request #81 from OverkillLabs/feat/kernel-libc-fixes
feat(libc,kernel): wide-char formatting, sub-tick waits, memory-pool querying, module loader wiring
2026-09-29 10:03:00 +03:00
OverkillLabsandClaude Sonnet 5 56d061a350 style(prx): apply CONVENTIONS.md to misc PRX additions
Strip inline explanatory comments (comments are restricted to
technical-debt markers, #endif, and namespace-close trailers) from
HitLog.hpp, libSceConvertKeycode, libSceVoiceChat, libScePngEnc, and
the new hunk in libScePlayGo; add the missing #endif trailer comment
to HitLog.hpp's include guard. Rename the local helpers/params that
didn't match the naming convention: log_soft -> logSoft and
Readable -> readable (private free functions, camelCase), and
snake_case arguments (user_id, request_id, memory_address,
memory_size, output_info) to camelCase. NID export functions and
pre-existing upstream code (libScePlayGo's existing snake_case
parameters, PngEnc's vendored stb_image_write.h) are left untouched.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-09-29 04:24:39 +03:00
OverkillLabsandClaude Sonnet 5 e532b19cee refactor(pad): trim comments and apply naming conventions
Bring the pad-gamepad-haptics diff in line with docs/dev/CONVENTIONS.md:
strip explanatory/rationale comments (struct layouts, algorithm notes,
rewired-NID rationale) down to code only, and rename the anonymous-
namespace helpers in PadState.cpp (Normalize/Fuse/EncodeZones/MaxOf/
ScaleStrength) to camelCase to match upstream's free-function style.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-09-29 04:24:39 +03:00
OverkillLabs 22b53e3f25 prx: implement scePlayGoGetInstallChunkId for real
Was a NotImplemented stub that returned an empty/undefined result.
For a package where every declared chunk is already local, the
installed-chunk set is identical to the full chunk set already
computed by ValidateChunks()/ValidChunks(), so this simply delegates
to the existing scePlayGoGetChunkId(). Driven by the title's own
playgo-chunkdefs.xml, not any hardcoded per-title chunk count.
2026-09-29 04:24:35 +03:00
OverkillLabs dc6baf629f prx: implement real libScePngEnc PNG encoder
Replaces the 4-stub placeholder with a working create/delete/encode
path backed by stb_image_write. The encode parameter block layout is
inferred by analogy with the decoder's and validated strictly
(dimensions, pitch, buffer sizes, readability of both the source and
destination buffers) before any pixel is touched; anything that does
not fit is rejected rather than guessed at. Handles RGBA and BGRA
source pixel formats.
2026-09-29 04:24:30 +03:00
OverkillLabs 556a7fcfdb prx: add libSceVoiceChat offline-safe HLE stub
Init/terminate/handler/event exports are real no-ops. Session and
channel request exports return SCE_VOICE_CHAT error SIGNED_OUT, since
voice chat sessions cannot be established without a network backend.
Matches the offline-stub pattern already used by other online-service
PRX modules in this project.
2026-09-29 04:24:20 +03:00
OverkillLabs 2982aa6a2e prx: add libSceConvertKeycode HLE module
sceConvertKeycodeGetImeKeyboardType is implemented for real (reports
keyboard type 0 for a valid user id). sceConvertKeycodeGetVirtualKeycode
has an unconfirmed ABI, so it only logs its raw arguments and reports
failure rather than guessing a pointer layout.
2026-09-29 04:24:16 +03:00
OverkillLabs 55ed2719d5 refactor: apply naming conventions and drop extern-C comment
Renames template parameters to the TKey-style the conventions doc
requires (TValue, TFunction), removes the extern "C" close comment
(not one of the two allowed structural exceptions), and replaces
the magic error/flag numbers left after the previous comment
cleanup with the existing SCE_KERNEL_ERROR_* constants and a named
RTLD_NOW constant so the code documents itself.
2026-09-29 04:20:28 +03:00
OverkillLabsandClaude Sonnet 5 a1814def3b style: strip explanatory comments per CONVENTIONS.md
Comments in this codebase may only mark technical debt (human-added
only), the end of #endif, and the end of a namespace, per
docs/dev/CONVENTIONS.md. Remove the inline rationale comments added in
the AGC PM4 opcode and shader recompiler robustness commits; the code
itself, the commit history, and the PR description now carry that
context instead.

Notably, Command::WriteMemSemaphore takes the corrected 4-argument
form (address, waitForMailbox, signalType, operation): an earlier
revision of this helper used a different, incompatible argument
order. sceAgc*MemSemaphore callers derive waitForMailbox/signalType
from the low two bits of clientCode, and operation from action
(0 = signal, 1 = wait). This ABI note previously lived as an inline
comment; it is recorded here instead per the no-comments convention.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-09-29 04:20:09 +03:00
OverkillLabs d9f8d87c27 refactor: strip explanatory comments to match repo conventions
Comments in this codebase may only mark technical debt (per
docs/dev/CONVENTIONS.md), plus the #endif and namespace-close
structural exceptions. Removes the descriptive comments added on
this branch across PreciseWait.hpp, FormattingWide.cpp, the
direct-memory pool query/free-run plumbing, and the module loader
wiring, keeping the two allowed structural markers intact.
2026-09-29 04:18:04 +03:00
OverkillLabsandClaude Sonnet 5 7dedb2e607 style(relinker): drop inline rationale comment per CONVENTIONS.md
The project's coding conventions restrict inline comments to
technical-debt markers, #endif, and namespace-close trailers. Remove
the explanatory comment on writeGotStub's DIR64 write; the same
rationale (why the slot must hold the preferred-VA form, and why the
base-relocation pass was moved after lazy-stub writes) is already
captured in the fix(relinker) commit message and PR description.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
2026-09-29 04:16:05 +03:00
OverkillLabs 5387aef3b7 Merge remote-tracking branch 'origin/main' into feat/kernel-libc-fixes
# Conflicts:
#	core/libs/prx/libkernel/DirectMemory/DirectMemory.hpp
2026-09-29 04:13:58 +03:00
Dean Galvin 6c98b6be58 feat(systemservice): report the SDR tone-map luminance
sceSystemServiceGetHdrToneMapLuminance was NotImplemented. Titles read
it at startup to set up their HDR tone mapping.

The presenter always outputs through a B8G8R8A8 sRGB-nonlinear swapchain,
so the display range the title has to map into is SDR: the maximum and
full-frame maximum luminance are the 100 cd/m2 SDR reference white and
the minimum is 0. A null output pointer returns
SYSTEM_SERVICE_ERROR_PARAMETER like the other getters here.
2026-09-29 13:56:45 +13:00