Repository navigation
feat(shader): read samplers through nested and pointer-keyed descriptor tables - #7395
EagleBearerYS wants to merge 30 commits into
Conversation
|
Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.
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.
|
|
Rebase handoff — rebased onto current
One combination to review when you pick it up: when a Verified on Linux (CachyOS, kernel 7.2.9, GCC 16.2.1, Ninja, Release, To pick it up: Head is |
|
@blawesom thank you for the rebase and for reconciling all eight files, including the auto-merge's non-compiling |
|
@blawesom a follow-up on the case you flagged, where a
A Linux run of the |
|
@EagleBearerYS thanks for b91f050. Ratchet & Clank: Rift Apart (PPSA01474) data with it:
I can capture the shader ( AI assistance: the run and this summary were made with Claude Code. |
|
@ps54all thanks for running it. On your branch, b91f050 clears the stop on compute shader 0x116bb5f500 ( No need for the |
|
Tested on real hardware, with no title run. Head
The Intel failures, run as The two values are swapped between the two tests. The tests choose between a wrap and a clamp point sampler, so ANV may return the result of the other sampler. I have not found the cause. The existing Tested and written by Claude (AI assistant) on a contributor's machine. |
|
@Capmare thank you for running all four devices, and for repeating the ANV failures three times. The tests can't confuse the two samplers. Every lane samples past the right edge, so a wrap sampler reads texel x (0x3e800000, 0.25, at lane 0) and a clamp sampler reads texel 63 (0x427d0000, 63.25). Both failures come from the first check of the first dispatch. That check walks the workgroups in order and stops at the first one that differs, so your two lines say this:
So on ANV the second workgroup gets the first workgroup's sampler. Workgroups 2 and 3 never ran through the check. The If you have time for one more run: the same two tests with the Khronos validation layer ( |
|
@EagleBearerYS I ran the two tests with the Khronos validation layer, and I found a trigger on ANV that does not involve our SPIR-V. Details below, including what I could not prove. Summary
Setup
Results of the two tests
The two Intel failures are the lines from your comment:
I added the group number to the failure message locally. It confirms your reading: the first mismatch is workgroup 1, and workgroup 1 gets the sampler of workgroup 0. The failure does not depend on the validation layer, on Validation layer
The SPIR-V of the failing dispatchI captured the pipeline with
What I tried on the real test, with the real buffersI added a local diagnostic hook that replaces the compute module with an edited file, so the driver, the buffers and the descriptors stay real. Results on the Intel GPU:
The row with the workgroup id is the important one. It means the key, the record and the pointer chain are not the cause. Standalone reproduction (no AnyPS5 code)A C program (about 300 lines) and one GLSL compute shader. It makes two samplers (REPEAT and CLAMP_TO_EDGE) and a 64x1 R32_SFLOAT texture with texel On the Intel GPU:
NVIDIA, RADV and llvmpipe pass every variant. The validation layer reports nothing for the program. The trigger is therefore: required subgroup size 32, a workgroup of exactly 32 threads (one SIMD32 thread), and a sampler array with more than 2 elements indexed per workgroup. The driver creates our compute stages with The compute shader of the reproduction#version 450
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_KHR_shader_subgroup_ballot : require
layout(local_size_x = 32) in;
layout(set = 0, binding = 0) uniform texture2D tex;
layout(set = 0, binding = 1) uniform sampler samplers[]; // compiled with -DRUNTIME_ARRAY
layout(set = 0, binding = 2) readonly buffer Indices { uint indices[]; };
layout(set = 0, binding = 3) writeonly buffer Results { float results[]; };
void main() {
uint index = indices[gl_WorkGroupID.x];
float value = textureLod(sampler2D(tex, samplers[index]), vec2(1.2578125, 0.5), 0.0).x;
results[2u * gl_GlobalInvocationID.x] = value;
}Workarounds I tested on the Intel GPU
Effect of
|
| Run | pass | skip | fail |
|---|---|---|---|
| Intel, default | 217 | 3 | 15 |
Intel, APS5_SPANNED_WAVE=1 |
219 | 3 | 13 |
| RTX 4070 SUPER, default | 220 | 2 | 13 |
| RX 7600, default | 218 | 3 | 14 |
Between the two Intel runs only agc_driver_nested_sampler_table and agc_driver_pointer_phi_sampler_table change, from fail to pass. No test goes from pass to fail.
Tests that fail on every device
These 13 tests fail on Intel, NVIDIA and RADV alike, with and without the spanned-wave switch: agc_buffer_pool, agc_driver_stencil_replay_no_gpl, agc_host_import_second_mapping, agc_import_settle_deferred, agc_import_settle_deferred_other_family, agc_import_settle_earlier_import, agc_import_settle_first_use, agc_import_settle_retire, agc_import_settle_storage_image, agc_shader_bindless, agc_shader_frontend_pair, agc_storage_cpu_snapshot, agc_vertex_barrier. RADV also fails agc_pipeline_cache_file. I did not investigate them. They may come from my merge of origin/main, from my local patches, or they may exist upstream. I did not run them on a clean checkout of the PR head.
Caveats
- This is not a clean PR head. My tree has local patches for a different goal (running a game). They do not touch the sampler-table code, but the local build has a diagnostic fallback in the resource tracker that replaces a sampler reached through a runtime pointer chain. With it,
--nested-samplerfails on every device witha V# with another buffer consumer was not refused by resource planning. I turned it off withAPS5_NO_DESCRIPTOR_SUBSTITUTE=1for all runs above. A clean PR head does not have this fallback. - I tested only the Intel iGPU of this PC. I did not test other Intel GPUs or other Mesa versions.
- I did not read the Mesa source. I cannot say which ANV code path causes the behaviour.
- The test comparison covers the registered unit tests. I did not test game workloads with the spanned-wave mode.
Suggestion
I did not change the tests or the driver. If you want a driver change, enabling the spanned-wave mode on ANV is the smallest one I found. It changes how every single-wave wave64 compute shader runs on that driver, so I leave the decision to you. Separately, the standalone program is a clean bug report for Mesa. I can attach the source and a short write-up, or file the Mesa report myself if you prefer.
|
@Capmare thank you, this settles it, and the standalone program is the strongest part. With no AnyPS5 code, ANV gives workgroup 1 workgroup 0's sampler whenever the stage has A correction to my last comment: the module carries no The two tests stay as they are, since they're what caught it. If you want to report it, your program looks ready to post as a Mesa issue as it stands (https://gitlab.freedesktop.org/mesa/mesa/-/issues). That's entirely up to you. |
|
@EagleBearerYS thank you for the careful review and for the clear questions. They pointed me to the validation layer and to the exact failing dispatch, which is how I found the cause. I posted the standalone program as a Mesa issue: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/16622 I agree with leaving the two tests as they are and with not changing the driver yet. If Mesa answers, I will post the result here. |
✅ NVIDIA GPU test: passedPR head
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (3, not counted against this PR)Validated but not compared (9, not in the main baseline's validation pass)Validation IDs already present on main (4 IDs in 510 tests)Skipped (45)ReproduceAutomated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
XairRrR
left a comment
There was a problem hiding this comment.
Re-checked — approved
Since e04a705 the PR has fixed the test wording, extended the per-snapshot descriptor-epoch check to a nested S# table that is the shader's only table (with a new test), put libc on PATH for both nested retry tests on Windows, moved to FormatVersion 63, and resolved #12246's resourceViews loop in a merge. The checks pass, the focused tests pass, and the new test fails without the fix. I found nothing blocking.
What changed since my last review
- 4769d5a: removes "and refusals" from the nested image and nested sampler success lines.
- 967f0db:
TableSnapshotter::Run()now setshasIndirectfor a sampler when its column isindirector its heap source is itself a table column. This is the same test the image loop already used. The commit addsagc_shader_nested_sampler_snapshot_retry. - 5fdf20f: on Windows, puts libc's directory on PATH for both
agc_shader_nested_snapshot_retryandagc_shader_nested_sampler_snapshot_retry. - f4781de: sets
ShaderDiskCache::FormatVersionto 63.mainis at 52, so this stays above it. - Merges of
mainand of #7223's 7f36e41: 6cb37cc moves #12246'sresourceViewsloop out ofCopyRecordsand back intoSnapshot(). #7223's own budget-reset commit is out of this review's scope, as before. - Description: the version and ordering notes are updated.
What I ran
- Head:
63b5c09df9776ccd7d0ce018dfd676931e2d7639 main:4f41f4c375f5abb487dbd184fbc150f31994d762- Merged tree:
fbf279248cc3902f161e51a442c76155374f0f4b - Machine: Debian 13 VM (32 vCPU, Xeon Gold 6136), GCC 14.2.0, lavapipe (Mesa 26.1.6, LLVM 19)
git diff --check 4f41f4c375f5abb487dbd184fbc150f31994d762...63b5c09df9776ccd7d0ce018dfd676931e2d7639
python3 tools/check_conventions.py --base 4f41f4c375f5abb487dbd184fbc150f31994d762
ctest --test-dir build -j8 --test-load 32 --output-on-failure \
-R "^(agc_shader_nested_.*snapshot_retry|agc_shader_disk_cache|agc_shader_bindless|agc_shader_memory|agc_driver_image_table|agc_driver_nested_.*|agc_driver_pointer_phi_.*)$"
# negative control: in ResourceMaterializer.cpp, the sampler loop's hasIndirect line reverted to `hasIndirect |= column.indirect;`
ninja -C build -j32 -l32 agc_shader_memory_tests
ctest --test-dir build --output-on-failure -R "^agc_shader_nested_(sampler_)?snapshot_retry$"
git show fbf279248cc3902f161e51a442c76155374f0f4b:core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp > core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp
ninja -C build -j32 -l32 agc_shader_memory_tests
ctest --test-dir build -R "^agc_shader_nested_(sampler_)?snapshot_retry$"
git status --porcelain # empty| Check | Result |
|---|---|
git diff --check |
No output |
check_conventions.py |
All conventions checks passed. |
| Build and selected tests (script, merged tree) | Build OK; 2223 run, no new failures and no timeouts. The 7 known failures also fail on main. |
| Validation layer (script) | Loaded in 776 of 777 tests; 0 tests with new VUID- lines; layer_missing_in empty |
| Focused set (13 tests) | 13 of 13 pass. The slowest is agc_shader_disk_cache at 6.4 s. |
| Negative control | agc_shader_nested_sampler_snapshot_retry fails with nested retry: expected inner retry and outer revalidation. #7223's agc_shader_nested_snapshot_retry still passes. After the restore, both pass and the worktree is clean. |
Previous findings
- Summary lines claimed refusal checks — Resolved. 4769d5a removes "and refusals" from both lines.
grep refusalsfinds nothing inImageTable.cppat the head. - Stale version and ordering notes in the description — Resolved. The description now says 63 (the code has 63, and
mainhas 52) and names #7223's 7f36e41 in the Ordering paragraph. Two small leftovers: the first checklist line still says "merged with #7223's head 0dbf547 (mainf7e84c4)", and the Version bumps paragraph still saysmainis at 51 (it is at 52). Neither needs to block.
New findings
Blocking
None.
Non-blocking
- Nested child T#s skip #12246's registered 1D-array view normalization.
CopyRecordsbuilds nested children (core/shader/recompiler/Optimization/src/ResourceMaterializer.cpp:1490), and onlySnapshot()fillsresourceViews(:1502-1510). For an image reached through a nested child, the materializer therefore always uses the child's raw words (:2132-2133). The merge commit argues this is exact becauseimage.tableonly indexes top-level tables. However,layerRowsCompatibleis set without regard to how the T# is reached (core/shader/recompiler/Optimization/src/ResourceTracker.cpp:2402). So a sampledDim1DArrayT# read through record → pointer → V# would be planned as layer-rows compatible while its descriptor is neither normalized nor registered. No test covers that combination, and I did not check what the emitter does in that case.- Suggested fix: either compute
resourceViewsfor nested children of a candidate image, or clearlayerRowsCompatiblefor images whose column has a table-column heap source. Alternatively, list the gap indocs/dev/debt/shader.md.
- Suggested fix: either compute
Notes on the new code, with no change requested:
- 967f0db mirrors the image loop exactly (
ResourceMaterializer.cpp:755-763against:746-754).plan.descriptorSources.at(column.heapSource)throws on an out-of-range source instead of reading past the end. - The PATH change for Windows is test registration only.
Not verified
- Windows. I did not check the PATH fix, and the description's runs are author-reported.
- GPUs other than lavapipe. The ANV and Intel Windows sampler-array issue (Mesa issue 16622) is unchanged since my last review.
- #7223's own code, including its 7f36e41 budget reset, which is part of this PR's diff against
mainuntil #7223 merges. - Any title. Following the review rules, I launched no game.
- Repeated runs: each test ran once.
|
Thanks for the re-check.
|
✅ NVIDIA GPU test: passedPR head
Unstable on main (4, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (3, not counted against this PR)Validated but not compared (2, not in the main baseline's validation pass)Validation IDs already present on main (4 IDs in 519 tests)Skipped (48)ReproduceAutomated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
boykopovar#7223 has merged. The conflicts are this branch's additions on top of it: its tests in the image-table test lists, pointerKeyed in the image-table column and its equality check, the plan encoder's field count and list version, and FormatVersion 63. agc_shader_memory_tests.cmake merged without a conflict but registered agc_shader_nested_snapshot_retry twice: boykopovar#7223's block after agc_shader_descriptor_phis and this branch's before it. The merge keeps this branch's block, which adds agc_shader_nested_sampler_snapshot_retry, at boykopovar#7223's place.
✅ NVIDIA GPU test: passedPR head
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (3, not counted against this PR)Validated but not compared (1, not in the main baseline's validation pass)Validation IDs already present on main (13 IDs in 544 tests)Skipped (49)ReproduceAutomated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
e94fb3f is boykopovar#7395 with its merge of main after boykopovar#7223. The two conflicts are this branch's own changes over boykopovar#7395: FormatVersion 66, and its wording of the pointer-keyed image-table debt entry.
4769d4a is boykopovar#8939 with boykopovar#7395's merge of main after boykopovar#7223. The one conflict is this branch's FormatVersion 67.
…sharp-reuse 6e403b4 is boykopovar#9457 with the stack's merges of boykopovar#7395's main merge after boykopovar#7223. FormatVersion stays this branch's 71. In the debt file, boykopovar#7395 adds a sentence on nested children's registered views to "Nested image tables", which this branch rewrites. The entry keeps this branch's wording, and the sentence moves into its own entry after it, since both together are over the debt files' 1000 characters.
b41beed is boykopovar#9790 with the stack's merges of boykopovar#7395's main merge after boykopovar#7223. FormatVersion stays this branch's 73, and the debt file keeps this branch's three entries, with boykopovar#7395's "Nested image table children" entry added after "Nested image tables".
6e403b4 is boykopovar#9457 with the stack's merges of boykopovar#7395's main merge after boykopovar#7223. The conflicts are this branch's own: FormatVersion 70 and its pointer-keyed chase debt entry.
…ords-on-c2 f498717 is boykopovar#9633 with the stack's merges of boykopovar#7395's main merge after boykopovar#7223. The conflicts are this branch's own: FormatVersion 72 and its wording of the pointer-keyed chase debt entry.
|
PPSA03671: head RTX 3080 Ti, NVIDIA 615.71.09, Linux, PPSA03671 01.001.005, from launch with no input. The tree:
None of them touches the recompiler's descriptor planning. I can't check this shader without them, because the run stops earlier on the stencil export. The result: with the shader cache off, the run stops about 150 s in, after the intro logos, with the same error with and without this PR: How it compares with your example. The PR's Wolverine example has the S# read at
So it may be the same shader at another variant, or a second copy of the sampler path the PR doesn't match yet. The same shader is the one j2m304 reported on Windows in #5516 (the freeze "while preparing compute shader I can capture the shader with AI-assisted. |
|
@mrfelek thanks for the run. This is the shape the PR's first commit targets. The S# read at |
|
@mrfelek here's what the check found. It's not the key, and it isn't a regression on this branch.
If you have the time, two things would tell them apart:
No shader capture is needed for either. Edit, 2026-11-06 14:43 UTC: the last bullet used to say that case 2 crashes at dispatch on lavapipe after planning, and that a crash after the stop clears would point at case 2. That crash came from our test, not from the PR: the test hadn't mapped the record's memory for that read. With it mapped, case 2 and its T# counterpart plan and sample correctly on both heads. |
|
@EagleBearerYS thanks. I did both checks offline. I captured the shader with On #9969's head ( The rest of the original line. The S#'s own offset is an immediate. In the IR after the From the IR, it doesn't look like any of your three cases:
Yet #9969 plans it, so one of the stacked PRs covers it in a way I can't see from the IR. The new stop at It's the same record → pointer → V# → descriptor shape, but the pointer is now a
So it looks like a child or linked record, reached through a pointer stored in the record. I can re-run the request locally on any head you'd like me to try. AI-assisted. |
|
@mrfelek thanks, that's very useful. The IR excerpts answer what the log line couldn't. There's no need to attach the |
|
@mrfelek thanks, your IR answers both questions. Why #9457's second commit (0843cca, hugodearaujo's change from Marvel's Spider-Man 2 (PPSA03016)) reads a descriptor at a fixed offset of a pointer-loaded V# as a one-key child: key 0, the descriptor size as stride, the immediate as addend. It does that for T#s and S#s alike, and that's what plans this S# on #9969's head. #8939 and #9790 deal with pointer words merged through Phis and with descriptors that have other users, and your IR has neither. So none of the three cases in my earlier comment applied. The difference was the S#'s own offset, the part the synthetic shader had to guess. That attribution comes from reading the code; your replay on #9969 is what shows it plans. The new stop at
Taking it would need a third kind of chase step in the planner, in the snapshot that follows pointers at dispatch, and in the disk cache, so it isn't a small change. None of our open PRs covers it yet. We've noted it as Marvel's Wolverine (PPSA03671)'s next stop on this stack. |
|
Thanks. For the record, the game agrees with the replay. On #9969's head plus our local stencil and image-table changes, PPSA03671 gets past AI-assisted. |
|
@EagleBearerYS I tried the chase step locally to see what's behind it. Here's what I found, in case it saves you time. It's only a prototype, on #9969 + #9633 + #9749 (merged locally) and our local stencil and image-table changes. It's checked with 1.
About 40 lines. With it, the replay gets past 2. So the words at +0x10/0x14 are both this V#'s base and the next node's pointer: the shader walks a linked list of records. Locally, I let that check accept a 3.
Either is more than I'd want to try in a prototype. The prototype is on a local branch. I can push it to our fork if you'd like to see it, or test anything you push on the captured request first and then in the game. AI-assisted. |
|
@mrfelek thank you, that's a clear map of what sits behind That's more than we can take on right now. Our current work is keeping the open PRs up to date, so please don't wait for a head with the chase step from us. There's no need to push the prototype for us. If you'd like to take the direct step further yourself, it would fit as your own PR on top of #9749: |
What
#7223 has merged. With #7223, Marvel's Wolverine (PPSA03671) and Ratchet & Clank: Rift Apart (PPSA01474) stop on the sampler half of the descriptor chain that #7223 resolves for images (#6191):
#7223 resolves record → pointer → V# → T# and leaves samplers refused. Its nested table representation, pointer dictionary and limits are what this PR builds on. The PR extends them to samplers and to a one-hop pointer whose low word is merged through a Phi.
This PR's first fix,
fix(shader): refuse nested table entries whose words have other consumers(0df7d32), is now in #7223 (d132754, with its authorship). On #7223's earlier head, a nested child whose descriptor words another instruction also reads crashed lavapipe inside the shader. Four commits remain here:feat(shader): resolve S# reads through nested descriptor tables. This is the record → pointer → V# → S# chain of Marvel's Wolverine (PPSA03671)'s stop above (pc=0xbb28) and of the one atpc=0xb600. This PR plans the S# when it sits at a keyed offset of the V#. Atpc=0xb600it sits at a fixed offset, which this PR doesn't plan and fix(shader): follow pointer hops and fixed-offset V# reads behind a record pointer #9457 does (mrfelek's offline replay of fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer #9969's head, comment). Thepc=0xbb28line doesn't show its S#'s offset.feat(shader): look up a Phi-merged record pointer to an S# or T#. This is Ratchet & Clank's shape: record → pointer → S# through an address, with the pointer's low word merged through a Phi.fix(shader): accept a lane-mask word in a pointer-keyed record pointer. Ratchet & Clank: Rift Apart's next stop (ps54all, #6191):GetImageResource dword 0 is not a valid runtime value. A T# is read through a record pointer whose low word passes six levels of Phi, and one arm is a word of the waterfall loop'sBallotlane mask.fix(shader): check the descriptor epoch for a lone nested sampler table(967f0db). A shader whose only table is a nested S# table now gets the same descriptor-epoch retry as images.TableSnapshotter::Run()still widenedhasIndirectfor samplers only oncolumn.indirect. Such a shader skipped the snapshot's own epoch check and retry, and relied on the whole-snapshot revalidation alone.Ordering. This PR was stacked on #7223, which has merged. Its first three commits sit on #7223's 74700a0, and the branch then merges
maina5939f1 (480c25a) and #7223's head, now 7f36e41 (94a16af). The fourth commit sits on top. With 4d820bd, a merge ofmainc2eafe4, which has #7223, this PR's diff overmainshows only its own changes.TableColumnkeeps feat(shader): follow pointer chains from image-table records to the T# #6232'sselectedandselectionand addspointerKeyedafter them, and the plan encoder, the plan hash andsameColumnstake the new field.mainare gone with the restack, and feat(shader): resolve nested image tables through runtime pointers #7223's own merge withmainreplaces them. The first of them took its conflict resolutions from blawesom's rebase of this branch ontomain(comment) and credited blawesom as co-author.mainis at 56 since feat(shader): resolve nested image tables through runtime pointers #7223. Ours take one number each: feat(shader): raise the image limit to 128 and name the counts in its refusals #10489 57, feat(agc): look up table images at run time through a device image table on the GPU heap (APS5_GPU_PATH) #7642 62, feat(shader): read samplers through nested and pointer-keyed descriptor tables #7395 63, fix(shader): take lane-mask arms and a merged high word in a pointer-keyed record pointer #8939 66, fix(shader): follow pointer hops and fixed-offset V# reads behind a record pointer #9457 67, fix(shader): follow a conditional pointer chase through a V# behind a pointer-keyed record pointer #9633 70, fix(shader): plan several T#s read through one pointer-loaded V#, keeping the V# real for their other uses #9790 71, fix(shader): read a chased pointer's high word at its own offset #9749 72 and fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer #9969 73. The other open PRs seen changing it hold 51 (fix(agc): preserve proven base formatted buffer read extents #14944), 53 (fix(shader): serve ds_ordered_count in wave launch order #12944), 56 (perf(agc): GPU descriptor heap on VK_EXT_descriptor_heap (APS5_GPU_HEAP) #9508, the same asmain), 65 (perf(agc): bound instance-indexed guest buffers by the draw's instance range #14032), 68 (fix(shader): narrow a goto junction Phi to the arm its branch allows #14636), 69 (feat(shader): flatten oversized 1D image arrays to 2D #14871) and 74 (fix(shader): skip a bit-field low word in a pointer-keyed table's Phi #14853). Whichever lands second on a number takes the next free one.main).Tested
agc_shader_disk_cache,agc_shader_bindlessand the rest of the image-table family (21 tests) pass 10 runs in a row;^(agc|shader)tests pass, 838 of 838.main, as CI builds it (0863efb,maina07e985), on GitHub's runners (run): the nested and pointer-Phi table tests,agc_driver_image_table,agc_shader_disk_cacheandagc_shader_bindlesspass 5 runs in a row on Linux. On Windows the GPU ones skip and the rest pass, and the libc and libkernel suites pass on both.main9caecfd (aed137c, the head), on GitHub's runners, at 3730bb8, the same merge with the same tree before the co-author line was added (run): on Linux the^agctests pass 3 runs in a row, 715 tests: 667 pass, 48 skip, 0 fail. The libc and libkernel suites pass on both runners. On Windows, of 714^agctests 173 pass 3 runs in a row and 539 skip, since the runner has no Vulkan device; the only failures areagc_driver_pm4_replay_toolandagc_shader_replay_tool, which fail the same way on that runner for an unrelated branch (run).agc_driver_nested_image_table,agc_driver_nested_sampler_table,agc_driver_pointer_phi_sampler_table,agc_shader_disk_cacheandagc_shader_disk_cache_large_filepass 10 of 10 runs on both runners. Three of them skip on the Windows runner.agc_driver_nested_sampler_table: S# through record → pointer → V#. It covers independent keys, wave32 against wave64, an edited S#, unmapped and non-buffer parents, shared children, the refusal of an S# with another consumer, captured and uncaptured Phi pointers, the S# budget and the nested key budget. Red:GetSamplerResource dword 0 is not a valid runtime value.agc_driver_pointer_phi_sampler_table: S# through a Phi-merged record pointer. It covers the direct control, captured and uncaptured Phi constants, a constant equal to another record's pointer, a null pointer, a non-buffer record table, an S# with another consumer, and a T# through the same path.agc_driver_nested_image_tablegains "a T# with another consumer" (refused). Red is a SIGSEGV on feat(shader): resolve nested image tables through runtime pointers #7223's head.agc_shader_disk_cacheround-trips both new plan shapes and rejects a malformed pointer-keyed column.agc_driver_pointer_phi_ballot_tableandagc_driver_pointer_phi_copies_table: synthetic wave64 waterfall loops shaped like Ratchet & Clank: Rift Apart's chain, where the lane-mask pointer faults as outside the snapshot. On GitHub's runners (run) both fail in all 3 runs on Linux with the third commit's code (4a4db4b) and pass 10 of 10 with the fourth, with the other nested and pointer tests andagc_shader_disk_cache; the libc and libkernel suites pass. On Windows they skip without a Vulkan device andagc_shader_disk_cachepasses. A run that mirrors CI's Linux job gives 1378 tests against 1376 on 4a4db4b, with only the two new tests changing.main82f0c9a with perf(agc): draw finisher pipeline (APS5_DRAW_PIPELINE) #6946, fix(agc): skip a periodic pipeline cache save while a pipeline creation holds the cache #6958, fix(recompiler): give a dynamic-mip storage image a slot for every level #7238, feat(shader): resolve nested image tables through runtime pointers #7223, fix(recompiler): read lane spills back through relative-addressing window registers #6277, fix(shader): plan image tables through invariant descriptor phis #6417, feat(agc): link calls through the AGC FS table #6160 and fix(ampr): return EBUSY when a command does not fit and EPERM before a buffer is bound #7300) plus this PR's three commits, cold shader cache, one run:GetSamplerResourcestop no longer occurs (0 hits);PhibeforeLoadAddressU32(GetImageResource dword 0 is not a valid runtime value). That is the title's next stop. The fourth commit (b91f050) addresses that chain; Tamalero has since run the title with it (below).main66702f1 (feat(shader): resolve nested image tables through runtime pointers #7223's base) with no local patches, fresh shader cache, one run each:GetSamplerResource dword 0(pc=0x6b74, 3 refusals);GetImageResource dword 0(pc=0x99ec, 3 refusals). Its record pointer goes through a deeperPhinest, with a word of theBallotlane mask ANDed into it (BitwiseAnd32), a shape the fourth commit doesn't cover. That is the title's next stop.main82f0c9a with open PRs, already carrying this PR's earlier commits) plus the fourth commit (b91f050), one run each before and after:LoadAddressU32@pc=0x8fd4, six levels ofPhi) no longer occurs;GetImageResource dword 0 is not a valid runtime value,LoadAddressU32@pc=0x9a30): a seven-levelPhinest with aBallotlane-mask word ANDed in andReadFirstLane(SelectU32 …)arms. That is Tamalero's next stop (above) in a sibling shader: both chains read the record table at pc=0x1aa8, and the stop and the second buffer's reads sit 0x44 later than in Tamalero's (0x9a30, 0x908c and 0x900c against 0x99ec, 0x9048 and 0x8fc8).main61d3d30: Rocky Linux 10.2, Release,BUILD_TESTING=ON, 735 graphics tests per GPU, no title (comment):agc_driver_nested_sampler_tableandagc_driver_pointer_phi_sampler_tableamong them;agc_pipeline_cache_filefails, which Capmare reports as unrelated;requiredSubgroupSize = 32,local_size_x = 32and a sampler array of more than 2 elements indexed per workgroup), so it's an ANV issue, filed as Mesa issue 16622 and fixed by Mesa !37394, in Mesa 25.3.0 and later (comment) (comment, comment). The tests stay as they are. The existing nested image-table tests pass on all three GPUs.agc_driver_nested_sampler_tableandagc_driver_pointer_phi_sampler_tablefail with the same lines as on ANV. @BKlaasWerkman's rerun on the same Intel Arc, of this PR alone merged intomain938812d (comment), and fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer #9969's head d01f290 merged into the samemain(comment): both tests fail 3 of 3 by default and pass 3 of 3 withAPS5_SPANNED_WAVE=1, which spans the program over two full 32-lane subgroups. That switch made both pass on ANV too (comment), so this points to the same cause as there. Xe-LPG is Gfx12 as well. Mesa 25.3's fix doesn't reach Intel's Windows driver (101.9150). On an NVIDIA GeForce RTX 3060 Ti (617.42) in the same run both pass, and neither GPU reports a newVUID-message.GetSamplerResourceorGetImageResourcerefusal.maindoes the same with this title (comment, AGC: dynamic resolution makes the storage cache hold ~4.8x the guest memory and re-create ~400 images/s (Wolverine on an 8 GB card) #6099), so that's the title's next stop, not this PR's.main61d3d30 (ed4f148), on GitHub's runners (run): the^agctests pass on Linux (734, 0 failed, 49 skipped), and the suites' only failure is libc'sprecise_waittiming test. On Windows, where 551 of the 734 skip without Vulkan, the only failures areagc_driver_pm4_replay_toolandagc_shader_replay_tool(exit code 0xc0000139), which fail the same way on that runner for an unrelated branch (run).mainff2fc57 (59b319a, the head), on GitHub's runners (run): the^agcand^shadertests pass on Linux (739, 0 failed, 49 skipped), and the suites' only failure is again libc'sprecise_waittiming test. On Windows, where 551 of the 738 skip without Vulkan, the only failures are againagc_driver_pm4_replay_toolandagc_shader_replay_tool(exit code 0xc0000139).main0db47b2. The only conflict wasShaderDiskCache.hpp'sFormatVersionline:mainmoved to 45 (fix(shader): normalize offset perspective barycentrics after interpolation #7831), and this branch keeps its 46. On GitHub's runners (run), the pointer, nested, image-table and disk-cache sets (16 tests) pass 10 runs in a row on Linux. On Windows the set has 18, with two Windows-only disk-cache tests: they build, 5 pass 10 runs in a row, and the other 13, which need a Vulkan device, skip. The libc and libkernel suites pass on both, run withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners. An earlier run linked here didn't run this set, so it's replaced.main379b1dc.main's fix(shader): resolve table column pointers through Phi nodes #7880 changed the indirect-column builder this PR also changes: it reads a record pointer's words throughUnwrapTableReadand checks that the offset is available where the handle is (AvailableAt). The conflicts inResourceTracker.cppkeep both: this PR's record-origin walk, and fix(shader): resolve table column pointers through Phi nodes #7880's unwrap of the high word and its dominance check.FormatVersiongoes to 47, abovemain's 46.agc_shader_memoryandagc_shader_bindlesson both runners withGetImageResource dword 0 is not a valid runtime value(run).agc_shader_bindless,agc_shader_memoryand the^agc_driver_pointer_,^agc_driver_nested_,^agc_driver_image_tableand^agc_shader_disk_cachetests. Linux: 18 run, 18 pass, 0 skip, 0 fail. Windows: 20 run, 7 pass, 13 skip (Vulkan device tests; the runner has none), 0 fail.^agcset once (run): Linux 973 run, 908 pass, 64 skip, 1 fail; Windows 992 run, 272 pass, 718 skip, 2 fail. The failures areagc_driver_sgpr_pattern_fill_keyson Linux ("the dispatch completed 17 times without a pending write over the keys") andagc_driver_pipelined_metadata_passand its_draw_pipelinevariant on Windows (vkCreateInstancereturns -9 on the device-less runner).main379b1dc shows the same three with the same messages (run);agc_driver_sgpr_pattern_fill_keysfailed 1 of 4 runs there.APS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners. It merges cleanly with currentmain.mainc9b2660.main's fix(shader): answer image_get_resinfo on any T# dimension #7550 tookFormatVersion47, the number this branch had, and git merged the two edits silently, so the merge moves this PR to 50. This PR's own diff is otherwise unchanged. On GitHub's runners, 10 runs (run) of the pointer, nested, image-table and disk-cache sets (agc_shader_bindless,agc_shader_memory,^agc_driver_pointer_,^agc_driver_nested_,^agc_driver_image_table,^agc_shader_disk_cache): Linux: 18 run, 18 pass, 0 skip, 0 fail. Windows: 20 run, 7 pass, 13 skip (no Vulkan device), 0 fail. The libc and libkernel suites pass on both, run withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.mainc8d34aa, which moves feat(shader): resolve nested image tables through runtime pointers #7223 toFormatVersion48). Two conflicts, each resolved to this PR's side, which already holds the other side's content:FormatVersionstays 50, and inResourceTracker.cppthe old one-argumentPointerRecordOriginline gives way to this PR's two-argument version and its helpers, at its one call site. The merge brings in exactlymain's c9b2660 to c8d34aa changes (249 files, each the same asmain's own), so this PR's own diff is unchanged. On GitHub's runners, 10 runs (run) of the pointer, nested, image-table and disk-cache sets (agc_shader_bindless,agc_shader_memory,^agc_driver_pointer_,^agc_driver_nested_,^agc_driver_image_table,^agc_shader_disk_cache): Linux: 18 run, 18 pass, 0 skip, 0 fail. Windows: 20 run, 7 pass, 13 skip (no Vulkan device), 0 fail. The libc and libkernel suites pass on both (143 and 206 tests on Linux, 170 and 222 on Windows), run withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.^agcsweep, once (run): Linux 1,009 run, 945 pass, 64 skip, 0 fail. Windows 1,037 run, 292 pass, 740 skip, 5 fail.agc_submit_progress,agc_submit_progress_no_timeline,agc_driver_pipelined_metadata_passandagc_driver_pipelined_metadata_pass_draw_pipelinestop atvkCreateInstance(-9) on GitHub's runner, which has no Vulkan device, as onmainc9b2660 alone (run).agc_driver_frame_replayfails withthe replay did not reproduce the second copy, the intermittent Windows failure tracked in agc_driver_frame_replay fails intermittently on Windows CI #10711, which test(agc): quarantine agc_driver_frame_replay on Windows until the recorder fix (#10711) #10715 (open) quarantines on Windows. Run alone on Windows 20 times in a row, it passes on this head (run) and onmainc8d34aa (run).main0d62324 into feat(shader): resolve nested image tables through runtime pointers #7223 and moves it toFormatVersion49, abovemain's 48. That line was the one conflict, and it stays 50 here. This PR's own diff is unchanged.agc_driver_nested_sampler_table's check that a V# with another buffer consumer is refused, one of the assertions @oneandonlydean listed on fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer #9969, under the rule that tests don't assert that a shape the code doesn't support yet throws. The sampled results, sharing and budget checks stay.agc_pipeline_cache_fileandagc_driver_sgpr_pattern_fill_keys, ran 10 times with no failure. Linux: 12 run, 11 pass, 1 skip (agc_pipeline_cache_file), 0 fail. Windows: 14 run, 6 pass, 8 skip (the seven Vulkan device tests, as the runner has no device, andagc_pipeline_cache_file), 0 fail.guest_raise_exceptionfailed after "address waking round 20: the handler did not run within 5 s", asmain9fc181d does in the same verify setup (run); that is libkernel (Windows): guest_raise_exception slowed about 3x and sometimes aborts at "address waking" since 540364a24 (#10666) #11813, and this PR doesn't touch libkernel.exec_arguments,guest_timed_join_import_libkernel_sysandguest_timed_join_import_libkernel_webfail at their setup in the verify's Windows build (FileNotFoundErrorstarting the title, or copying the libraries they load), and pass inmain's own Windows job at 1829def (job). The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.agc_driver_nested_sampler_table's check that an S# with another consumer is refused, with therefusedhelper it was the last user of, under the rule that tests don't assert that a shape the code doesn't support yet throws. fix(shader): plan several T#s read through one pointer-loaded V#, keeping the V# real for their other uses #9790 plans that S# and checks its sampled result. The sampled results, sharing and budget checks stay. The pointer, nested, image-table and disk-cache tests withagc_pipeline_cache_fileandagc_driver_sgpr_pattern_fill_keysran 10 times with no failure. Linux: 12 run, 11 pass, 1 skip (agc_pipeline_cache_file), 0 fail. Windows: 14 run, 6 pass, 8 skip (the seven Vulkan device tests andagc_pipeline_cache_file), 0 fail. Suites: libc and libkernel pass on Linux (158 and 217). On Windows libc passes (187), and libkernel passes 236 of 239:exec_arguments,guest_timed_join_import_libkernel_sysandguest_timed_join_import_libkernel_webfail at their setup in the verify's Windows build (FileNotFoundErrorstarting the title, or copying the libraries they load), and pass inmain's own Windows job at 1829def (job). The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.main38ccd50 (run).mainnow has fix(agc): sample cube descriptors with fewer than six slices as six faces #11507 (hugodearaujo's short-cube sampling), which takesFormatVersion49 (b9f4f65); that line was the one conflict, and this PR keeps its 50 (see Version bumps above). fix(agc): sample cube descriptors with fewer than six slices as six faces #11507 also adds anImageResourcefield,sampledOnly, whichShaderDiskCache.cppencodes next to this PR's fields without a conflict. This PR's diff overmainis the same apart from theFormatVersionline's old value. The pointer, nested, image-table and disk-cache tests withagc_pipeline_cache_file,agc_driver_sgpr_pattern_fill_keysand fix(agc): sample cube descriptors with fewer than six slices as six faces #11507'sagc_driver_image_sample_short_cuberan 10 times with no failure. Linux: 13 run, 12 pass, 1 skip (agc_pipeline_cache_file), 0 fail. Windows: 15 run, 6 pass, 9 skip (the eight Vulkan device tests andagc_pipeline_cache_file), 0 fail. Suites: libc and libkernel pass on Linux (166 and 265). On Windows libc passes (194), and libkernel passes 284 of 287:exec_arguments,guest_timed_join_import_libkernel_sysandguest_timed_join_import_libkernel_webfail at their setup in the verify's Windows build (FileNotFoundErrorstarting the title, or copying the libraries they load), withmain's code too, and pass inmain's own Windows job at 1829def (job). The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.agc_driver_nested_image_table's two checks that a valid shader is refused, one whose parent V# also feeds another buffer consumer and one whose T# has another consumer, with therefusedhelper they were the last users of, under the rule that tests don't assert that a shape the code doesn't support yet throws (raised on fix(shader): follow pointer hops and fixed-offset V# reads behind a record pointer #9457, fix(shader): plan several T#s read through one pointer-loaded V#, keeping the V# real for their other uses #9790 and fix(agc): span table-reading wave64 programs by default on Intel drivers that share handles across fused threads #10846). Neither shape is implemented. The sampled-result, wrap, bounds, non-buffer and empty-dictionary checks stay. The PRs stacked on this one take the commit through their merges, so none of the stack's tests asserts thenot a valid runtime valuerefusal any more.mainf7e84c4 into feat(shader): resolve nested image tables through runtime pointers #7223 and moves feat(shader): resolve nested image tables through runtime pointers #7223 toFormatVersion50. Clean: both sides had moved the line to 50.agc_shader_bindlessandagc_shader_memoryran 10 times with no failure. Linux: 19 run, 19 pass, 0 skip, 0 fail. Windows: 21 run, 8 pass, 13 skip (the Vulkan device tests; the Windows runner has no Vulkan device), 0 fail. The libc and libkernel suites run 191 and 291 tests on Linux and 220 and 314 on Windows, with 0 failed. They ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.ImageTable.cpp:1635) is feat(shader): resolve nested image tables through runtime pointers #7223's own, from Daniele Giovane's ad44bc4; it's in this branch through the merges of feat(shader): resolve nested image tables through runtime pointers #7223, and this commit changes it here. The image-table, nested, pointer, disk-cache, bindless and shader-memory tests ran 10 times with no failure. Linux: 19 run, 19 pass, 0 skip, 0 fail. Windows: 21 run, 8 pass, 13 skip, 0 fail; the 13 skip because the runner has no Vulkan device. The libc and libkernel suites run 191 and 291 tests on Linux and 220 and 314 on Windows, with 0 failed. The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.maina5939f1, 94a16af, a merge of feat(shader): resolve nested image tables through runtime pointers #7223's 7f36e41, and f4781de, the format commit (run).FormatVersion. This PR's own diff is unchanged except that its removed line now readsmain's 50.agc_shader_nested_snapshot_retry, which exits with 0xc0000135 before it starts, because its registration doesn't put libc's directory on PATH on Windows. 5fdf20f, below, fixes it.agc_shader_nested_sampler_snapshot_retryruns the nested retry check with an S# child column and a sampler as the only table. Its registration gives it libc's directory on PATH on Windows, in the same commit.APS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.main0836dfd (run, on fc6a89d, which has the same tree). build(agc): register each AGC test executable in its own CMake fragment #12862 movedlibSceAgcDriver's test registrations intotests/cmake/; the conflict inCMakeLists.txtis resolved withtools/agc_test_split.py resolve, which moves this PR's registrations intotests/cmake/agc_driver_image_table_tests.cmake(+11) andtests/cmake/agc_shader_memory_tests.cmake(+7). Nothing else conflicted. Apart from the move, this PR's diff is unchanged. With-DBUILD_TESTING=ON,ctest -Ngives 3084 tests:main's 3075 plus its 9 tests, each listed once. The 11 tests of this PR's verify set ran 10 times in a row. Linux: 11 run, 11 pass, 0 skip, 0 fail. Windows: 11 run, 2 pass, 8 skip (no Vulkan device), 1 fail:agc_shader_nested_snapshot_retry, feat(shader): resolve nested image tables through runtime pointers #7223's test, which exits with 0xc0000135 before it starts, because its registration doesn't put libc's directory on PATH on Windows. It failed the same way before this merge (run at 967f0db, run at f4781de), andresolvemoved its lines byte for byte. Suites: libc and libkernel pass on Linux (199 and 308) and on Windows (226 and 330). The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.tests/cmake/agc_shader_memory_tests.cmake's Windowsset_tests_propertiesnow names feat(shader): resolve nested image tables through runtime pointers #7223'sagc_shader_nested_snapshot_retrybeside this PR'sagc_shader_nested_sampler_snapshot_retry, so the 0xc0000135 failure noted above is gone. It's one line, and nothing else changes.agc_shader_nested_snapshot_retryexits with 0xc0000135 and the sampler retry passes. Linux passes both.APS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.maind262000: 39 tests, 39 passed, 0 skipped, 0 failed, both retry tests included.maine6f5730, driver 595.99.02, Ubuntu 26.04.1, 2,543 of 3,148 tests selected.main, and 3 are unstable onmain.VK_LAYER_KHRONOS_validation, there are no new validation IDs againstmain, over 941 tests on the GPU. 9 tests ran with the layer but aren't inmain's baseline, so they weren't compared. Both nested snapshot retry tests passed on the GPU.main88e804b (run).mainnow has Ondra97's fix(shader): split scalar-address descriptor phis #7694 (scalar-address descriptor Phis), which addsDescriptorSource::requiredBlocksto the shader plan encoding, and JJenkx's fix(agc): render layered mesh targets within device limits #6959, which movesFormatVersionto 51. Three conflicts, each keeping both sides. InShaderDiskCache.cppthe encoder writes this PR'spointerKeyedand then fix(shader): split scalar-address descriptor phis #7694'srequiredBlocks, in the order the decoder reads them, and the static checks take both changes:DescriptorSource224 bytes with 4 fields,TableColumn120 bytes with 20, and at least 82 bytes per encoded descriptor source.FormatVersionstays 63, andagc_shader_memory_tests.cmakeregisters this PR's two snapshot-retry tests and fix(shader): split scalar-address descriptor phis #7694'sagc_shader_descriptor_phis. This PR's changed lines are the same apart from those numbers, and its#include <unordered_set>inResourceTracker.cppleaves the diff because fix(shader): split scalar-address descriptor phis #7694 adds the same line. The shader-memory, nested, pointer, image-table, disk-cache and bindless tests, with fix(shader): split scalar-address descriptor phis #7694'sagc_shader_descriptor_phis, pass 10 runs in a row. Linux: 22 run, 22 pass, 0 skip, 0 fail. Windows: 24 run, 11 pass, 13 skip, 0 fail. Suites: libc and libkernel pass on Linux (210 and 310) and on Windows (237 and 331). The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.main4f64f81, which brings B-Howell's feat(agc): sample 1D arrays past maxImageArrayLayers as rows of a 2D image #12246 (1D array layer rows). feat(agc): sample 1D arrays past maxImageArrayLayers as rows of a 2D image #12246 addsresourceViews, a table's registered image views, to the image-table column snapshot.ResourceMaterializer.cpp: the table equality check compares this PR'snested,pointerKeyedandpointersand feat(agc): sample 1D arrays past maxImageArrayLayers as rows of a 2D image #12246'sresourceViews, and the footprint keeps feat(agc): sample 1D arrays past maxImageArrayLayers as rows of a 2D image #12246's loop overresourceViewswith this PR'stable.pointers.size() * 2uadded to its first line.Snapshot(source, table)that records each table's registered image views and checksimage.table != table. feat(shader): resolve nested image tables through runtime pointers #7223, which this PR is built on, copies a column's records in a helper,CopyRecords, that nested child columns use too, and git placed the loop there, wheretableisn't in scope, so the merge didn't build. The merge commit moves the loop back intoSnapshot, right afterout = CopyRecords(records).image.tableonly ever indexes a top-level table (ResourceTracker::AssignTables), and nested children are reached only through a parent record's code, so nested children having no registered views is exact. It's folded into the merge so that no commit fails its tests.FormatVersionstays 63, and this PR's diff overmainis otherwise unchanged.agc_shader_descriptor_phis, pass 10 runs in a row. Linux: 22 run, 22 pass, 0 skip, 0 fail. Windows: 24 run, 11 pass, 13 skip (no Vulkan device), 0 fail. Suites: libc and libkernel pass on Linux (217 and 318) and on Windows (244 and 339). The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.agctest on the stack's two tips, fix(shader): read a chased pointer's high word at its own offset #9749 and fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer #9969, cover this merge's code (see those PRs).main4f41f4c (×10, the PR's own tests ×10).ShaderDiskCache.hpp'sFormatVersion, wheremainis now at 52 (feat(shader): raise the sampler and sampled-pair limits past the 32-bit sampler masks #10000) and this PR keeps its 63; anddocs/dev/debt/shader.md, where this PR's entries andmain's new entries are adjacent and both stay. This PR's own lines are unchanged apart from theFormatVersionline's old value.agc_driver_image_table,agc_driver_many_direct_samplersand every test matching^agc_shader_memory,^agc_shader_disk_cache,^agc_shader_sampler_limits,^agc_shader_nestedor^agc_shader_table. Linux: 11 run, 11 pass, 0 skip, 0 fail. Windows: 13 run, 11 pass, 2 skip (no Vulkan device), 0 fail. The libc and libkernel suites run 300 and 322 tests on Linux and 327 and 342 on Windows, with 0 failed. The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.^agc_driver_pointer_and^agc_driver_nested_test, the image-table tests in this PR's diff overmain, which the first run's names left out. Linux: 7 run, 7 pass, 0 skip, 0 fail. Windows: 7 run, 0 pass, 7 skip (no Vulkan device), 0 fail.mainc2eafe4, which brings yabanana's feat(shader): resolve nested image tables through runtime pointers #7223, and 014d1e3, a debt-entry sentence (×10).tests/cmake/agc_driver_image_table_tests.cmake),pointerKeyedin the image-table column and its equality check (ResourceMaterializer.cpp), the plan encoder's field count and list version (ShaderDiskCache.cpp), andShaderDiskCache.hpp'sFormatVersion, which stays 63 (mainis at 56 since feat(shader): resolve nested image tables through runtime pointers #7223).tests/cmake/agc_shader_memory_tests.cmake, git kept both feat(shader): resolve nested image tables through runtime pointers #7223'sagc_shader_nested_snapshot_retryblock and this PR's, which registers it besideagc_shader_nested_sampler_snapshot_retry, so CMake refused the secondadd_test. The merge keeps one block, this PR's, at feat(shader): resolve nested image tables through runtime pointers #7223's place.mainis now its own changes only: 15 files, 530 insertions and 45 deletions.resourceViews, so a 1D array pastmaxImageArrayLayerskeeps its raw descriptor there.agc_driver_many_direct_samplersand every test matching^agc_driver_pointer_,^agc_driver_nested_,^agc_shader_nested_,^agc_driver_image_table,^agc_shader_memory,^agc_shader_disk_cacheor^agc_shader_sampler_limits, which takes in every test in this PR's diff overmain. Linux: 22 run, 22 pass, 0 skip, 0 fail. Windows: 24 run, 10 pass, 14 skip (no Vulkan device), 0 fail. The libc and libkernel suites run 301 and 325 tests on Linux and 331 and 343 on Windows, with 0 failed. The suites ran withAPS5_SKIP_TIMING_TESTS=1, which relaxesprecise_wait's median bounds on GitHub's hosted runners.Checklist
mainc2eafe4, which has feat(shader): resolve nested image tables through runtime pointers #7223; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)APS5_SPANNED_WAVE=1), Windows 11, with the validation layer (BKlaasWerkman, in fix(shader): index a pointer-loaded V#'s T# array by a word read from the same buffer #9969's stack); NVIDIA RTX 2000 Ada Generation (driver 595.99.02, Ubuntu 26.04.1; TechLevelZero's NVIDIA bot)