Main fails linux since 24ed2d9adf: agc_driver_native_depth_aliased_depth_{depth_only,stencil,no_stencil} and native_depth_publication now refuse sampling an aliased multisample target earlier, with a message the HTILE-alias path in NativeMultisampleDepth.cpp does not expect. The parent c42e3a000c is green. Reverting so main is green again; #6973 can re-land together with the test update.
Recorded draws without BDA page tables now take the device-local staging
of written and atomic buffer elements that dispatches use; their
copy-backs are already recorded through MarkGpuWrites. A draw that ends
up synchronous with staged regions is rebuilt unstaged.
APS5_NO_DRAW_STAGING=1 keeps draws' elements in place.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
#15301 moved the sampled depth shadow onto OwnedImage::Allocate with the
VkMemoryAllocateInfo form that #10472 had already replaced, so main no
longer compiles libSceAgcDriver. Pass the image's create info as the
other OwnedImage callers do and bind at the allocation's memory and
offset.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Resolve the two conflicts in Texture.cpp: keep main's creationHandOvers
counter next to linearImportRetiles, and address the retile's tiled
side through main's new SurfaceGeometry::GuestOffset(layer, mip) in both
the direct-import and the scratch dispatch. A level-major surface does
not keep each layer contiguous, so the whole-layer check that picks the
direct import now skips it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A cached draw whose read-only inputs moved (MovedReadOnlyBuffers) snapshotted the moved inputs whatever their size, while PrepareDrawBindings binds any other input over the draw snapshot budget in place. A move whose inputs together exceed the budget is now refused, so the draw builds its resources and binds those inputs in place.
The UINT storage view for float16 image stores was chosen only when the
global binding number fell in the uint storage image slots of the main
stage. Binding numbers are stage * Binding::Count + slot, so a pixel,
hull or domain shader's slots never matched: its uint writes went to a
float16 view and the store was lost on AMD's Windows driver. The slot is
now taken from the binding number within its stage.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01VAPyfZR5GPZaWxRz67e9FT
Per sampled element a build bumped the shared [textures] counters (stage-A
records, fast hits or misses, storage hits) with an atomic add on a line every
building thread writes, although the counters are only printed under
APS5_PROFILE_DRAW; in a perf annotation of one title's worker that add was
about a tenth of precollectImages. The adds now run only when the counters
are reported.
A stage-B fast hit also copied the record's texture pointer (another atomic
reference count on the texture's control block) and dropped the record's own
copy later; the record's reference is now moved out on a hit.
A build grew its binding and allocation vectors one element at a time and
tracked occupied binding numbers in a std::set; about 3.7% of the queue-0
worker on one title's hub was allocator time inside builds. The counts are
known before the plan is walked, so the vectors are reserved once and the
binding numbers go in a reserved vector.
A build that binds BDA tables, or a fault buffer while APS5_LOOP_GUARD is
set, can never be reused (noteReusable and NeverReusable refuse it), so it
no longer copies its data words for a template refresh nor records the proof
of its sampled textures for a Revalidate (the lookup log is still cleared).
A fault-only build is reusable and keeps both. APS5_KEEP_TEMPLATE_RECORDS=1
keeps both for every build.
ShaderResources::ReadsOverlap built the whole InPlaceReads vector on every
call. recordDraw calls it once per queued store for every draw that is not
address-based (the touches predicate of AnyQueuedStore), and the queue-0
worker of one title spent about 3% of its time there (InPlaceReads, vector
growth, malloc and free under AnyQueuedStore).
GuestBufferMemory::InPlaceReadsOverlap walks the same regions (the address
space's base regions, then the build's own, each when bound in place) and
stops at the first overlap. The answer is the same as the listed ranges'.
APS5_NO_READS_OVERLAP_WALK=1 builds the list as before.