Main now uses disk cache format30 for persisted resource plans. Stencil replay
adds artifact and binding fields, so reject that format instead of sharing its
version. Keep format31 for the combined codec and cover rejection of a format30
artifact header.
Co-Authored-By: Codex <[email protected]>
Update only dynamic reference state between replay classes so asynchronous pipeline optimization cannot switch the shader prefix within an original draw.
Co-Authored-By: Codex <[email protected]>
Preserve instance and triangle order with one dynamic-reference shader pipeline. Require bounded references, complete export coverage, replay-safe mask control and resources; refuse unsupported side effects and feedback.
Co-Authored-By: Codex <[email protected]>
A dispatch now leaves its initiator and, for DISPATCH_DIRECT, its group
counts in the shader registers, where the CP puts them.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A draw with PA_SC_AA_CONFIG.MSAA_NUM_SAMPLES > 0 and
PA_SC_MODE_CNTL_0.MSAA_ENABLE clear threw. On GFX10 and later the bit
is what makes the rasterizer use the programmed sample locations; with
it clear the draw now keeps the target's sample count with every sample
at the pixel center. Points, lines, a depth target and
alpha-to-coverage still throw.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
GPU and DRIVER need APS5_PROFILE_GPU or APS5_PROFILE_DRAW, and those switches add timestamp queries to every batch and timers to every packet, which changes the timings the panel shows. A screenshot of such a run could pass for an unprofiled one, so while either switch is on the panel now starts with a PROFILED line.
SHADERS counted the pipelines created between the first and the last present of the last second, so below 1 fps, with one present in that second, it read 0, as FPS did before. It now counts those created during the last frame there, like the other lines. The statistics test checks DRAWS, DISPATCH and SHADERS for a present alone in its second.
USAGE.md explains DRAWS, SHADERS, VRAM, RAM and RES, where each number
comes from, the count and memory formats, and what counting costs while
the overlay is hidden.
agc_performance_overlay_statistics checks the per-frame draw and
dispatch averages, the pipelines of the last second, the per-worker
packet counters across threads, the count and size formats, the order
and omission of the new lines, the RES fallback for long sizes, the
glyph bits of every line of the full panel and of the new letters, the
once-a-second sampling and that touching 64 MiB raises the private
memory. It also prints what a counted packet costs.
agc_performance_overlay draws the full panel at 1920x1080 on lavapipe
and compares every glyph pixel of every line, with nothing changed
outside the panel; reads VRAM through VK_EXT_memory_budget; checks that
a shown frame samples the memory and draws the VRAM, RAM and RES lines;
and keeps the hidden presentation bit-identical with the full panel.
The overlay gains five lines below the first ones, each shown only when
its data exists:
- DRAWS: draw and dispatch packets per frame over the last second. Each
packet worker counts them in its own counter, one relaxed load, add
and store per packet without a lock prefix, which the overlay sums
once per shown frame.
- SHADERS: pipelines created in the last second and in total, counted
where a graphics pipeline is built for a draw state the cache had not
seen and where a compute pipeline is created for a dispatch shader.
- VRAM: usage and budget of the largest device-local heap from
VK_EXT_memory_budget.
- RAM: the process's private memory, PrivateUsage on Windows and
RssAnon plus VmSwap from /proc/self/status on Linux.
- RES: the display buffer's and the swapchain's size.
VRAM and RAM are read at most once a second, and only while the overlay
is shown; hidden, the only added work is the packet and pipeline
increments. The font gains B, C, H, K, L, O, T and W. With every line
the panel is 232 pixels tall at 1080p, a fifth of the window, so it
keeps one mode.
On Windows debt_split rewrote the index and the debt files with CRLF, and resolve staged them that way when core.autocrlf is off. The files are now written through open(..., newline="\n"), which also works on Python 3.9, where Path.write_text has no newline argument.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A title may stage DCC fast-clear keys while the draw results for the surface are still pending (Bendy stages its next frame clear behind the feedback loop). The cached-texture lookup only flushed pending results when no image was cached, so a read with staged clear keys served the clear over the results the pass had drawn. The lookup now flushes at that point for staged-clear keys, reads the keys uncompressed for that read, and keeps the flushed image out of the hit view.
StagedClearSampledRead covers the case: it fails without the flush (the lookup serves without the pending results in guest memory) and passes with it.
The eager writeback default is reverted: Texture.hpp/Texture.cpp return to upstream/main, keeping deferred writeback the default. The execution tests (ArrayLayerTarget, DccKeysFirstWrite, DepthCompareCopy, ImageSrgbLoad, PendingExactSurface, StorageOneSliceAlias) return to their upstream/main state without deferred-mode branching.
The front-face VGPR was always +1.0 / -1.0, which is its form only while
FRONT_FACE_ALL_BITS is clear (current Mesa reads it with fgt 0 / fsign).
With the bit set, as Mesa 22.0 RADV programs it, a back face reads 0 and
a front face non-zero: ACO then tests it with v_cmp_lg_u32 0. Uncharted:
Legacy of Thieves Collection (PPSA05684) sets the bit and its two-sided
cloth shaders test v_cmp_lt_u32 0, so -1.0 (0xbf800000) made every back
face a front face: the insides of the menu skeleton's rags kept their
front normals and were lit white by the spot light behind them.
The pixel stage info now carries the bit (request version 26, cache and
draw keys), the decode reads SPI_BARYC_CNTL when FRONT_FACE is an active
input, and the translator turns the builtin into 0xffffffff / 0. The
exact front value is not measured (docs/dev/debt/shader.md).
AI-assisted: yes
LargestDeviceLocalHeap picks the heap that the texture cache budgets
read their VK_EXT_memory_budget numbers from. It moves out of the
anonymous namespace of ShaderResources.cpp so the performance overlay
can report the same heap.
A multisampled texture whose surface no draw has rendered to was refused.
Its samples are the guest color memory, so when that memory repeats one
32-bit value over the surface's footprint, the host target is created and
cleared to the color the value encodes, and a later draw into the surface
reuses it. Memory that does not repeat one value, an unmodeled footprint
and a value with no exact clear color keep throwing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
pr_overlap.py links each conflicting range to main at the commit it ran
on, so every push to main changes every non-empty report. The workflow
keeps a hash of each report to read the comments of changed reports
only, but with the commit in the hash every report counts as changed:
each run reads the comments of every pull request with an overlap and
rewrites its comment although only the commit differs. In one hour on
2026-10-13 it rewrote 107 existing overlap comments, against the 1000
requests per hour GITHUB_TOKEN has for the repository.
The hash and the comparison with the posted comment now replace the
commit in blob links with a fixed ref, so a report whose ranges, exports
and files are unchanged makes no request. Posted comments keep their
links pinned to the commit they were written at.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The running-executable replacement test copied /bin/sleep under the
names "running" and "leftover" and started the copy. On Ubuntu 26.04
/bin/sleep is the uutils multi-call coreutils binary, which picks the
utility from the file name of the path it was started through, not
from argv[0], so the copy printed "coreutils: unknown program
'running'" and exited, and file_writer_binary and file_writer_text
failed without ever replacing a running executable. The test now
copies its own executable and starts it with a "wait" argument that
sleeps, so it no longer depends on how a system binary reads its name.
Co-Authored-By: Claude Opus 5.5 <[email protected]>