mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-22 00:22:57 -05:00
Since #757, a T# loaded from a buffer heap at a runtime offset is an image table column, and every capture snapshots the whole heap, up to 65,536 records, even when user data or an SRT read fixes the offset. When the T#'s eight dwords and its offset are runtime values the SRT walker evaluates, the column is now selected: the offset is kept as a descriptor source, the shader indexes entry 0, and the snapshot reads only the record at the evaluated offset, with the heap base moved to that record. The column keeps a table's semantics. An invalid T#, an unmapped record or an offset that carries past 32 bits is poison that faults only when a lane selects it; an offset the walker cannot read faults the table instead of throwing; the record's mode is picked per entry, so no pipeline variant is added; and a dispatch that writes the record faults it as written by its dispatch. Dwords past the heap read zeros, as the scalar loads would, and a record past the key cap is read rather than poisoned. A column stays a whole table when its offset is chosen per lane, or when the shader may write the memory the offset is read from at run time: the buffer it is read from (by V#), or any memory when the read or a write goes through a pointer or a GPU-only descriptor. Samplers are unchanged: an S# the walker evaluates is already a direct sampler. The plan stores the selection, so the disk cache format is 36. Five agc_shader_memory and agc_shader_bindless checks asserted the old planning and now assert the selected record: - "image table SRT key": a key read through the SRT narrowed a 4-key table to records 0 and 2. It now selects record 2 alone, captures no other record, and a changed key moves the capture without changing the module or its disk key. - "image table key union" and "image table late key": two keys of one heap shared one column with two value key domains. Each key now selects its own record, as two one-record tables. - "image table unkeyed access": a read keyed through the SRT shared a whole column with a read keyed per lane. The first now selects its record; the second keeps the whole, unnarrowed table. - "uniform table image": the T# at a user data offset was one key of a full table. It is now the one selected record, and the record the user data does not select is not read. A value key domain only arises for a key the walker evaluates, so it no longer narrows an image column; key buffer domains (keys loaded per lane) still do.