mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-10-23 09:03:22 -05:00
A descriptor whose dwords come from two scalar buffer loads of the same record, where one load's offset carries an immediate addend, was refused because the column wanted one offset expression and one buffer node for every dword. The column now peels an immediate addend off each read's offset and compares effective offsets (memory offset plus addend) and the remaining base expressions, and accepts distinct buffer nodes that are equivalent. Dword 0 keeps its offset expression, so columns that were already planned are planned the same way. Folding a second load into the first changes where its offset wraps: at a dynamic offset of 0xfffffff0, a second load at +16 wraps to the start of the buffer, while the folded read lands past 4 GiB. A column folds a load only when its addend is no smaller than dword 0's and its immediate is small, and it records dword 0's addend and the largest extra addend. A record whose offset would carry past 32 bits between the two loads is not read and becomes OffsetCarry poison. PPSA26344 pixel shader 0x8000296000 reads T# dwords 0-3 with an s_buffer_load_dwordx16 at key * 0x88 and dwords 4-7 with an s_buffer_load_dwordx4 at 48 + key * 0x88. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>