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/.
A record-count user word was made relocatable after only the push,
specialization and captured-word checks. When the same word also builds
a second descriptor, the relocated stage patched the first descriptor's
count and kept the second one's earlier count. A count word is now
relocatable only when it appears in exactly one binding word, like the
base word.
agc_driver_draw_relocate_user_values gains the tagging case with two
read-only bindings sharing a count, and a draw that builds two descriptors
from one count SGPR, grows that count after the relocation is learned and
checks the second descriptor's newly covered dword; a control with a count
SGPR per descriptor still relocates and draws the grown range.
Co-Authored-By: Claude Opus 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.
Record an HTILE clear's mask/value with its pending note and recorder ID.
When that write covers the HTILE and determines its ZMask/SMem bits,
expand the metadata on the GPU without a readback. Retire mask proofs
with their recorder or depth device, preserving other owners and the
bounded cache's conservative overlap invalidation.
Recognize the structured-buffer variant and carry its completion range
through preparation, upload and binding. Admit only that range while
its native owner has a pending clear, retaining color guards and
excluding these resources from dispatch and recipe caches.
Cover store-back, PM4 buffer clears, guard refusals, recorder recreation,
live owner isolation and scoped cleanup with GPU byte/wait assertions.
AI-assisted: yes
On Windows, std::tmpfile() returns NULL with errno 22 when %TEMP%
contains a character outside the ANSI code page. Thirteen more test
files still called it: the AGC async log, frame dump, PM4 replay and
recorder tests, eight AGC execution tests and the SceNet test. They
now use TemporaryFile::Open(), as #13104 did for the libc tests.
Part of #13083
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A sampled texture made from a surface whose DCC keys hold a fast-clear
code was filled on the CPU with the clear texel (FillDccClear over the
whole surface), copied into a staging buffer, copied to a tiled device
buffer, detiled and copied into the image. A target cleared every
frame and sampled while cleared repeats all of it each time.
When the texture's format is the one the clear texel is encoded in and
the texel has an exact clear value (ClearColorForTexel), the image is
now cleared with vkCmdClearColorImage instead, in the same recorder
batch the upload used. Comparison, sRGB-expand, repacked, block
compressed and register-clear surfaces keep the upload. A clear-code
cache hit never compares bytes, so such an entry keeps no snapshot.
The [textures] profile line counts these as cleared on the GPU, and
SampledTexturesCleared() reports them for the new execution test.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Queue 0's idle store wrote every pending storage image back to guest memory
in one pass once the queues had been idle for 50 ms. In a title's movies
that is about 15 upscaled 3840x2176 targets (~0.5 GB) per pass, and the
title's next flip waited ~0.6 s behind it, about every 3 s.
The idle store now writes back 4 MiB at a time, in the block units the
images already track, and stops as soon as queue 0 has queued work or
another queue is running; the rest stays pending for the next idle period.
The quiet period is unchanged.
The test returned 77 without a word on a device without VK_EXT_mesh_shader,
so tools/check_skips.py could not tell an expected skip from lost
coverage. Split the gate as the other mesh tests do and print the device
reason.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A draw found through a relocation alias (#4943) may only move user words
that the stage's SRT walk used as a base and never as a value. Two kinds of
user words that move between otherwise equal draws fell outside that:
- A buffer V# held directly in user SGPRs. Its words are values, so a move
was refused. When the V# base appears only in one read-only GuestBuffers
element of the compiled stage (the next two words equal, not in push data
other than its own forwarded slot, not in specialization constants or
captured words, and no captured run inside its range), its base and
record words are relocatable: they leave the alias key, and the relocated
stage patches that element's descriptor.
- The s_swappc target of a GCN vertex program (its fetch subroutine). It is
linked into the code, so a move was refused. Such a word is relocatable
when it feeds no binding, push word or captured word, and its alias key
hashes the callee's code (UserDataCalleeLength words at the address),
so a copy of the same subroutine elsewhere relocates and changed code
does not.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A shader whose only f64 instructions are v_add_f64, v_mul_f64, v_cvt_f64_f32 and v_cvt_f32_f64 no longer needs shaderFloat64: the SPIR-V backend emits them as exact IEEE binary64 operations on 64-bit integers (round to nearest even, denormals kept), with the same NaN rules as the native path. Any other f64 instruction still needs the device's Float64 capability.
FillDccClear wrote a cleared texture one element at a time, with one
memcpy of 4 to 16 bytes per element. A cached texture whose DCC keys
say cleared is filled this way on every upload, so a 4K RGBA8 surface
took about eight million calls. Copy the first element, then copy the
filled prefix onto the rest, doubling each time; the last copy is
clipped at the last whole element and the trailing partial element is
zeroed as before. The bytes written are unchanged.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Firmware 13.42 libSceAgcDriver.sprx answers sceAgcDriverAcquireRazorACQ,
GetPaDebugInterfaceVersion, SetHsOffchipParamDirect,
SubmitMultiCommandBuffersDirect, SubmitToRazorACQ and
SuspendPointSubmitDirect with 0x8A6D0001 and ModuleRegistration with
0x8A6D0003 for every input, like SetTargetRingForDiag.
Co-Authored-By: Claude Opus 5.5 <[email protected]>