The binding plan refused every buffer atomic through a V# whose base is
not a multiple of 4. On RDNA2 such an atomic works when base + offset is
on a DWORD boundary and stops the dispatch otherwise, which the runtime
buffer atomic already does, so the refusal is dropped.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
PPSA03490 (Demon Slayer: Kimetsu no Yaiba - The Hinokami Chronicles) has no playgo-* files in sce_sys. Its startup code asks scePlayGoGetLocus about chunk IDs 0, 1, 2, ... and stops when it gets SCE_PLAYGO_ERROR_BAD_CHUNK_ID, appending each ID to an array. With APS5_PLAYGO_UNLISTED_CHUNKS=installed no ID ever fails, the array keeps growing and startup aborts with 'Ran out of memory allocating 5565054976 bytes with alignment 65536'. With =absent the walk ends and the title gets past its logos to the menu and intro.
AI-assisted: yes. Written with AI assistance and reviewed by me.
Sampling a native multisampled color target through a texture of
another format was refused even when the two formats store the same
bytes in the other channel order. Rush 2 and Wave Race 64 render a
3840x2160 8x target as 8_8_8_8 with the alternate component swap
(B8G8R8A8_UNORM) and sample it through an 8_8_8_8 UNORM T#
(R8G8B8A8_UNORM), and stopped on "sampling multisampled color target
... (vk format 44) as a ... texture ... guest format 56 (vk 37) is not
implemented".
For the B8G8R8A8/R8G8B8A8 pairs of the same numeric type the texture is
now the target's own image with red and blue exchanged in its component
mapping, composed with the T#'s swizzle. Other format differences are
still refused.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
sceVideodec2Decode threw when it followed sceVideodec2Flush without
sceVideodec2Reset. It now resets FFmpeg's drained decoder and decodes the
unit, keeping the pictures the flush has not returned yet.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The generated rect-list control stage gave every corner of a rectangle the
flat inputs of its first vertex, so last mode was refused for rect lists.
BuildRectListShaders now also builds a control stage that takes them from
the rectangle's third vertex when the pixel shader has a flat input, and a
draw in last mode uses it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Windows run 39061030084: agc_shader_disk_cache_large_file wrote 2 GiB in 141 s next to 1399 parallel tests (limit 120 s), and conventions_function_bodies_shard_4 timed out at 30 s on the same loaded runner. The test is now RUN_SERIAL and its hang limit is 200 s (ctest timeout stays 240 s).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
A multisampled color target with a CMASK fast clear seeds its state from
the CMASK when it is first used, and later fills of the CMASK update it.
Both read the bytes as DCC keys: 0x00 is a clear, 0xff uncompressed, and
anything else refuses ("reads as mixed"). But an MSAA CMASK nibble is
FMASK code | color code << 2 (Mesa ac_descriptors.h CMASK_MSAA_CODE), so
0xcc (FMASK cleared to fragment 0, color expanded), and the 2x and 4x
"FMASK uncompressed, color expanded" codes 0xdd and 0xee, are states with
no pending fast clear that were refused. Ruffle (PPSA68091) clears its
target's CMASK to 0xcc every frame and stopped on the refusal whenever
that clear landed before the target's first use.
The seed now reads the uniform CMASK byte (after pending writes, like the
key read) and both paths classify it by those codes: 0x00 (register color
clear, FMASK cleared) is the fast clear as before, any color-expanded code
(0xc to 0xf in both nibbles) is "no fast clear", and other codes, or bytes
that differ, are still refused.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Culprit: a03ccc6be (large cache files in chunks); failing run 39057904312.
The test used a fixed directory in the temp dir; the runners of one host
share it, so a concurrent run left a second entry behind.
Lavapipe reports no f64 DenormPreserve, so the shaders get no
DenormPreserve 64 and it may flush f64 denormals; the rows of modes that
keep them then fail with or without the recompiler change (frexp, floor,
ceil and fract of 2^-1074 on Mesa 25 and 26). As in F64FmaSubnormals,
a mismatch in those modes is reported as skipped on such a device. The
modes that flush f64 denormals are still checked on every device.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
v_floor_f64, v_ceil_f64, v_fract_f64, v_frexp_mant_f64 and
v_frexp_exp_i32_f64 ignored the FLOAT_MODE f16/f64 denormal field. On
RDNA2 (gfx1031) bit 6 clear flushes a denormal input to a zero of its
sign, so v_ceil_f64 of 2^-1074 is 0 instead of 1, and bit 7 clear
flushes the denormal result v_fract_f64 gives for a positive denormal.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A range turned unreadable must leave the next readable lease and show as
unreadable in the next lease of all ranges, the kept snapshots must not
count as a pin when the protection change waits for leases, and the
replaced range must not outlive the change.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The registry cached its lease snapshot only while a lease held it, so the
first lease taken after the others ended rebuilt the snapshot from the whole
registry: every address-based build and import refresh paid a walk of every
range and a reference to each. The registry now keeps the snapshot until the
next registry change, which drops it as before; the pin check of a mutation
drops it before counting the leases that hold a range.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
VulkanDevice::createComputePipeline, used by dispatches and the pipeline
journal's replay, had no PerformanceTimer, so a dispatch that compiles its
pipeline showed up in traces and frame timing as Driver.Dispatch time with
no slice under it. It is now Vulkan.ComputePipeline, as graphics pipeline
builds already are Vulkan.GraphicsPipeline.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
simonbbby measured four-channel 16_16_16_16_FLOAT stores through the same
8x8 cube arrays on gfx1036: they land on the BASE_ARRAY face and leave the
rest of the backing unchanged, so the debt entry no longer lists the
title's format as unmeasured.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
simonbbby measured DIM 2D image_store through 8x8 cube arrays on RDNA2
(gfx1036): 32_UINT and 32_FLOAT stores with BASE_ARRAY 0 and 6 write that
face and nothing else.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A DIM 2D image_load through a cube T# already reads texel (x, y) of the
T#'s BASE_ARRAY face (#4139, measured on RDNA1). A DIM 2D image_store to
a cube T# had no matching runtime mode and threw "image descriptor is
incompatible with the static runtime image interface". Crimson Desert
writes a 16_16_16_16_FLOAT cube this way from a compute shader.
A mip-less image_store to an image the program only stores to now takes
the same face mode, writing texel (x, y) of the BASE_ARRAY face, the
face the measured load reads. Stores were not measured on hardware; the
debt entry says so. Formats that store through a conversion (SINT) keep
throwing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An implicit-LOD or gradient sample with a texel offset through an
unnormalized S# was refused at bind time with "unnormalized guest sampler
is used by an implicit-LOD sample". PPSA01317 aborts on boot on such a
pixel image_sample_o. The base-level path already samples these through
OpImageSampleExplicitLod with LOD 0, which Vulkan allows for unnormalized
samplers, but it dropped the offset. It now adds the offset to the
coordinates in that branch, as the explicit-LOD offset fold does, so a
sampler whose uses also include offsets takes the base-level path. A
normalized S# keeps the offset operand.
AI-assisted: yes
On Linux the kernel maps each PT_LOAD from the start of its first page.
When a segment begins inside the page that holds the end of the previous
segment's zero-filled memory, that page is mapped again from the file, and
the bss tail reads whatever bytes precede the segment in the file. Nuvio
Max'd 0.5.27 (PPSA99288) keeps a mutex there and crashes at launch.
A segment whose page would read wrong bytes is now appended to the output
with that page prefix rebuilt from the segments below it. Outputs whose
pages already read right are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The flattened SRT, the BDA page table and the image table map are filled
by the host and only loaded by the shader, but they were declared as
writable storage buffers. A program that also stores through device
addresses then gives the driver no way to know those loads are not
aliased by its stores, so every descriptor read stays a separate load.
Crimson Desert's largest compute program reads the flattened SRT 12,362
times; with the decoration NVIDIA 595.99 creates its pipeline in 90 s
with a 4.3 GiB peak, against 200 s and 10.6 GiB.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A scissor whose top-left corner lies past its bottom-right corner passes
no pixels; RADV writes such a viewport scissor whenever a viewport lies
outside the application's scissor, and radeonsi encodes its empty GFX12
scissor that way. PSSwanStation (PPSA99248) draws through one and
stopped on the throw.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
MXGP 26 (PPSA30839) opens TCP sockets with libkernel's socket() and
later closes them with sceNetSocketClose. libSceNet only looked in its
own socket table, so every one of those closes failed with
SCE_NET_ERROR_EBADF and the host socket stayed open. On the console both
calls work on the same kernel sockets.
A descriptor libSceNet does not own but libkernel has open as a socket
is now closed through libkernel's close(). Anything else still fails
with EBADF. The fallback runs after g_mutex is released, because
libkernel's close() first asks libSceNet's socket closer, which takes it.
guest_sce_net closes a libkernel TCP socket with sceNetSocketClose,
checks that libkernel no longer has it open, and checks that a second
close fails with EBADF.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Dusklight (PPSA99305) aborts on main as soon as its Select disc image
item is chosen: SDL's file dialog probes "zenity --version" through
posix_spawnp, and posix_spawnp throws "process creation not implemented".
FreeBSD 11.4's posix_spawn returns the error of the child's exec, and
an exec of a program that is in no directory of PATH (_PATH_DEFPATH
when PATH is unset) fails with ENOENT. Both calls now return ENOENT
without writing the process ID when the program is not in the guest
file system, and keep throwing when it is. SDL then reports the file
dialog as unsupported and the title stays on its menu.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Link's Awakening for PS5 (PPSA99670) imports both and does not load
without them. They wrap the host directory stream that opendir
already holds, under the stream's lock.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
FreeBSD's freeifaddrs is a plain free of the list, and Doom 3 BFG
(PPSA99313) releases the list with free. The list came from host malloc,
so the guest free stopped on an unregistered allocation; it now comes
from the application heap, and freeifaddrs returns it there.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A 64-thread compute kernel (23 dwords) stores pattern[i % 4], the pattern
in s4..s7, to dword i of a 4-byte-stride buffer for every i below
min(launched threads, s8, num_records), with the group id in s9.
PPSA01317 fast-clears its render-target DCC keys with it every frame. As a
plain dispatch its writes had no known value, so every key read of those
targets waited for the GPU under the GPU mutex.
The dispatch still runs as before. When it stores one repeated key code,
its keys are noted in the key-store memo right after the dispatch is
recorded, as a buffer fill of keys already is; the memo answers only while
the dispatch's own write note is the newest over the range, so any later
writer still makes the read wait. The key codes come from KeysFillMemo, as
for the memory-value fill kernel.
AI-assisted: yes
The relinker job ran its 182 tests one at a time: 233 s on windows-latest, most of it Python tool tests. The full windows job already runs the same tests with --parallel 4.
Co-Authored-By: Claude <[email protected]>
A dynamic-mip storage image reserved four mip slots, so a compute shader
whose T# spans more levels failed with "runtime storage image mip capacity
exceeded". PPSA01317 hits it on boot with a 512x512 surface of ten levels
and aborts. An RDNA T# addresses at most sixteen levels (4-bit BASE_LEVEL
and LAST_LEVEL), so a dynamic-mip image now reserves sixteen slots, and a
typed storage heap holds 64 elements so four such images still share one
class. Heap arrays keep their compact length. The runtime ABI goes to 14,
so existing shader caches are invalidated.
AI-assisted: yes