Raise the pinned ImageResource field count and the minimum image record
size for the new field, and move the disk format to 34.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
A 3D image access bound to a 1D T# matched no runtime image mode and threw
"image descriptor is incompatible with the static runtime image interface"
(SONIC SUPERSTARS, PPSA06888, which reads a 1x1 1D T# as 3D with a plain
image_sample and an image_load). Add a 1D mode for 3D accesses whose only
uses are image_sample_lz, plain image_sample or mip-less image_load.
Measured on RDNA1 (RX 5700 XT, gfx1010) with the hardware oracle:
image_sample_lz reads the texel u selects and ignores v and r with every
addressing mode; a plain image_sample takes its texel and LOD from u alone;
image_load reads the x texel for any y when z is 0 and returns zero for any
other z, as the 3D-on-2D load measured in #2023 does.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QQNVXyqeecpyneonkYL6H1
fcntl on a guest socket handled F_GETFL and F_SETFL only and failed every other command with EINVAL, so libcurl's fcntl(fd, F_SETFD, FD_CLOEXEC) on a new socket failed (ProsperoRadio PPSA99001, traced by screamm on #4796). Record FD_CLOEXEC per socket descriptor: F_SETFD sets or clears it, F_GETFD reads it, SOCK_CLOEXEC sets it at creation, and dup, dup2 and close start without it, as FreeBSD's kern_fcntl and kern_dup do.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
The full run of agc_driver_recorder_tests (no arguments) was the only
section of the binary no ctest test covered: the registered entries
run the -only flags, which skip the main flow from readTrackingTests
through drawSnapshotPatchTests. Both failures that kept it off the
run are resolved on main: the (w) import window and (s) stale
generation sections now check generations around the storage image's
own import (433302be), and the lavapipe partial publish copy is
preserved when device writes reach the write watch (60f12c88).
Run on a Radeon RX 9070 (RADV, Mesa 26.2.4), Linux 7.2: 3/3 pass,
0.5-0.9 s per run; the full run joins the existing
agc_driver_recorder_tests entries in the same CMake block.
Since registered shaders are prepared in the background, a draw whose shader
was registered just before could wait seconds for its preparation inside the
queue worker. Under CPU load Goat Simulator 3's first submissions took ~3.7 s;
the title treated the GPU as hung, stopped submitting, and its 10 s garbage
collection timeout crashed it on every launch. Driver::Submit now waits for
the preparations queued before it, on the submitting thread, before the
commands reach the GPU.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Taken from #4722 (Kena: Bridge of Spirits, PPSA01802): its point-light
shadow maps are 128x128 D16 cubes read through an R16 view in a 64 KiB Z
swizzle, whose block holds 256x128 texels of 16 bits, so each detiled
row is 512 bytes and each face 64 KiB instead of 256 bytes and 32 KiB.
Face 0 comes from the live surface, faces 1-5 from guest memory.
A 32x32 D16 depth surface read as a six-face cube through a depth-bits
R16_UINT view: its faces are narrower than a 64 KiB block, so the
texture's linear slices are 16384 bytes, not the plane's 2048. Face 0
comes from the live surface, faces 1-5 from guest memory. The draw
helper now sizes its color target with ColorTargetLayout so the small
target is accepted.
The plane copy laid its staging buffer out as tight slices while the
detiler writes the guest's linear layout, which pads rows and slices: a
32x32 D16 cube in a 64 KiB swizzle has 16384-byte slices, not 2048, and a
128x128 one has 512-byte rows and 64 KiB slices. Each region in record
now takes the layer's LinearLayerOffset plus the mip's linear offset and
its pitch as the row length, for both the slices copied from a live
depth surface and the ones detiled from guest memory. The staging buffer
grows to the padded size, keeping the buffer it replaces alive for
copies already recorded, and a mismatch says which geometry it saw.
With libSceNet sockets on ordinary descriptor numbers (#4391), a title
that makes a libSceNet socket non-blocking with plain fcntl(F_GETFL) and
fcntl(F_SETFL, O_NONBLOCK) reached File::Fcntl, whose classification
throws for a socket. libSceNet now registers a status control with
libkernel, like its option setter: F_GETFL returns O_RDWR with the
socket's non-blocking flag, F_SETFL sets it through SO_NBIO, as fcntl
already does for libkernel sockets. ProsperoLight (PPSA99002) stopped
here on Linux.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017WeVmjnnPPKdxVTpr2Vjtw
The NID RvID8BVeg+g, declared as sceSaveDataUnknown_RvID8BVeg for
Minecraft (PPSA17221), hashes to sceSaveDataPrepareForTransferring. The
name is not in aerolib; it was found by combining words from the
libSceSaveData names that are. Behaviour is unchanged: it still throws,
now naming the real function.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_017WeVmjnnPPKdxVTpr2Vjtw
With GE_CNTL.BREAK_WAVE_AT_EOI clear, the instances of a tessellated draw share
hull threadgroups: the relative patch index counts on through the instances,
while the host's PrimitiveID restarts with each one. The local stage now passes
its draw-relative instance (InstanceIndex - BaseInstance) to the hull, which
numbers its patches instance * patches-per-instance + PrimitiveID before taking
(mod PRIM_GRP_SIZE) mod NUM_PATCHES. Instances that start a threadgroup anyway
(BREAK_WAVE_AT_EOI, or patches per instance a multiple of the group) keep the
per-instance PrimitiveID.
This replaces #4201's refusal of a hull or domain that uses its relative index
as data while BREAK_WAVE_AT_EOI is clear, and builds on its decode of the bit
(breakAtInstance, request serialization and draw keys).
- Hull and domain cache keys hold the patches per instance instead of the bit;
an indirect draw recompiles its hull and domain for each record's instance
count.
- The device enables shaderDrawParameters when available. Without it, a hull
using its relative index as data in such a draw is refused, as is a domain
doing so (passing the instance on to the domain is not implemented).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
lstat of a Windows symbolic link threw, although symlink creates links
with relative targets on Windows and readlink reads them. Report such a
link as S_IFLNK with its own identity and times and the length of its
target as st_size, through the reparse reader readlink already used,
now shared from libkernel. Links with absolute targets, junctions and
other reparse points still throw, as for readlink.
The trace summary line keeps `trace_dropped` as before: true when any
thread lost a slice, any thread's totals table was full, or the gpu
track was full. When it is true, the line now also carries
`trace_dropped_threads`, one entry per affected thread name, so the reader
can tell which thread lost data and how much. Threads that share a
name, such as the shader prepare threads, share one entry: losses are
summed, the earliest fill is kept and totals_full is true if any is.
Each entry has `events_full_after_s`, the seconds from the first
present of the window to the start of the first lost slice. It is
absent for `gpu` and in every summary line (windowed frames/seconds
and APS5_TRACE_SUMMARY_EVERY) whenever the first lost slice starts
outside the line's span of presents, including a slice whose scope
began before the window opened or one lost after the last present.
`events_lost` is the number of slices not recorded and is absent when
0; in interval lines it counts the buffer's losses since it started.
`totals_full` is true when the thread's totals table overflowed, which
makes the summary numbers incomplete; a thread with only `events_lost`
has complete totals.
The Chrome trace gets a `trace buffer full` instant event on a thread
at the point where its buffer filled.
BUILD.md documents the new fields and the event.
`trace_dropped` is unchanged, and when nothing drops the default output
is byte-identical to before.
Refs #5786
Depends on #5808
Both tests build a range one chunk above udmabuf's size_limit_mb. When the limit is set very high (for example to its maximum, as a workaround for a dma-buf import larger than the default 64 MB), that range is petabytes and mmap fails: agc_host_import_sparse stopped with 'cannot reserve the guest range' and agc_driver_sparse_dma_buf_import with 'cannot map the backing file'. The driver does not take the sparse path for such a limit either, so there is nothing to test; both now skip, which ctest reports as skipped.