Skip to content

fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer - #9969

Open
EagleBearerYS wants to merge 36 commits into
boykopovar:mainfrom
EagleBearerYS:fix/shader-nested-table-child-key
Open

EagleBearerYS wants to merge 36 commits into
boykopovar:mainfrom
EagleBearerYS:fix/shader-nested-table-child-key

Conversation

@EagleBearerYS

@EagleBearerYS EagleBearerYS commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What

With #9790, Marvel's Spider-Man 2 (PPSA03016) gets past ReadConstBuffer@pc=0x8fa0. It then stops at 135 s, later in the same compute shader (hugodearaujo's run, RX 9070 XT, RADV):

compute shader 0x11e2b40f00: GetImageResource dword 0 is not a valid runtime value; chain: ReadConstBuffer@pc=0x00009a50(GetBufferResource(LoadAddressU32@pc=0x00009a3c(GetAddressResource(Phi(Phi(…

The shape (his IR, block $398):

Two refusals, one per commit, both on #9790's head:

  1. fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer.
    • The T# at the runtime offset already plans as an unkeyed nested child.
    • The refusal falls on the S#. The key's data read goes through a second handle on the same V# words, which fix(shader): plan several T#s read through one pointer-loaded V#, keeping the V# real for their other uses #9790 keeps refusing (TryMakeTableColumn's nested branch, DescriptorWordReads).
    • This commit takes such a word as a child key, under these conditions:
      • it's a scalar read through a sibling handle, at an immediate offset;
      • no store or atomic goes through any handle on the V#'s words;
      • every use of the word ends in the offset of a T# or S# read through the same V#;
      • that offset is stride * key + addend, with key one of (word >> s) & m, (word & m) >> s, word >> s, word & m or word. s and m are constants, and the stride is a constant multiple of 4.
    • The materializer reads the word from the child buffer itself, zero past num_records as the hardware load returns, and maps only that record and key 0. If the word's page is unmapped or has a pending write, it maps the whole child, as other key domains do.
    • The bound: min(num_records / stride, maxKey + 1) records, so at most 65,536 for a 16-bit field, within feat(shader): resolve nested image tables through runtime pointers #7223's caps.
    • Past the bound: a key the dispatch reads differently from the snapshot faults with "outside the key domain". A key past num_records reads a null T#, as the load does.
    • Still refused: a key built from two child words, a key word at an offset taken from another child word, a store through the V# into its own buffer, a key word that also feeds the output, and deeper nesting.
  2. fix(shader): take a T#'s words as an uncaptured arm of a pointer-loaded V#'s record pointer. This is the game's own text.
    • With the +0x4c0 T#'s words on one edge, the V#'s pointer walk refused (TryMakeIndirectColumn / PointerRecordReads).
    • A merged V# pointer now goes through PointerRecordPairs, the edge-paired walk that pointer-keyed T#s already use. Its new arm kind skips a T# or S# word like a constant.
    • The child is looked up by the actual 64-bit pointer, which the snapshot never captures for such an arm. So a lane that takes the arm faults with "outside the snapshot" instead of reading a T#.

Not claimed: hugodearaujo's dump predates #9907, so it prints every scalar load's immediate as 0x0. The real offsets of the key word and the S# aren't known, and the tests use nonzero ones.

Cost:

  • Planning: one use-chain walk per sibling read, plus a scan for stores through the V#.
  • Snapshot: one guest word per distinct child V#, and two mapped records instead of up to min(num_records / 32, 65536) T#s.

FormatVersion 46→50: KeyDomain gains three fields.

fix(shader): count an image-table snapshot's read ranges in the resolution memo footprint (d01f290): resolutionFootprint now adds 4 words per read range (readRanges) of each table and nested table, as ColumnRecords::Footprint() does, so a resolution whose read ranges exceed the memo budget isn't memoized. main's resolutionFootprint leaves out the same term.

Tested

A limit found on the way, not fixed here: on llvmpipe, a read through a V# whose words come from an unmapped record pointer crashes instead of reporting the fault. llvmpipe does this for any scalar BDA load that misses, and the files that emit those loads are main's, unchanged by #9790 and by this PR. #9790's limits describe it, with its unmapped-pointer probe faulting through the image table on an NVIDIA GPU instead.

Overlap:

Checklist

yabanana and others added 30 commits October 17, 2026 18:48
…mers

A T# read from a nested child table stayed a runtime read when one of
its words also fed another instruction. That read goes through a V#
that exists only in the snapshot, so the dispatch read a garbage
address; lavapipe crashed in the shader. The nested branch now refuses
a child whose descriptor words are used by anything but equal handles,
as it already does for a V# with another consumer.

(cherry picked from commit 0df7d32)
An S# read from a V# that a scalar record selects through a pointer
was refused, so recompiling failed with "GetSamplerResource dword 0 is
not a valid runtime value". The nested branch now takes sampler
columns: they get child tables per distinct V# like nested T#s, share
equal children, count against the nested key budget and the S# entry
budget, and fault on an unmapped, non-buffer or uncaptured parent. The
plan decoder accepts a nested sampler column; the plan encoding is
unchanged.
An S# or T# loaded through a pointer that a scalar record holds was
refused when a Phi merged the pointer's low word with constants, so
recompiling failed with "GetSamplerResource dword 0 is not a valid
runtime value". Such a column is now pointer-keyed: the snapshot
captures every record's pointer and the descriptor behind it, the map
holds boykopovar#7223's sorted pointer dictionary with descriptor records as its
codes, and the GPU looks up the actual 64-bit pointer. A pointer that
was not captured faults as outside the snapshot, and a null one as
unmapped.

The plan gains TableColumn::pointerKeyed and the snapshot gains
ImageTableColumnSnapshot::pointerKeyed, so the disk-cache format moves
to 43 and the image-table ABI to 4.
A T# loaded through a record pointer whose low word passes nested Phis
was refused when one Phi arm held a word of a Ballot lane mask, as in a
waterfall loop that reuses the pointer's SGPR for an s_and_saveexec or
v_cmp mask, so recompiling failed with "GetImageResource dword 0 is not
a valid runtime value". A pointer-keyed column now accepts such a word
as an arm that is not a record pointer, as it does for constants, and
still refuses any other foreign arm. At run time a pointer built from a
lane mask is not a captured pointer and faults as outside the snapshot.

A pointer-keyed column also accepts low-word reads, and a high-word read,
of the same record word under different keys: same table, record offset,
stride and addend. The GPU looks the pointer up by its value, so the key
does not matter there. The column takes its table and record offset from
the high-word read, which dominates the descriptor load.

A shader that planned before plans the same way, so the disk-cache
format stays at 43.
…ed record pointer

A T# loaded through a record pointer was still refused with "GetImageResource
dword 0 is not a valid runtime value" when the pointer's low word passed
ANDs with lane masks, as a waterfall loop that copies EXEC into the
pointer's SGPR builds them, or when its high word was a Phi of the
record's high word read under several keys.

For a pointer-keyed column, the walk of the low word now takes an AND
with a lane-mask operand (a Ballot word, or an AND or Phi of only Ballot
words and immediates) and keeps walking its other operand, so its
record reads must still match the column and anything else still
refuses. The high word is walked the same way: its record reads must
be the record word at the low word's offset plus 4. A high word that is
one read still gives the column its table and record offset, as before.
Otherwise the table comes from a record read whose V# words are defined
before the descriptor load, and the record offset from the high word,
which the GPU does not read for a pointer-keyed column.

A high-word arm read from another buffer, such as one whose V# is
loaded through a pointer, stays refused. A shader that planned before
plans the same way, so the disk-cache format does not change.
… a pointer-keyed record pointer

A T# loaded through a record pointer was still refused with "GetImageResource
dword 0 is not a valid runtime value" when a Phi of the pointer's low word
merged the record read, a zero, and the waterfall's lane mask with the
handled lane's bit cleared, BitwiseAnd32(CompositeExtractU32x4(Ballot(...), 0),
BitwiseNot32(ShiftLeftLogical32(1, index))), as s_ff1, s_lshl and s_not with
s_and, or s_andn2, build it in the SGPR the pointer reuses. The walk took only
Ballot words and ANDs of them as lane masks, so it walked into the NOT and
refused.

A lane-mask operand is now a Ballot word or the loop's lane bit, a shift of 1
by an index from FindILsb32, FindUMsb32 or ReadFirstLane (through the AND,
add, subtract and select that s_ff1_i32_b64, s_bitset0 and the shift's own
mask put around it), or an AND, OR, NOT or Phi of only those and immediates.
An arm of the pointer that is entirely such an operand is skipped. An AND
with a record read in it still has the read matched against the column, and
anything else still refuses.

agc_driver_pointer_phi_lane_not_table builds that shape in a wave64
waterfall: the low word's Phis merge the record read at +0, a zero and the
lane mask without the handled lane's bit, cleared by s_not and s_and and by
s_andn2, and the high word is one read at +4. Each lane samples the T# of its
record, and every masked word faults outside the snapshot.
agc_driver_pointer_vsharp_select_table reads a record keyed by
ReadFirstLane(SelectU32(LogicalAnd, IAdd32, Phi)), a pointer from it, a V#
through the pointer and the T# through the V#; it passes without this change
and keeps that chain checked, including a record pointer moved to the other
V# without a recompile.

Shaders that planned before plan the same way, and a refusal is never cached,
so the disk-cache format does not change.
…keyed records

A pointer-keyed record pointer now also takes lane-mask ANDs, the
waterfall loop's lane bit and its OR and NOT forms, and a high word
merged from the record's next word. A high word read from a second buffer
stays refused.
The low and high words of a pointer-keyed record pointer were walked
separately, so a high-word arm on a path whose low word is a lane mask
refused the plan even though that pair is no pointer. Ratchet & Clank:
Rift Apart (PPSA01474) stops this way at LoadAddressU32@pc=0x9a30: one
high-word arm reads a second buffer, and on that edge the low word is a
lane mask, the waterfall loop reusing the SGPR pair.

Walk the two words together. Where both are Phis of one block, each
low-word edge takes the high word of the same predecessor. An edge whose
low word is a constant or a lane mask is skipped with its high word. A
record low word still needs every high word it can meet to be a constant,
a lane mask or the same record column at offset + 4, so a second-buffer
high word paired with the record word stays refused.

agc_driver_pointer_phi_high_second_lane_table adds the lane-mask low word
to the second-buffer arm: it plans, each group samples the T# its record
selects, and that arm faults outside the snapshot.
…nter

The two words of the pointer are now walked edge by edge, and an edge
whose low word is a constant or a lane mask is skipped with its high
word. A high word read from a second buffer stays refused on an edge
whose low word is the record word.
Brings boykopovar#8991 (match image-table T# halves offset before and after
readfirstlane).

ResourceTracker.cpp: main's FirstLaneOffset, ParseFirstLaneOffset and
SameFirstLaneOffset go before TryMakeTableColumn, which keeps this
branch's signature with the buffer parameter. Main's first-lane base
check in the column loop merged on its own.
…ane-masks

Brings boykopovar#7395's merge of main bd4d801, with boykopovar#8991. It merged without conflicts.
TryMakeIndirectColumn refused every pointer hop once the record's
pointer words were merged, so a T# read through a pointer loaded from a
pointer-keyed record pointer stayed unplanned (Gran Turismo 7's World
Map compute shaders, issue boykopovar#6191). Only buffer handles still refuse hops:
the materializer keys the records by the innermost pointer before it
follows the hops, and the plan's parent pointer is that innermost one.
…one-key child

From hugodearaujo's change on boykopovar#8939 (Marvel's Spider-Man 2, PPSA03016).
Spider-Man 2's shape: a record keyed by a first-lane read, its dwords
2-3 a pointer, a V# loaded at that pointer plus 0xa0, and the T# read at
offset 0 or 0x40 of that V#'s buffer with no second key. Two records
point at V#s of different T#s; a moved record pointer and a moved V#
must change the result without recompiling.
…andles as nested children

Marvel's Spider-Man 2 (PPSA03016) stops at 131 s on boykopovar#9457 in a compute
shader whose record pointer, at dwords 2-3 of a waterfall-keyed record
with its low word merged by a Phi with a constant, leads to a V# that two
GetBufferResource handles read: a T# at offset 0 and a T# at 0x4c0, each
sampled. The nested branch of TryMakeTableColumn refused the first T#
because the V#'s words also fed the second handle, whose reads belong to
the other T#.

A parent V# whose word reads feed several GetBufferResource handles is
now accepted when every other handle has the same words and its uses are
only reads whose users are T# or S# descriptor handles. Each descriptor
plans its child column from its own handle; both walks reach the same
reads, so the parent interns to one source, the materializer reads its
records once (NestedColumn takes them from Column()), and each child
keeps its own offset. A handle with any other use still refuses, and a
sibling descriptor that cannot be planned still refuses the shader, as
its words are not runtime values.

T# or S# words that have other users stay refused. Planning keeps those
reads in the program: PlanTableColumnPass marks a read planning-only only
when every user is a planned handle (ResourceTracker.cpp:1770-1781). But
they read through the V# handle, whose arguments Run() replaces with the
column offset and the parent pointer words (:154-160), and whose own word
loads become planning-only once every handle over them is planned, so
LoadAddress emits nothing for them (SpirvMemoryInstructions.cpp:599-601).
The kept read would address a V# that only the snapshot holds. Allowing
those uses in this shape, where the second T#'s dwords 0 and 1 reach the
pointer registers on one edge before a later s_load, crashes lavapipe in
the dispatch. Taking it needs that V# kept alive for those reads: an
unrewritten copy of the handle and real loads of its words through the
record pointer.

Shape from hugodearaujo's IR on boykopovar#8939 (issuecomment-6340144242).
…d other instructions

Marvel's Spider-Man 2 (PPSA03016) still stops at pc 0x8fa0 with the
shared-V# planning alone: its shader moves dwords 0 and 1 of the second
T# read through the pointer-loaded V# into the record pointer's
registers, so those reads have Phi users. The nested branch of
TryMakeTableColumn refused that T#, and the first T# with it, because
the sibling handle's reads were not only descriptor words.

d132754 added the refusal after such a read crashed lavapipe: the
read stayed in the program but went through the V# handle that Run()
rewrites to the column offset and parent pointer words, while the V#'s
own word loads became planning-only and were not emitted, so it read a
garbage address. A planned nested child's T# or S# read with other
users now goes through an unrewritten copy of the V# GetBufferResource.
PlanTableColumnPass keeps a read real while any planned handle using it
has a use that stays real, so the V#'s four loads through the record
pointer are emitted for the copy, and the descriptor handles still take
the snapshot. No kept read goes through a rewritten handle, so the other
users read the guest's V# and descriptor words at dispatch.

The copy needs the V#'s words to be loads through the record pointer
that the program emits. Any other V#, and a data read through a handle
on the V#'s words, remain refused.

The shared-V# reuse test now checks both T#s per group and the word the
later s_load reads behind T#2's dwords 0 and 1, which the test backs
with a snapshot at that address. The T# and S# consumer cases that
d132754 refused now check the real descriptor word. A data read
through a third handle and a T# consumer whose V# comes from a keyed
table record stay refused.

Shape from hugodearaujo's IR on boykopovar#8939 (issuecomment-6340144242).
… the same buffer

Marvel's Spider-Man 2 (PPSA03016) on boykopovar#9790 stops at 135 s in compute
0x11e2b40f00 at ReadConstBuffer@pc=0x9a50, a T# read through a
pointer-loaded V# at (word >> 16) * 32, where the word is a data read
through the same V#, next to an S# read through that V#. hugodearaujo's
run: boykopovar#9790 (comment)

On boykopovar#9790 the T# plans as a nested child with an unkeyed domain, but
the S# is refused: the key read's handle shares the V#'s words with the
S#'s handle, and DescriptorWordReads takes only descriptor words, so the
S# falls to GetHandle and its dword 0 is not a valid runtime value.

A sibling read is now taken as a child key word when it is a scalar
read at an immediate offset through a rereadable V# and its uses only
reach the offsets of T# or S# reads through the same V#, as
scale * ((word >> s) & m) + c. The key read keeps its handle and the
V#'s loads, so the dispatch reads the guest's word. The T# or S# column
gets a child key domain (offset, shift, mask): the snapshot reads that
word from each child buffer and maps only the entry it selects.
possibleU32Bits follows a right shift by a constant, so the child table
spans at most min(num_records / stride, the key's range), 65,536
entries for a 16-bit field. A key the dispatch reads differently from
the snapshot faults outside the key domain, and a key past num_records
reads a null T#, as s_buffer_load_dwordx8 does past num_records.
A store through a handle on the V#'s words, keys from two words or from
a word at a runtime offset, and other data reads through the V# stay
refused.

KeyDomain gains child, shift and mask, so the shader disk cache format
moves to 50.

The test reads a key word at 0x14 and an S# at 0x20 of each child
buffer and checks keys 2, 5, 17, 30 and 47 (the last of the V#'s 48
T#s), both S#s, a moved record pointer, null T#s for keys 48 and 65535,
a fault for a key the dispatch reads differently from the snapshot, and
the refusals above.

This does not make the title pass: the same IR also merges the 0x4c0
T#'s dwords 0 and 1 into the record pointer, which stays refused here.
…ed V#'s record pointer

In hugodearaujo's IR for Marvel's Spider-Man 2 (PPSA03016), compute
0x11e2b40f00 reloads the V# at pc 0x9a3c through a record pointer whose
two words are Phis: record dwords 2 and 3 on most edges, and dwords 0
and 1 of the T# read at 0x4c0 through the same V# on the edge from
$353. boykopovar#9790 (comment)

The T# read at ReadConstBuffer@pc=0x9a50 through that V# is refused
with "GetImageResource dword 0 is not a valid runtime value", whatever
its offset: TryMakeIndirectColumn walked a merged V# pointer with
PointerRecordReads, which takes only the record read and constants on
the low word, and it needed the high word to be the record read itself.

A merged V# pointer now goes through PointerRecordPairs, the edge-paired
walk that a pointer-keyed T# already uses, and a word read as part of a
T# or S# is a pointer-free arm there, like a constant or a lane mask.
The child is looked up by the actual 64-bit pointer, so that arm, which
the snapshot never captures, faults outside the snapshot when a lane
takes it instead of reading a T#. The record reads on every edge must
still be one read per word for a V#.

The test samples the T# at 0x4c0, moves its dwords 0 and 1 into the
record pointer under a condition, reloads the V# behind that Phi, and
reads the key word, the T# at the key and the S# through it, as the IR
does. It checks the three reads per lane with the arm not taken, and a
group that takes the arm faulting outside the snapshot. That last run
replaces the key read with a constant: a data read through a V# loaded
from an unmapped pointer crashes lavapipe on boykopovar#9790 as well, as its
shared-V# reuse shader does with an unmapped record pointer.

On boykopovar#9790, and with the previous commit alone, the test is refused with
the text above. This does not claim the title passes.
@github-actions github-actions Bot added the unblocks title Names a title ID on the Unblocks line label Oct 23, 2026
@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 907 core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 1368 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 1395 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 1896 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 2434 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 4072 core/shader/recompiler/Recompiler.cpp
PR 5021 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 5315 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
PR 5371 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 5431 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 5609 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 5925 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 5941 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 6009 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 6010 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 6044 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6182 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6185 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6186 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6187 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6192 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6209 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6235 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
docs/dev/debt/shader.md
PR 6249 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6280 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 6300 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6412 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/ResourcePlan.hpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/shader.md
PR 6481 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp
PR 6488 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/ImageTableAbi.hpp
core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/ControlFlowInfo.hpp
core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/ResourcePlan.hpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 6501 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6539 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 6612 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 6642 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6743 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6808 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6820 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6858 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 6905 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6921 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6924 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/shader.md
PR 6959 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/shader.md
PR 6970 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 6973 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6987 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6989 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 6995 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7002 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7048 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7085 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 7201 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 7275 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7307 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7310 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7392 docs/dev/debt/shader.md
PR 7410 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 7457 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7464 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7484 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 7508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7514 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7522 core/shader/recompiler/Recompiler.cpp
PR 7550 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 7604 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7622 core/shader/recompiler/ShaderDiskCache.cpp
PR 7677 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7684 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp
core/shader/recompiler/IntermediateRepresentation/include/IntermediateRepresentation/IrMetadata/ControlFlowInfo.hpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/shader.md
PR 7689 core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 7694 core/shader/recompiler/Optimization/src/ResourceTracker.cpp
PR 7705 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 7922 docs/dev/debt/shader.md
PR 7942 docs/dev/debt/shader.md
PR 8004 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 8014 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8077 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
docs/dev/debt/shader.md
PR 8089 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8105 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8160 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8161 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8246 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8276 docs/dev/debt/shader.md
PR 8277 docs/dev/debt/shader.md
PR 8281 docs/dev/debt/shader.md
PR 8365 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8374 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
PR 8403 docs/dev/debt/shader.md
PR 8406 docs/dev/debt/shader.md
PR 8410 docs/dev/debt/shader.md
PR 8425 docs/dev/debt/shader.md
PR 8450 docs/dev/debt/shader.md
PR 8458 docs/dev/debt/shader.md
PR 8484 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8542 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8592 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8639 docs/dev/debt/shader.md
PR 8707 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8716 core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 8735 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8874 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8887 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 8898 core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
PR 8998 core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 8999 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9020 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/shader.md
PR 9046 docs/dev/debt/shader.md
PR 9049 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
PR 9176 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9177 core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
PR 9183 core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 9188 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9193 core/shader/recompiler/Recompiler.cpp
docs/dev/debt/shader.md
PR 9243 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9248 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9287 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9289 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9335 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/shader.md
PR 9348 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9356 core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 9387 core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 9401 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9402 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9424 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9443 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9445 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9495 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9508 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 9521 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9626 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9671 core/libs/prx/libSceAgcDriver/CMakeLists.txt
docs/dev/debt/shader.md
PR 9685 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9696 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9700 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9702 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9703 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9712 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9723 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9737 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9743 docs/dev/debt/shader.md
PR 9746 docs/dev/debt/shader.md
PR 9748 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
docs/dev/debt/shader.md
PR 9779 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9789 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9852 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 9875 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9879 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9889 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
docs/dev/debt/shader.md
PR 9890 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9892 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9897 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 9898 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9899 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 9957 core/shader/recompiler/ShaderDiskCache.hpp
PR 9989 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 10026 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10046 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10049 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 10062 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10141 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10150 core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp
PR 10164 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10193 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/ImageTableAbi.hpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
core/shader/recompiler/SpirvBackend/src/SpirvImageEmitter.cpp
PR 10194 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10228 core/shader/recompiler/Optimization/src/ResourceTracker.cpp
PR 10233 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
docs/dev/debt/shader.md
PR 10333 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10351 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
PR 10359 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 10382 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10388 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10423 core/libs/prx/libSceAgcDriver/CMakeLists.txt
core/shader/recompiler/Recompiler.cpp
PR 10440 core/libs/prx/libSceAgcDriver/tests/execution/ImageTable.cpp
core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
core/shader/recompiler/Optimization/src/ResourceTracker.cpp
docs/dev/debt/shader.md
PR 10442 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10443 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10472 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10473 core/shader/recompiler/Recompiler.cpp
PR 10492 core/libs/prx/libSceAgcDriver/CMakeLists.txt
PR 10496 core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
core/shader/recompiler/Recompiler.cpp
core/shader/recompiler/ShaderDiskCache.cpp
core/shader/recompiler/ShaderDiskCache.hpp
PR 10497 core/libs/prx/libSceAgcDriver/CMakeLists.txt

@MarcZX10

Copy link
Copy Markdown
Contributor

One integration point to coordinate before merge: this branch is based on #9790’s cache version 46 and advances it to 50, while open #10000 independently advances current main from 44 to 49. The changes can be sequenced, but the cache format number must remain monotonic and unique after rebasing the later branch (if #10000 lands first, #9790 and this stack need cumulative version bumps; if this stack lands first, #10000 must bump beyond 50). Please include #10000 in the version-order plan and validate the resulting format number against the merged base. This is sequencing feedback, not a request to close or drop either PR.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found a cache-budget accounting gap in the new nested snapshot path. NestedColumn copies the parent descriptor readRanges and appends a range for each distinct child buffer; the indirect-buffer path also records a descriptor range per captured pointer. CopyRecords retains those ranges in ImageTableColumnSnapshot, and ResolutionMemoEntry stores the table snapshots. However, resolutionFootprint() counts map words, codes, descriptor words, and pointer words, but not table.readRanges.

These are 16-byte pairs, so omitting them undercounts by four 32-bit words per range. With up to 524,288 parent keys and up to 524,288 child buffers, the retained ranges can add roughly 16 MiB to an entry beyond the ResolutionMemoWords estimate. The LRU can therefore retain more than its declared 8M-word budget, especially across its four variants per shader. Please either include retained read-range storage in the footprint (and add a boundary regression) or avoid retaining ranges in resolution memo entries if they are not part of the cache key/result. This is a memory-bound issue introduced by the new nested-table path, not a queue-size concern.

I also checked pointer-map construction/search ordering, nested-key limits, decode validation, snapshot hashing, cache serialization and the SPIR-V lower-bound lookup; I found no additional confirmed issue. Current-main diff and conventions checks pass. Hosted eligibility, intake, conventions, labels and report pass, while native product jobs are skipped. I could not run the image-table runtime tests locally because this workspace has no matching build/test executable; the PR's reported Linux/Windows and validation-layer results remain author-reported.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 23, 2026
@EagleBearerYS

Copy link
Copy Markdown
Contributor Author

@MarcZX10 Thanks, the order is already set so that either one can land first. #10000 moves FormatVersion to 49, and this stack moves it to 50, past #10000's. Both stay above main's current 45.

Both PRs' Depends on and Overlap lines will say this. The readRanges accounting is a real gap, and a fix with a boundary test is in progress. main's resolutionFootprint leaves out the same term.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 23, 2026
@EagleBearerYS
EagleBearerYS marked this pull request as ready for review October 23, 2026 12:58
…ution memo footprint

ImageTableColumnSnapshot keeps its read ranges, four words each, and
ColumnRecords::Footprint already counts them. resolutionFootprint did
not, so a resolution memo entry could hold more than ResolutionMemoWords.
Count them for the tables and the nested tables.

The plan round trip now resolves a nested fixture's snapshot twice with
2^21 read ranges on a table, then on a nested table: four words each
fill the memo budget, so the entry must not be kept.
@BKlaasWerkman

Copy link
Copy Markdown

Windows run on NVIDIA and Intel.

Windows 11 Pro 10.0.26300, WinLibs GCC 15.2.0 r7, Release. NVIDIA GeForce RTX 3060 Ti (driver 617.42) and Intel Arc Graphics (Meteor Lake, Xe-LPG, driver 101.9150), selected with ANYPS5_GPU. Head 7588a53 merged into main 938812d (clean merge). ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation (1.4.363); no was not found but was requested line.

Tests: the 1260 that tools/select_tests.py select picks for the PR's files, compared per test with a full run of the same main on the same GPU. That includes the stack's 20 new agc_driver_nested_* and agc_driver_pointer_* tests.

this PR compared with main
RTX 3060 Ti 1253 passed, 4 skipped, 3 failed same 3 failures (agc_driver_sample_order trio, #9056); all 20 new tests pass; no new VUID-
Intel Arc 1229 passed, 26 skipped, 5 failed same 3 failures (#10126, #8604, and #10199's intermittent one); 18 of the 20 new tests pass; no new VUID-

The two new tests that fail on Intel Arc are the sampler ones from #7395's commits:

  • agc_driver_nested_sampler_table: lane 0 is 0x3e800000, expected 0x427d0000
  • agc_driver_pointer_phi_sampler_table: lane 0 is 0x427d0000, expected 0x3e800000

These are the same two lines as on the UHD 770 with ANV in #7395, which Capmare traced to Gfx12 EU fusion (Mesa issue 16622, fixed in Mesa 25.3). Intel's Windows driver shows it too; details on #7395. Nothing else in this PR differs from main on either GPU.

AI-assisted: yes (Claude Code)

@EagleBearerYS

Copy link
Copy Markdown
Contributor Author

Thanks, @BKlaasWerkman, a per-test comparison with main on two GPUs under the layer is the check this stack needed on Windows. It's in the Tested section now. The two Intel failures are #7395's sampler tests, and yours is the first run showing them on Intel's Windows driver; until now we had them only on Mesa's ANV before 25.3. I'll note that on #7395.

@EagleBearerYS

Copy link
Copy Markdown
Contributor Author

@BKlaasWerkman thanks for both runs. One small follow-up on the two Intel Arc failures, if you have a minute: could you rerun just those two on the same build and GPU, with APS5_SPANNED_WAVE=1 set?

ctest --test-dir build -R "^agc_driver_(nested_sampler|pointer_phi_sampler)_table$" --output-on-failure

On ANV that switch made both pass (Capmare's runs on #7395), so the result tells us whether Intel's Windows driver fails for the same reason.

@BKlaasWerkman

Copy link
Copy Markdown

@EagleBearerYS rerun done on this PR's build: head d01f290 merged into main 938812d, same Intel Arc (Windows driver 101.9150), ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1:

agc_driver_nested_sampler_table agc_driver_pointer_phi_sampler_table
default fails 3 of 3 (lane 0 is 0x3e800000, expected 0x427d0000) fails 3 of 3 (lane 0 is 0x427d0000, expected 0x3e800000)
APS5_SPANNED_WAVE=1 passes 3 of 3 passes 3 of 3
RTX 3060 Ti, default passes passes

The switch removes both failures, as it did on ANV. #7395 merged alone into the same main gives the same result: #7395 (comment)

AI-assisted: yes (Claude Code)

@adriadam10 adriadam10 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not mergeable as is, and nothing in this PR is blocking by itself:

  • The branch conflicts with main, and so does the root of the stack it sits on (#7223, ResourceTracker.cpp / TryMakeIndirectColumn after #7880; see oneandonlydean's comment there). The resolution of the two dword reads in TryMakeIndirectColumn is a logic call that has to be settled on #7223 first.
  • Stacked on #7223, #7395, #8939, #9457, #9633, #9749 and #9790, none merged. Please move the chain onto main once #7223 is resolved, as you said on #7395, and re-request review; the two fix commits and the resolutionFootprint read-range term (d01f290, answers MarcZX10's review) look consistent from the diff.
  • When rebasing, keep FormatVersion above main and #10000's, as planned.
  • No new evidence needed on tests: CI on this head only ran Conventions/relinker, the full Build runs when it enters the merge queue.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs rebase Conflicts with main, rebase needed unblocks title Names a title ID on the Unblocks line

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants