Videodec2 now outputs 10-bit HEVC Main 10 frames, so the HEVC picture info
takes bitDepthLumaMinus8 and bitDepthChromaMinus8 from the decoded frame
instead of leaving them 0. The Main 10 stream moves to HevcFixture.hpp so the
Vdecsw test can decode it.
Vdecsw read every decoded picture's info through Videodec2's AVC picture
info, which throws for HEVC, so an HEVC decoder failed on its first
picture. Videodec2 now hands Vdecsw a codec-independent picture header,
records whether an HEVC access unit starts with an IDR slice, and Vdecsw
keeps the AVC or the 0xb8-byte HEVC picture info for each picture.
The HEVC test stream moves to HevcFixture.hpp so the Vdecsw test can
decode it.
scePadOpen returned DEVICE_NOT_CONNECTED (0x80920007) for a special port
(type 2) since #3838, which guessed the console behaviour. A PS4 Pro on
firmware 10.71 with no special controller connected opens the special
port of any valid user and returns a handle: scePadRead on it returns one
record with connected false, scePadGetControllerInformation succeeds, and
scePadRead(-1) is INVALID_HANDLE.
Unity's PS4 input module opens the standard and the special port of a
user and keeps the pad handle only if both opens succeed; otherwise it
calls scePadRead with handle -1 every frame and the title never sees a
button. Knowledge is Power (CUSA09558) and Knowledge is Power: Decades
(CUSA12435) had no controller input for that reason.
The special port now opens PAD_SPECIAL_HANDLE, tracked apart from the
standard handle by scePadClose and scePadGetHandle. scePadRead and
scePadReadState on it return a zeroed record, scePadGetControllerInformation
and scePadDeviceClassParseData zeroed structures, and the other pad calls
reject it with INVALID_HANDLE. The standard handle still reads its own
queue, so the double read of one queue that #3838 fixed does not return.
scePadOpenExt is unchanged. The unmeasured parts are recorded in
docs/dev/debt/libScePad.md.
Co-Authored-By: Claude Fable 5.1 <[email protected]>
Measured on firmware 13.60: an address or length aligned to 4 KiB but
not to 16 KiB returns EINVAL.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Measured on firmware 13.60: the released range stays mapped with its
protection and contents, and a fixed no-overwrite map over it fails
with ENOMEM; a null or unaligned address, an unaligned length or a
range that wraps returns EINVAL, checked before a zero length, which
returns 0, as does a range with nothing mapped.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
ExpectTruncated draws with a two-sample D32 depth target. On a device
whose framebufferDepthSampleCounts lacks 2, as lavapipe, the pipeline's
existing sample count check refused that depth target before the
truncated coverage check, and the test failed. The case now reports why
it was not tested: no two-sample depth targets, or neither mixed sample
extension with truncated coverage reduction.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Measured on firmware 13.60: the first poll or wait that reports a
finished request returns its plain state and later ones add bit
0x10000, while cancel returns the plain state and does not count as a
read; a request that fails completes with state 3 and the error in its
result, and the other requests of its batch still run.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Measured on firmware 13.60: an id that is not a live request, including
one already deleted, makes poll, wait, cancel and delete return 0 and
write 0x80020003 for it; delete makes an id unknown, and cancel leaves a
finished request's state unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Measured on firmware 13.60: submits take 1 to 128 requests at priority
1 to 3, the id lists of poll, wait, cancel and delete take 1 to 128 ids,
wait takes mode 1 or 2, and sceKernelAioSetParam takes a window and a
delayed count of 0 to 128, a split flag of 0 or 1 and, with split on,
split and chunk sizes of 1 to 0x1000000; everything else returns EINVAL
without writing. sceKernelAioInitializeParam writes the console's three
default scheduling structs.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An overrasterized draw (a multisampled rasterizer into one-sample color
targets, VK_NV_framebuffer_mixed_samples) chains
VkAttachmentSampleCountInfoNV into its pipeline. When the pipeline is
linked from graphics pipeline libraries, only the fragment output library
carried it, and the link and the background link-time-optimized relink
did not. The Khronos validation layer (1.4.363) then reports
VUID-vkCmdDraw-multisampledRenderToSingleSampled-07285 for every such
draw, as it does in agc_driver_pixel_sample_coverage, and not with
APS5_NO_GPL=1, where the pipeline is built whole.
Both links now chain a copy of the sample counts.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The APS5_DUMP_IR dump showed every scalar load's immediate offset as 0.
An SMEM load keeps its immediate in the instruction's memory metadata:
MemoryFlags indexes Resources().memoryInfo, whose offset holds the
immediate plus 4 per component, while the soffset argument is the
constant 0 when the instruction has none. Buffer, address and shared
memory instructions keep their offsets there too. ProgramToString
printed the arguments, the type and the use count, but not the flags or
the metadata, so a dump could not tell 0x54 from 0x6c.
ProgramToString now appends " [pc=0x... off=0x...]" to every
instruction that carries memory metadata, and " [pc=0x... mem=?]" when
its index is past memoryInfo, since dumps run before validation. The
opcode set is one predicate, carriesMemoryInfo, which ValidateProgram
now also uses for its memory-info index check; the validator accepts and
rejects the same programs with the same messages.
https://github.com/boykopovar/AnyPS5/pull/9633#issuecomment-6349729587
Related: #9749.
OpenNative returned ENOTDIR for any path whose own attributes lack FILE_ATTRIBUTE_DIRECTORY. A symbolic link created without SYMBOLIC_LINK_FLAG_DIRECTORY that points to itself is such a path, so opendir reported ENOTDIR where FreeBSD's lookup fails with ELOOP. A reparse point without the directory flag is now followed with CreateFileW, and ERROR_CANT_RESOLVE_FILENAME gives ELOOP. Any other result keeps ENOTDIR, including a file-type link whose target is a directory.
The guest_directory symbolic link loop check, skipped on Windows, now runs there with a file-type link and a directory-type link. MinGW's std::filesystem::create_symlink does not work on Windows, so the links are created with CreateSymbolicLinkW.
Denormal mode 2 flushes only the sources and mode 1 only the result, as
measured on RDNA2 (gfx1030), also with an inline or literal constant
factor. Both need the device to keep the f32 denormals the shader keeps,
so they translate only when the module declares DenormPreserve 32 and
throw otherwise; mode 1 with another f32 rounding throws as before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
v_min_f32, v_max_f32, v_min3_f32, v_max3_f32 and v_med3_f32 follow only
bit 0 of the FLOAT_MODE f32 denormal field, as measured on RDNA2
(gfx1030): mode 2 flushes denormal inputs as mode 0 does, and mode 1
keeps them and returns a selected denormal unflushed as mode 3 does.
Mode 1 needs the device to keep those denormals, so it translates only
when the module declares DenormPreserve 32 and throws otherwise. Both
modes threw before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
v_add_f32, v_sub_f32, v_subrev_f32, v_mul_f32 and v_mul_legacy_f32
follow the FLOAT_MODE f32 denormal field with f32 round to nearest
even, as measured on RDNA2 (gfx1030): mode 1 keeps denormal inputs and
flushes a denormal result, and mode 2 flushes denormal inputs and keeps
a denormal result. Both need the device to keep the f32 denormals the
shader keeps, so they translate only when the module declares
DenormPreserve 32 and throw otherwise. The result flush now applies
when only the result flush bit is set; it was skipped unless the input
flush bit was set too. A constant factor no longer skips the tiny
product check while denormal inputs are kept, as a kept denormal times
such a constant can still be tiny. Directed rounding in these modes
still throws.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
FileFlagsRoundTrip opens kernel_fcntl_probe.bin with O_CREAT but without O_TRUNC and removes it only when every check passes. A run that aborts leaves the file behind, and every later run then fails at the FIONREAD check because the file is longer than the five bytes the test writes. The test now removes the file before opening it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GtXavMkgCTCdmRpweviHcQ
MinGW's std::filesystem::create_directory_symlink always fails on Windows, so CheckEquivalentMounts never ran its symbolic link alias there and only checked the case alias. It now creates and removes the link with CreateSymbolicLinkW and RemoveDirectoryW, as SaveDataFileWriteFailure.cpp does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GtXavMkgCTCdmRpweviHcQ
MinGW's std::filesystem::create_symlink always fails on Windows, so the readlink checks in guest_kernel_sys and the lutimes checks in guest_file_timestamps skipped their link cases there. They now create the link with CreateSymbolicLinkW and SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE, as SaveDataFileWriteFailure.cpp does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01GtXavMkgCTCdmRpweviHcQ