The fragment shader interlock entry said drivers other than RADV and an
RTX 4090 were not measured. With the GPL exclusion for interlock pipelines
removed locally and every draw fast-linked (APS5_NO_PIPELINE_LTO=1),
agc_driver_pixel_interlock kept its read-modify-writes in 120 of 120
runs, 12 at a time, on a Radeon 860M with AMD's Windows driver and on an
RTX 5060 Ti; RADV lost them in 108 of 120.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Follow the capture policy requested in #10753 and #10760. Keep queue callers running, record loss markers and totals, and disable failed output without relying on stream exceptions.
AI-assisted: Codex
Remove the extra blank line between capture trace output and frame capture. The independent changes in #11157 may merge in either order; the second branch keeps both entries when rebasing.
AI-assisted: Codex
Wait for the writer to take a batch instead of throwing when the pending queue is full. Add a controlled-sink test with four producers and check that records stay complete and ordered.
AI-assisted: yes
- ImportMappedRanges: main's `replacing` structure, with UnwatchHookLocksGpu in place of AnyPendingOverlaps.
- markLayersPending: main's `!layerPending.AllIn(first, count)` block around this branch's pendingMiss bookkeeping and captureGuestBytes(&unsaved, true). With every unit already pending, that bookkeeping changed nothing, so skipping it keeps the behaviour.
- writeBackWindows: no unit shadow destination when the stored span is not watched or the image is at most SmallStoreBytes.
- Tests: agc_storage_pending_after_unwatch and agc_unwatch_hook_lock_order move to tests/cmake/agc_driver_recorder_tests.cmake.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Capture costly compute builds and restore matching recipes after checking
full recipes, driver fingerprints and Vulkan compatibility keys. Add size
and time thresholds, opt-out, atomic persistence and corruption/rejection
fallback.
Remember below-threshold recipes in separate files so competing decisions
cannot overwrite captured binaries. Prefer saved binaries and retry
capture when the time threshold is lowered.
Cover compatibility, fallback, deterministic competing writers and
cross-process capture, restore and corruption.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The replay kept the newest APS5_PIPELINE_JOURNAL_ENTRIES entries of
either kind, so compute pipelines used up the bound meant for the
graphics pipeline store, and the entries left out were not reported.
Graphics entries now count against that bound alone, compute entries
against APS5_PIPELINE_JOURNAL_COMPUTE_ENTRIES (1024); each kind keeps
its newest entries in record order, and a line says how many of each a
replay leaves out.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The label read trap skipped every image sharing a page with another
pending image. Large tiled images are never stored at a label, so an
image inside one no longer counts as sharing. A store of an image over a
trapped one now stores the trapped one in the same flush, and an
eviction or explicit write-back stores the trapped images inside it
first.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The trap was released when FlushPending took the image out of the pending
registry, before it waited for GpuMutex, so a read in between saw the old
bytes; cache eviction and explicit write-backs did not release it at all.
Every store now releases it in writeBackLayers: after recording the GPU copy
into the import, or before the first CPU access on the CPU path, which also
releases the traps of other images on the same pages. A trapped image is
stored whole, and direct memory mapped at a second address is not trapped.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Before a label, a pending linear or small storage image that shares no page
with another pending or storing image now gets a write-watch read trap
instead of its store. The first access to its pages stores it through the
host-read hook; any other store releases the trap first.
APS5_NO_LABEL_READ_TRAP=1 keeps the store at the label.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The conflict in core/libs/prx/libSceAgcDriver/CMakeLists.txt from #12862's split is resolved with tools/agc_test_split.py resolve, which moves this PR's test registrations into tests/cmake/.
The conflict in core/libs/prx/libSceAgcDriver/CMakeLists.txt from #12862's split is resolved with tools/agc_test_split.py resolve, which moves this PR's test registrations into tests/cmake/.
The conflict in core/libs/prx/libSceAgcDriver/CMakeLists.txt from #12862's split is resolved with tools/agc_test_split.py resolve, which moves this PR's test registrations into tests/cmake/.
1_5_5_5 color targets: shadPS4 and KytyPS5 also render the format as
A1R5G5B5 with red and blue exchanged. STENCIL_CLEAR_ENABLE without a
stencil plane: KytyPS5 drops the clear too, fpPS4 leaves it to a host
depth format without a stencil aspect.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Main comes in through #9533's main merge 071ca5b609, which keeps
#9533's resolution; this branch carries #9533 but not #9742.
Beyond keeping both sides:
- CMakeLists.txt:3150-3154: agc_driver_native_depth_buffer_clear joins
the branch's set_tests_properties lists, which also carry
agc_driver_native_depth_stencil_view.
Beyond keeping both sides:
- CMakeLists.txt:3149-3153: agc_driver_native_depth_buffer_clear joins
the branch's set_tests_properties lists for the native depth tests
(and the WIN32 list) instead of main's own line that re-lists clears
and clear_refusals; the properties are the same.
- NativeMultisampleDepth.cpp:1153-1170: main's two
completionCandidate && fault == ClearFault::None blocks sit around
ArmHtileDepthClear inside the branch's ClearSource::HtileDispatch path,
where the branch moved that code; the fill paths make no HTILE clear
candidate.
- NativeMultisampleDepth.cpp:2556: main's --buffer-clear call passes
ClearSource::HtileDispatch, the parameter the branch added to
CheckDepthTarget.
Conflicts: GuestArena.hpp/.cpp keep both sides' exports; GuestBufferMemory.cpp keeps this PR's run-list createBackingImport and resolves importStaysWatched's shared-backing check through the run resolver (sharedBacked), replacing main's BackingFile/sharedBacking; the debt file keeps this PR's sparse-import entry and main's presentation entry.
Co-Authored-By: Claude Fable 5.1 <[email protected]>