Commit Graph
6138 Commits
Author SHA1 Message Date
Ruzi 4f16f7c020 feat(libkernel): implement sceKernelAioPollRequests 2026-10-09 23:02:39 +03:30
Hannah Lyons eb20ba1aaa feat(libc): implement __fpclassifyf 2026-10-09 15:30:00 -04:00
Karan Vora 719f003adf perf(shader): compute v_dot2_f32_f16 in f32 outside the special cases
v_dot2_f32_f16 rounded a.x * b.x + a.y * b.y + c once, computed with f64
TwoSums and round-to-odd. GeForce GPUs run f64 at 1/32 or 1/64 of the
f32 rate, which made it cost about 44 v_fma_f32 on an RTX 4060.

The f16 products are exact in f32, and the correctly rounded sum of
three f32 values only needs f32: two TwoSums, a round-to-odd sum of
their errors and a final add (Boldo and Melquiond, "Emulation of FMA and
Correctly Rounded Sums: Proved Algorithms Using Rounding to Odd",
IEEE TC 57(4), 2008), with round-to-odd emulated by stepping an even
rounded sum one ulp toward its error. With finite inputs, c zero or at
least 2^-100 and a result between 2^-100 and 2^127, every value involved
is zero or a multiple of 2^-123, so no driver flush can reach it. Other
inputs, and zero results, take the f64 lowering in a branch.

New test agc_driver_f32_dot2_rounding checks random, cancelling and tie
cases against an exact fixed-point sum, and the NaN, infinity and zero
rules.
2026-10-09 15:29:37 -04:00
Dean 8b393b6e9a Merge pull request #759 from Celegans12/feat/agc-guarded-null-pointers
feat(agc): implement deferred faults for reads through null SRT pointers
2026-10-10 08:06:47 +13:00
Dean d93bc7763c Merge pull request #1004 from Celegans12/perf/agc-staging-pool-reuse
perf(agc): pool device staging buffers by size class
2026-10-10 08:06:32 +13:00
Dean d2612fb586 Merge pull request #1411 from Celegans12/perf/agc-heap-mirror-runs
perf(agc): skip unchanged heap mirror runs and idle mirror sweeps in address-based builds
2026-10-10 08:06:17 +13:00
Dean 05ba7f746a Merge pull request #1410 from Celegans12/perf/agc-imported-heap-mirrors
perf(agc): release a heap mirror once a host import serves its range
2026-10-10 08:06:03 +13:00
Dean 2af96d1863 Merge pull request #1085 from Celegans12/fix/agc-host-heap-budget
fix(agc): throw instead of aborting when a heap mirror cannot be made
2026-10-10 08:05:48 +13:00
Dean 00dbf93742 Merge pull request #1489 from Celegans12/fix/agc-merged-range-past-import
fix(agc): copy an imported range once a merge extends it past its import
2026-10-10 08:05:33 +13:00
Dean 0c8d5356d7 Merge pull request #1480 from awake-devel/fix/cond-wait-recursive-mutex
fix(libkernel): release every level of a recursive mutex during a cond wait
2026-10-10 08:05:19 +13:00
Dean 87e773689e Merge pull request #1478 from awake-devel/fix/guest-signal-delivery
fix(libkernel): keep ymm upper halves across a redirected raise
2026-10-10 08:05:04 +13:00
Dean fffb830363 Merge pull request #1477 from awake-devel/fix/current-cpu-in-guest-mask
fix(libkernel): report the current CPU within the thread's guest affinity
2026-10-10 08:04:50 +13:00
Dean ae3d5f95a0 Merge pull request #2414 from oneandonlydean/ci/build-on-current-main
ci(build): build pull requests merged into current main
2026-10-10 07:39:43 +13:00
Dean Galvin 4a53177bc5 ci(build): build pull requests merged into current main
GitHub refreshes merge_commit_sha only when the pull request's branch
changes, so a manual build could test the pull request against a main
from days earlier. Each job now checks out main as it is when the build
starts and merges the pull request head into it.
2026-10-10 07:36:18 +13:00
MathiasDevelopesandClaude Opus 5.5 d5721f34b2 feat(libScePsml): build libScePsml from the libScePsml_debug source
Titles that link the release module libScePsml.prx failed to start
because no host library had that name; PPSA25344 links it. libScePsml
and libScePsml_debug are now built from the same source.
scePsmlMfsrGetDispatchMfsrPacket1000, which PPSA25344 imports, is
added without an implementation.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 20:25:55 +02:00
Pouare514 998016e789 fix(libs): drop stubs now owned by main after rebase 2026-10-09 20:13:56 +02:00
Pouare514 c67189fdee fix(libs): export host-colliding runtime names via _nid_postfix 2026-10-09 20:12:46 +02:00
Pouare514 eafeecda82 fix(libs): coexist with main's Http impls, drop Net stub owned by Net PR 2026-10-09 20:12:46 +02:00
Pouare514 b6c70b1135 fix(libs): rename loader stubs to recomputed real names, drop clashing ones 2026-10-09 20:12:31 +02:00
Pouare514 e96ec6da7d feat(libs): Deathloop loading support (Ampr, NetCtlApDialog, Party + stubs) 2026-10-09 20:11:35 +02:00
Karan Vora 8a578128b2 perf(shader): convert v_cvt_pkrtz_f16_f32 from the native nearest-even conversion
With the 16-bit RoundingModeRTE, DenormPreserve and
SignedZeroInfNanPreserve guarantees, convert each value to the nearest
half with OpFConvert, convert the half back to f32 and, when it is
further from zero than the source, step its bits one toward zero. That is
the toward-zero half for every finite value, including subnormal results
and 65504 for values from 65520 up; infinities and the quiet NaN with
the high payload bits are kept. Other devices keep the integer
conversion.

New test agc_driver_f16_pack_toward_zero checks every half, its f32
neighbours and the midpoints to the next half, with both signs.
2026-10-09 14:11:02 -04:00
MathiasDevelopesandClaude Opus 5.5 7142b6e76f feat(recompiler): convert f32 to f16 natively when the device rounds 16-bit floats to nearest even
The integer emulation of the round-to-nearest-even float-to-half
conversion is exact but costly: a compute shader with about 3600
conversions never finished compiling on NVIDIA. When the device enables
shaderFloat16 and guarantees shaderRoundingModeRTEFloat16,
shaderDenormPreserveFloat16 and shaderSignedZeroInfNanPreserveFloat16,
it advertises Float16, RoundingModeRTE and DenormPreserve, and the
recompiler emits OpFConvert under the 16-bit RoundingModeRTE,
DenormPreserve and SignedZeroInfNanPreserve execution modes instead.
NaNs keep the emulated quiet NaN with the high payload bits. Devices
without these guarantees keep the emulation.

Graphics validation accepts the RoundingModeRTE, DenormPreserve and
SignedZeroInfNanPreserve execution modes for 16-, 32- and 64-bit floats,
so vertex and pixel shaders with a native conversion still draw.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 14:11:02 -04:00
Pouare514 4a6775c389 fix(tools): stubgen imports NID scheme, fixes libkernel TD path 2026-10-09 20:08:56 +02:00
Pouare514 85720b9b57 fix(tools): stubgen uses real names plain, runtime postfix, TD lines 2026-10-09 20:07:07 +02:00
Pouare514 ddca247c0d fix(tools): stubgen emits throwing stubs only, no comments 2026-10-09 20:07:07 +02:00
Pouare514 e8e308fc23 feat(tools): generate Export.cpp skeletons from missing NIDs 2026-10-09 20:07:07 +02:00
Gerard L.andClaude Opus 5.5 b6a9530723 fix(agc): use gfx1013's smaller mip tail limits for 8 and 16 bpp SW_64KB_Z_X
The smallest mip levels of a tiled surface are packed together into one
block, the mip tail. A size limit decides which level is the first to
go into the tail.

For SW_64KB_Z_X, AnyPS5 used the same limit as the other 64 KiB modes.
In addrlib, that is only the case on Navi10. On every other GFX10 chip,
including the PS5's gfx1013, addrlib halves the limit for 8 and 16 bpp
Z_X surfaces: the width at both sizes, and also the height at 8 bpp.
The setting behind this is dsMipmapHtileFix (see HwlConvertChipFamily
and ComputeSurfaceInfoMacroTiled in gfx10addrlib.cpp).

With the larger limit, the tail started too early. For example, a
256x256 R8 surface with 9 levels started its tail at mip 1 instead of
mip 2, and took 131072 bytes instead of 196608. Every level was then
read and written back at the wrong offset.

GetMipTailLayout now halves the limits the same way. Only the level
where the tail starts changes; the tail slot positions stay the same.
This follows addrlib's setting for gfx1013. The console's own layout
has not been measured.

Fixes #1590

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 20:06:51 +02:00
Karan Vora 3a16e5e54e perf(shader): round v_cvt_pknorm and v_cvt_pk_u8 in f32
v_cvt_pknorm_i16/u16_f32 rounded |x| * 32767 or 65535 to nearest even
with a 64-bit integer product, variable 64-bit shifts and a sticky bit.
In f32, p = |x| * scale is the f32 nearest to the exact product, so
roundEven(p) is the answer unless p is exactly k + 0.5, where the sign of
the exact error fma(|x|, scale, -p) decides. Lanes that select a
constant (NaN, |x| >= 1) multiply 0 instead.

v_cvt_pk_u8_f32 truncated with the saturating conversion and rounded the
fraction by hand; it is now roundEven(x) between the 0 and 255 clamps,
NaN giving 0, read without the f32 denormal flush.

New test agc_driver_f32_pack_rounding: 563,232 inputs around every
rounding tie, checked against the exact product in double.
2026-10-09 14:05:07 -04:00
Nahuel Genchi 230625e080 fix(libc): return ENOMEM from posix_memalign for sizes the default heap rejects 2026-10-09 15:03:07 -03:00
Archit Dewan 4a5cd6e40b fix(ajm): reject ATRAC9 gradients beyond decoder bounds 2026-10-09 13:53:46 -04:00
MarcZX100 49887893a4 test(hmd): register disconnected-device tests 2026-10-09 17:47:28 +00:00
MarcZX100 bcaccb6e20 test(libkernel): set pthread test timeout by platform 2026-10-09 17:46:21 +00:00
MarcZX100 74a7a4ab05 test(libkernel): register pthread start coverage 2026-10-09 17:46:21 +00:00
Karan Vora 42692dee11 perf(shader): fold the denormal flush into f32 compares against constants
When f32 denormals are flushed, v_cmp_*_f32 compares flush(a) with
flush(b). With one operand a constant, the flush of the other operand
can go into the compare: a denormal and its flushed zero compare the same
way with a NaN, an infinity or a normal constant, and comparing flush(x)
with a zero is comparing x with +-2^-126 (flush(x) < 0 is x <= -2^-126,
flush(x) == 0 is |x| < 2^-126, and so on, the unordered forms alike).

emitFloatCompare reads both operands unflushed, finds a constant operand
after its abs/neg modifiers, mirrors the predicate when the constant is
first, and emits one compare. Two registers, f16 compares and modes that
keep f32 denormals are unchanged. New test agc_driver_f32_compare_constant
checks all 12 predicates against flush(a) op flush(b).
2026-10-09 13:38:56 -04:00
MarcZX100 d809ccf797 test(libc): cover getcwd zero-size buffer 2026-10-09 17:38:45 +00:00
Hannah Lyons 7d130d1b4b test(libkernel): check getdents errno on success and closed descriptors 2026-10-09 13:30:45 -04:00
Hannah Lyons d6963f46d6 feat(libkernel): implement getdents and getdirentries 2026-10-09 13:30:45 -04:00
Karan Vora b7df8884ff perf(shader): saturate f32 to integer conversions once
The translation of v_cvt_i32/u32/flr_i32/rpi_i32_f32 and v_cvt_i16/u16_f16
already maps NaN to 0 and clamps the value into range before
ConvertS32F32/ConvertU32F32, and the backend truncated it again and
repeated the NaN and range selects on the result. Those IR ops have no
other producers, so the backend now emits one OpConvertFToS or
OpConvertFToU, and EmitF32ToU32 and EmitTruncF32Value, which had no
other users, are removed.

The translation drops its FPTrunc32, as the conversions round toward
zero, and the selects whose constant the conversion of the clamped value
already gives. v_cvt_i32_f32 and v_cvt_u32_f32 read their source without
the f32 denormal flush: a denormal truncates to 0 either way.
2026-10-09 13:28:39 -04:00
authurtabo-byte ce66d2688e fix(libSceAudioOut): allow state queries during output waits 2026-10-09 10:24:31 -07:00
authurtabo-byte f8b9b04dd1 fix(libSceSaveData): accept 32 MiB save memory 2026-10-09 10:24:30 -07:00
boykopovar f8c2f07246 Merge pull request #2388 from boykopovar/ci/pr-intake-minimum-20
Ci/pr intake minimum 20
2026-10-09 20:16:52 +03:00
boykopovar e6e92e7402 refactor(ci): simplify pr intake closure message 2026-10-09 20:16:05 +03:00
Daniel Radosa 1414b27d29 feat(libkernel): implement seteuid and setegid
The guest process is assumed to run as root. Under FreeBSD's
sys_seteuid and sys_setegid, id 0 is then accepted without a privilege
check and changes no credential, so both return 0. Any other id would
change the effective credential, which is not modelled, and throws.

Part of #1578.
2026-10-09 19:14:02 +02:00
boykopovar 9a03dad6fb ci(prs): require 20 merged prs for pr intake 2026-10-09 20:12:52 +03:00
boykopovar 0fdda7be94 Merge pull request #2374 from boykopovar/ci/reject-newcomers-pr-task
ci(prs): close prs from new contributors while intake is paused
2026-10-09 19:49:29 +03:00
krishnarayaandClaude Opus 5.5 dffd449489 fix(shader): give 10_10_10_2 integer vertex inputs an integer type
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-09 12:49:25 -04:00
boykopovar af39aac1a2 ci(prs): close prs from new contributors while intake is paused 2026-10-09 19:46:43 +03:00
husari.orozco 1c6e53b9bf ci(conventions): exempt cmake/SystemDeps.cmake from the system-dependency rule 2026-10-09 10:46:35 -06:00
Celegans12 fcc5105aeb fix(shader): count folded draw offsets once in the vertex and instance indices
When the embedded vertex fetch adds the base vertex or start instance
user SGPR to the index VGPR, the driver folds that SGPR into the draw's
first vertex and first instance. v5/v8 were gl_VertexIndex and
gl_InstanceIndex, which already include it, so the translated add
counted it twice, on direct draws and CPU-path indirect records alike.
The entry of a vertex or local program now subtracts the folded SGPR's
user data word from the builtin, which gives the zero-based indices the
hardware has. A record drawn in place on the GPU keeps the CPU's word,
so the fetch analyzer counts the SGPR as shared unless the fetch add is
the only reader of v5/v8 and the SGPR (no earlier access or EXEC write,
no carry, clamp, second add or other write of the SGPR); such records
take the CPU path. The fold moves into Driver::FoldDrawOffsets,
ClassifyIndirectDraw becomes public for the test, and the env switches
that skipped the fold go.
2026-10-09 18:41:51 +02:00
Joey Fisher f00c2f2d16 fix(recompiler): apply the S_BFE_U32 width when the vertex fetch scanner folds constants 2026-10-09 10:37:40 -06:00