The NeighbourCopied case returned Missed as soon as the surface image was
live with nothing pending, although its result had not reached guest
memory yet. It now waits until the result is pending or stored, as
HoldPending does, and only a stored result is a miss.
Fixes#6383
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Since 682b07eb0, an image whose dword 3 wasn't captured is poisoned
(OutsideSnapshot). A record selected past the end of its heap reads
nothing there, so it was poisoned instead of selecting a null image, and
agc_shader_bindless and agc_driver_image_table failed after the merge of
main. A scalar buffer load returns zeros past the end of the buffer, so
those dwords now count as read zeros, and the dwords the selection reads
count as captured. Every other path keeps main's rule.
The guest reader took a module's import modules only from 0x61000045,
the PS5 needed-module tag. PS4 modules list them in 0x6100000f
(DT_SCE_NEEDED_MODULE), so every import of a PS4 module had no library
and bound to any guest export with its NID. In the libc.prx and
libSceFios2.prx that Until Dawn (CUSA02636) bundles, a libc.prx import
then bound to libSceFios2.prx, and the conversion failed with "Cyclic
guest initialization dependency: libSceFios2.prx".
The reader now also reads 0x6100000f, with the same layout (module ID
in bits 48-63, name offset in the low 32 bits). A module that has both
tags fails with "Guest module mixes PS4 and PS5 needed-module tags".
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The headless device is replaced by the windowed one at window attach and then only
lingers for in-flight workers, but it parsed its own full copy of the cache file.
It now starts empty (it still merges what it compiles into the file). Load reuses
the file buffer as the initial data instead of copying it, and save() writes the
live data directly when the file still carries the header this object loaded or
wrote, skipping the read-back and the merge cache.
Use the registered application allocator and the source-backed alignment/size signature. Add callback ownership and failure checks; record unmeasured console behavior.
Git for Windows 2.56 (runner image 20261002) moved from mingw64 to ucrt64,
so the fixed SSL_CERT_FILE path no longer exists and the WinLibs CMake
fails the FFmpeg download with status 60 on every Windows build. Take the
bundle from whichever of ucrt64 and mingw64 exists.
Co-Authored-By: Claude <[email protected]>
The kernel maps a dma-buf import's pages for the GPU at the first submission that uses it. On RADV
that took about 2 s for a 3 GiB import, in the second frame of Hades (PPSA03355), and its staging
pool ran out while the frame was held.
Linux now makes the settle queue from #6060 when the device imports dma-buf memory, and settles
every dma-buf import of 1 MiB or more right after it is made with settleImport's 4-byte copy. The
settle queue needs neither the GPU mutex nor the main queue's work to finish. A dma-buf import's
buffer is shared with the settle queue's family instead of aliased, since a sparse import is bound
to many memory objects. Where the sparse queue already takes that family, the settle queue is a
second queue of it.
A guest S# with FILTER_MODE min or max and an anisotropic XY filter
threw "combines a min or max reduction with anisotropic filtering",
which stops High on Life (PPSA15388) in its home base. It now decodes
to a Vulkan sampler with both anisotropy and the reduction mode, as a
weighted-average anisotropic S# already does. RADV programs the same
S# for such a Vulkan sampler.
Tamalero's gfx1030 measurement on #5156 covers a sample without
derivatives through a 2x anisotropic S# over a single-level texture:
min or max with anisotropic bilinear returns the bilinear minimum or
maximum, and min with anisotropic point the point result. The
execution test checks the bilinear case on the host GPU; the debt
entry records what is not measured.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A flush stores a storage image's pending results to guest memory and
keeps the 64 KiB blocks the write tracker shows written since the image
was last in sync. An address-based dispatch marks the pages it stored to
only when its batch's completion runs. A flush between the GPU's store
and that completion found the blocks unwritten and stored the image's
older texels over the newer bytes; a CPU-resolved indirect dispatch then
read those texels as its workgroup counts.
FlushPending now looks for an unfinished batch that writes the range or
holds it in an address-based lease (Recorder::PendingWriterSerial).
Batches that already finished are completed first. If the writer is
still unfinished, the flush finishes the in-flight batches up to it, or
syncs when the writer is in the open batch, so its marks land and its
blocks are kept. Inside a completion action it does not wait. If the
wait throws, the images it took stay registered as pending.
The test stores an image, then a global dword into the image's memory,
and flushes the image twice: once with the writer's batch finished on
the GPU but its completion not run, and once with the writer still in
the open batch. Each time the dword is kept and a texel in another block
is stored. Without write watching the in-flight case is skipped; the
open-batch case still runs, as the write-back then compares guest
memory, which the GPU has not written yet at the flush.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
readGpuTiming runs after the batch's fence, so every timestamp the batch
wrote is already available. It still passed VK_QUERY_RESULT_WAIT_BIT, so a
timed range whose end stamp was never written (a BeginGpuTiming whose
EndGpuTiming did not run) made vkGetQueryPoolResults wait forever on the
reaping thread under APS5_PROFILE_GPU or a performance trace. Without WAIT_BIT the call returns
VK_NOT_READY and the batch's timings are dropped, as other failures are.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Q8tinbP1MUpUaDsbNWnGnu
Restore world-to-listener matrix construction instead of rejecting
non-default orientation, translation or flags.
- Build an orthonormal row-major matrix from position, orient_front
and orient_up; apply the right-handed axis flip for flag 1.
- Store the negated dotted translation in each matrix row.
- Validate unknown flags, invalid or non-finite input, short
orientation axes, and unrepresentable translation without changing
the output.
- Preserve finite velocity and positive finite sound speed.
- Update NGS2 geometry tests and the libSceNgs2 technical debt note.
AI assistance: yes
A DISPATCH_INDIRECT read on the GPU took its group counts unchecked. A count
buffer that a skipped producer never wrote (PPSA08427: 0xffffffff left by
skipped depth-plane passes) launched up to 2^32 groups and kept the GPU busy
until the title hung. The CPU path already refuses counts above
maxComputeWorkGroupCount.
- Recorder::RecordDispatchArguments copies the three counts from the import
into a 12-byte indirect buffer with a one-thread kernel
(DispatchArguments.comp), all three 0 when one exceeds the device limit, as
RecordMeshArguments does for mesh indirect records.
- VulkanDevice records the dispatch from that buffer; without the kernel the
import is read directly, as before.
- agc_driver_indirect_dispatch_limit: 0xffffffff groups run nothing, one group
still runs.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Q8tinbP1MUpUaDsbNWnGnu