XairRrR's review: PendingChainCase draws without depth writes, so its
retire has no unstored depth. The new case draws depth 0.5 that is only
on the GPU, writes level 1 of a two-level chain over the plane, takes the
view (which retires the surface) and flushes the storage write. Level 1
in guest memory must match a run without the depth write, and level 0
must hold the drawn depth.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A sampled view that a live depth surface's plane cannot serve (another
layout, more levels) is left to guest memory when a later write retired
the surface, and refused while the surface is the last writer of its
memory. Only writes the CPU can see counted. A compute pass that writes
storage images over the plane is a later writer too, but its results
stay pending in storage images, so the surface still looked current.
Forspoken (PPSA03984) builds a 5-level R32 float chain over the memory
of its 1920x1080 D32 depth target. When it sampled the whole chain
before those results reached memory, it stopped on "sampling the depth
plane ... levels 0-4 ... is not implemented". A pending storage result
over the plane now retires the surface for such a view, as a CPU write
there does.
PendingChainCase writes level 1 of a two-level R32 float chain over a
plane with a compute dispatch and flushes it, so the chain's storage
image exists, as the title's does from frame to frame. It then draws a
D32 surface there, writes the chain again and leaves the result pending.
A two-level view must then be left to guest memory with the depth
surface retired. On main the view is refused with the title's message.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
agc_keyboard_overlay_tests now checks the message wrapping (column limit, long
words, line breaks, surrogate pairs, the dots on an overlong message), the
layout of one to three buttons at four target sizes (inside the screen, centred,
buttons in order and not overlapping, the accent border on the focused button),
a long message and a narrow target, the refusal of zero or four buttons and of
an empty target, and the storage of the dialog with the keyboard taking the
overlay from it.
On NVIDIA's proprietary driver, function arrays that live in local memory
and are read under a data-dependent branch return wrong values in
subgroups 1-3 of a mesh workgroup; subgroup 0 is correct. A wave64
geometry program whose relative addressing keeps its VGPRs in the vector
window therefore loses register writes in every wave but the first. In
the clipping geometry program of Sony's PS5 PSP emulator (PPSA07550) the
empty waves never cleared their candidate primitive slots and wrote
degenerate triangles over wave 0's, so the 3D menu drew spikes.
On that driver a mesh program's window now lives in a device-local
storage buffer of 256 workgroup slots of 65536 dwords, claimed through a
per-slot lock and released after the final barrier. The pool is created
before the first draw that uses it records anything, and its header is
zeroed in a batch of its own that is submitted and waited for; the pool
is published only after that wait, and a failure releases it. Direct
register accesses keep one function variable per register; a direct
store also writes the buffer when a buffer read can see it, relative
reads load the buffer, relative writes store only to it, and a direct
read that may follow a relative write loads the buffer and refreshes the
variable. A buffer entry is zeroed only when a buffer read can see it
before a write. APS5_NO_MESH_WINDOW_BUFFER=1 keeps the arrays.
On a host whose imports are compared instead of write-watched (Linux
lavapipe CI resolves write protection, so PrepareImportWatch picks
Unwatch), the surface is not covered by write tracking, the fast proof
stops at its write collection before the pending scan, on main as well,
and T1 is never tried. The test required the own-object refresh on every
host, so it failed there.
Each case now asks GuestMemory whether write tracking covers the
surface. Where it does, the own-object refresh is required as before;
where it does not, the set must still be proved current and keep its
view.
Co-Authored-By: Claude <[email protected]>