Skip to content
Open
Show file tree
Hide file tree
Changes from 34 commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
4122094
feat(shader): resolve S# reads through nested descriptor tables
EagleBearerYS Oct 18, 2026
9200c3a
feat(shader): look up a Phi-merged record pointer to an S# or T#
EagleBearerYS Oct 18, 2026
f6fb8b6
fix(shader): accept a lane-mask word in a pointer-keyed record pointer
EagleBearerYS Oct 18, 2026
64b16cd
fix(shader): take lane-mask ANDs and a high-word Phi in a pointer-key…
EagleBearerYS Oct 18, 2026
2788b8f
fix(shader): skip lane-mask arms built from a waterfall's lane bit in…
EagleBearerYS Oct 21, 2026
f877d5e
docs(shader): list lane-mask arms and a merged high word for pointer-…
EagleBearerYS Oct 21, 2026
92200f9
Merge #7223's 87168157a2 into feat/shader-nested-sampler-tables
EagleBearerYS Oct 21, 2026
6c1371b
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 21, 2026
e9d4626
Merge feat/shader-nested-sampler-tables into fix/shader-pointer-key-l…
EagleBearerYS Oct 21, 2026
92cede3
fix(shader): pair a pointer-keyed record pointer's two words by Phi edge
EagleBearerYS Oct 21, 2026
a7d1e62
docs(shader): note the edge-paired walk of a pointer-keyed record poi…
EagleBearerYS Oct 21, 2026
bd4d801
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 21, 2026
8704f73
Merge feat/shader-nested-sampler-tables into fix/shader-pointer-key-l…
EagleBearerYS Oct 21, 2026
6681187
fix(shader): follow pointer hops after a pointer-keyed record pointer
EagleBearerYS Oct 21, 2026
0843cca
fix(shader): read a T# at a fixed offset of a pointer-loaded V# as a …
hugodearaujo Oct 21, 2026
c00cb0f
test(shader): read a T# at a fixed offset of a pointer-loaded V#
EagleBearerYS Oct 21, 2026
2228a7c
Merge #7223's carry into feat/shader-nested-sampler-tables
oneandonlydean Oct 22, 2026
2a5db7a
Merge main into fix/shader-table-family-6191
EagleBearerYS Oct 22, 2026
0e78959
fix(shader): plan T#s read through one pointer-loaded V# by several h…
EagleBearerYS Oct 22, 2026
5352316
fix(shader): keep a nested child's V# real for T# words that also fee…
EagleBearerYS Oct 22, 2026
57bf487
Merge main into fix/shader-nested-table-shared-vsharp-reuse
EagleBearerYS Oct 22, 2026
4661f4b
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 23, 2026
9162d9d
Merge #7395's 4661f4bab5 into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 23, 2026
7f3a25e
Merge #8939's 9162d9df8f into fix/shader-table-family-6191
EagleBearerYS Oct 23, 2026
809d880
Merge #9457's 7f3a25e0cb into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Oct 23, 2026
47a4e59
fix(shader): ignore the low two bits of a scalar load's base address
EagleBearerYS Oct 23, 2026
0ce2624
test(agc): give the shared V# reuse case's record pointer low bits on…
EagleBearerYS Oct 23, 2026
9e50a74
fix(shader): refuse a pointer-keyed record arm whose two words are bo…
EagleBearerYS Oct 24, 2026
319fa1f
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 24, 2026
0858667
Merge #7395's main merge into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 24, 2026
dc18bf7
Merge #8939's main merge into fix/shader-table-family-6191
EagleBearerYS Oct 24, 2026
cfd61b7
Merge #9457's main merge into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Oct 24, 2026
2525821
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 24, 2026
ab388af
Merge #7395's main merge into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Oct 24, 2026
960abd8
Merge #7395's main merge into fix/shader-table-family-6191
EagleBearerYS Oct 24, 2026
232a8e4
Merge #7395's main merge into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 24, 2026
71741a7
Merge #7223's merge of main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 24, 2026
e2af03b
Merge #7395's merge of #7223 into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 24, 2026
0d4dab1
Merge #7395's merge of #7223 into fix/shader-table-family-6191
EagleBearerYS Oct 24, 2026
6779c14
Merge #7395's merge of #7223 into fix/shader-nested-table-shared-vsha…
EagleBearerYS Oct 24, 2026
7808540
Merge #7223's main merge into feat/shader-nested-sampler-tables
EagleBearerYS Oct 28, 2026
9343a17
test(agc): stop asserting that a shared nested-sampler V# is refused
EagleBearerYS Oct 28, 2026
29365ff
Merge #7395's merge into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 28, 2026
cfb72cb
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 28, 2026
4750c85
test(agc): stop asserting that two pointer-table shapes are refused
EagleBearerYS Oct 28, 2026
7c5094b
Merge #8939's merge into fix/shader-table-family-6191
EagleBearerYS Oct 28, 2026
62992d7
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 28, 2026
f447f2b
Merge #9457's merge into fix/shader-nested-table-shared-vsharp-reuse
EagleBearerYS Oct 28, 2026
fefc0c3
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 28, 2026
4125a67
test(agc): stop asserting that two shared-V# shapes are refused
EagleBearerYS Oct 28, 2026
752620e
Merge main into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 28, 2026
822cb22
Merge #8939's main merge into fix/shader-table-family-6191
EagleBearerYS Oct 28, 2026
5b81551
Merge #9457's main merge into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Oct 28, 2026
ca14648
test(agc): stop asserting that an S# with another consumer is refused
EagleBearerYS Oct 28, 2026
24d5cbb
Merge #7395's test-only commit into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 28, 2026
8862055
Merge #8939's merge into fix/shader-table-family-6191
EagleBearerYS Oct 28, 2026
5aa0ca4
Merge #9457's merge into fix/shader-nested-table-shared-vsharp-reuse
EagleBearerYS Oct 28, 2026
ca5ba62
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 28, 2026
408401b
Merge #7395's main merge into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 28, 2026
9a44f18
Merge #8939's merge into fix/shader-table-family-6191
EagleBearerYS Oct 28, 2026
e3196d5
Merge #9457's merge into fix/shader-nested-table-shared-vsharp-reuse
EagleBearerYS Oct 28, 2026
d908758
test(shader): stop requiring nested tables with shared words to be re…
EagleBearerYS Oct 29, 2026
86d97d9
Merge feature/nested-resource-tables into feat/shader-nested-sampler-…
EagleBearerYS Oct 29, 2026
e04a705
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 29, 2026
238806d
Merge feat/shader-nested-sampler-tables into fix/shader-pointer-key-l…
EagleBearerYS Oct 29, 2026
3e2ebbb
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 29, 2026
4830d6e
Merge fix/shader-pointer-key-lane-masks into fix/shader-table-family-…
EagleBearerYS Oct 29, 2026
19bed84
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 29, 2026
7147fd7
Merge fix/shader-table-family-6191 into fix/shader-nested-table-share…
EagleBearerYS Oct 29, 2026
4e6a2bf
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 29, 2026
4769d5a
test(shader): drop the refusal wording from the nested table summary …
EagleBearerYS Oct 29, 2026
ffa34ec
Merge feat/shader-nested-sampler-tables into fix/shader-pointer-key-l…
EagleBearerYS Oct 29, 2026
31bd0de
Merge fix/shader-pointer-key-lane-masks into fix/shader-table-family-…
EagleBearerYS Oct 29, 2026
eddf966
Merge fix/shader-table-family-6191 into fix/shader-nested-table-share…
EagleBearerYS Oct 29, 2026
13c1955
Merge main into fix/shader-pointer-key-lane-masks
EagleBearerYS Oct 30, 2026
480c25a
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 30, 2026
7a36893
Merge fix/shader-pointer-key-lane-masks into fix/shader-table-family-…
EagleBearerYS Oct 30, 2026
24ff84d
Merge fix/shader-table-family-6191 into fix/shader-nested-table-share…
EagleBearerYS Oct 30, 2026
94a16af
Merge feature/nested-resource-tables into feat/shader-nested-sampler-…
EagleBearerYS Oct 30, 2026
f4781de
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Oct 30, 2026
967f0db
fix(shader): check the descriptor epoch for a lone nested sampler table
EagleBearerYS Oct 30, 2026
1f158eb
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Oct 31, 2026
4eaf19b
Merge main into fix/shader-table-family-6191
oneandonlydean Oct 31, 2026
3d14230
Merge #7395's merge of main into fix/shader-pointer-key-lane-masks
EagleBearerYS Nov 1, 2026
a5efbc3
Merge #9457's merge of main into fix/shader-nested-table-shared-vshar…
EagleBearerYS Nov 1, 2026
5fdf20f
test(agc): put libc on PATH for both nested snapshot retry tests on W…
EagleBearerYS Nov 1, 2026
df80d9b
Merge #7395's 5fdf20fc3d into fix/shader-pointer-key-lane-masks
EagleBearerYS Nov 1, 2026
9c765e7
Merge fix/shader-pointer-key-lane-masks into fix/shader-table-family-…
EagleBearerYS Nov 1, 2026
49f6939
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Nov 1, 2026
3283b23
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Nov 2, 2026
87984fe
Merge #7395's main merge into fix/shader-pointer-key-lane-masks
EagleBearerYS Nov 2, 2026
04d09ee
Merge #8939's main merge into fix/shader-table-family-6191
EagleBearerYS Nov 2, 2026
8bcf1dd
Merge #9457's main merge into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Nov 2, 2026
172dd67
fix(shader): give this PR's recompiler change its own disk cache form…
EagleBearerYS Nov 2, 2026
6cb37cc
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Nov 2, 2026
afb123a
Merge #7395's main merge into fix/shader-pointer-key-lane-masks
EagleBearerYS Nov 2, 2026
0a4f7cd
Merge #8939's main merge into fix/shader-table-family-6191
EagleBearerYS Nov 2, 2026
a12bac5
Merge #9457's main merge into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Nov 2, 2026
58ebe4b
Merge main into fix/shader-pointer-key-lane-masks
EagleBearerYS Nov 3, 2026
63b5c09
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Nov 3, 2026
7aa70b1
Merge main into fix/shader-table-family-6191
EagleBearerYS Nov 3, 2026
6b38153
Merge main into fix/shader-nested-table-shared-vsharp-reuse
EagleBearerYS Nov 3, 2026
4d820bd
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Nov 4, 2026
014d1e3
docs(shader): note that a nested child's T# skips registered views
EagleBearerYS Nov 4, 2026
9eab037
Merge #7395's e94fb3f29d into fix/shader-pointer-key-lane-masks
EagleBearerYS Nov 4, 2026
20cc916
Merge #8939's 4769d4a4b3 into fix/shader-table-family-6191
EagleBearerYS Nov 4, 2026
ebaa9b1
Merge #9457's 6e403b4ad2 into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Nov 4, 2026
0ce8d17
Merge main into feat/shader-nested-sampler-tables
EagleBearerYS Nov 7, 2026
c9de9a9
Merge #7395's 0ce8d173a3 into fix/shader-pointer-key-lane-masks
EagleBearerYS Nov 7, 2026
e75a710
Merge #8939's c9de9a962c into fix/shader-table-family-6191
EagleBearerYS Nov 7, 2026
32a8525
Merge #9457's e75a7104b9 into fix/shader-nested-table-shared-vsharp-r…
EagleBearerYS Nov 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions core/libs/prx/libSceAgcDriver/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2493,6 +2493,28 @@ if(BUILD_TESTING)
set_tests_properties(agc_driver_native_depth_clears agc_driver_native_depth_clear_refusals PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$<TARGET_FILE_DIR:libc>")
endif()
set_tests_properties(agc_sparse_buffer_holes PROPERTIES TIMEOUT 30)
add_test(NAME agc_driver_nested_image_table COMMAND agc_driver_image_table_tests --nested)
add_test(NAME agc_driver_nested_image_table_large COMMAND agc_driver_image_table_tests --nested-large)
add_test(NAME agc_driver_nested_image_table_budget COMMAND agc_driver_image_table_tests --nested-budget)
add_test(NAME agc_driver_nested_sampler_table COMMAND agc_driver_image_table_tests --nested-sampler)
add_test(NAME agc_driver_pointer_phi_sampler_table COMMAND agc_driver_image_table_tests --pointer-phi-sampler)
add_test(NAME agc_driver_pointer_phi_ballot_table COMMAND agc_driver_image_table_tests --pointer-phi-ballot)
add_test(NAME agc_driver_pointer_phi_copies_table COMMAND agc_driver_image_table_tests --pointer-phi-copies)
add_test(NAME agc_driver_pointer_phi_lane_and_table COMMAND agc_driver_image_table_tests --pointer-phi-lane-and)
add_test(NAME agc_driver_pointer_phi_high_table COMMAND agc_driver_image_table_tests --pointer-phi-high)
add_test(NAME agc_driver_pointer_phi_high_second_table COMMAND agc_driver_image_table_tests --pointer-phi-high-second)
add_test(NAME agc_driver_pointer_phi_high_second_lane_table COMMAND agc_driver_image_table_tests --pointer-phi-high-second-lane)
add_test(NAME agc_driver_pointer_phi_lane_not_table COMMAND agc_driver_image_table_tests --pointer-phi-lane-not)
add_test(NAME agc_driver_pointer_vsharp_select_table COMMAND agc_driver_image_table_tests --pointer-vsharp-select)
add_test(NAME agc_driver_pointer_hop_table COMMAND agc_driver_image_table_tests --pointer-hop)
add_test(NAME agc_driver_pointer_vsharp_fixed_table COMMAND agc_driver_image_table_tests --pointer-vsharp-fixed)
add_test(NAME agc_driver_pointer_vsharp_fixed_offset_table COMMAND agc_driver_image_table_tests --pointer-vsharp-fixed-offset)
add_test(NAME agc_driver_pointer_vsharp_shared_table COMMAND agc_driver_image_table_tests --pointer-vsharp-shared)
add_test(NAME agc_driver_pointer_vsharp_shared_reuse_table COMMAND agc_driver_image_table_tests --pointer-vsharp-shared-reuse)
set_tests_properties(agc_driver_nested_image_table agc_driver_nested_image_table_large agc_driver_nested_image_table_budget agc_driver_nested_sampler_table agc_driver_pointer_phi_sampler_table agc_driver_pointer_phi_ballot_table agc_driver_pointer_phi_copies_table agc_driver_pointer_phi_lane_and_table agc_driver_pointer_phi_high_table agc_driver_pointer_phi_high_second_table agc_driver_pointer_phi_high_second_lane_table agc_driver_pointer_phi_lane_not_table agc_driver_pointer_vsharp_select_table agc_driver_pointer_hop_table agc_driver_pointer_vsharp_fixed_table agc_driver_pointer_vsharp_fixed_offset_table agc_driver_pointer_vsharp_shared_table agc_driver_pointer_vsharp_shared_reuse_table PROPERTIES ENVIRONMENT "ANYPS5_NO_SHADER_CACHE=1;APS5_NO_PIPELINE_JOURNAL=1" SKIP_RETURN_CODE 77 TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
if(WIN32)
set_tests_properties(agc_driver_nested_image_table agc_driver_nested_image_table_large agc_driver_nested_image_table_budget agc_driver_nested_sampler_table agc_driver_pointer_phi_sampler_table agc_driver_pointer_phi_ballot_table agc_driver_pointer_phi_copies_table agc_driver_pointer_phi_lane_and_table agc_driver_pointer_phi_high_table agc_driver_pointer_phi_high_second_table agc_driver_pointer_phi_high_second_lane_table agc_driver_pointer_phi_lane_not_table agc_driver_pointer_vsharp_select_table agc_driver_pointer_hop_table agc_driver_pointer_vsharp_fixed_table agc_driver_pointer_vsharp_fixed_offset_table agc_driver_pointer_vsharp_shared_table agc_driver_pointer_vsharp_shared_reuse_table PROPERTIES ENVIRONMENT_MODIFICATION "PATH=path_list_prepend:$<TARGET_FILE_DIR:libc>")
endif()
add_test(NAME agc_pipeline_journal COMMAND agc_driver_graphics_tests --pipeline-journal)
add_test(NAME agc_pipeline_journal_long_paths COMMAND agc_driver_graphics_tests --pipeline-journal-long-paths)
set_tests_properties(agc_pipeline_journal_long_paths PROPERTIES TIMEOUT 30 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}")
Expand Down
102 changes: 100 additions & 2 deletions core/libs/prx/libSceAgcDriver/tests/ShaderDiskCache.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "ShaderDiskCache.hpp"
#include "ImageTableAbi.hpp"
#include "CacheKey.hpp"
#include "ShaderCachePack.hpp"
#include "VertexInputSpecialization.hpp"
Expand Down Expand Up @@ -1626,6 +1627,7 @@ struct PlanFixture {
ShaderStage stage = ShaderStage::Compute;
std::uint64_t codeAddress = 0;
std::uint32_t waveSize = 64;
bool groupId = false;
std::vector<std::uint32_t> code;
std::vector<std::uint32_t> userData;
std::vector<std::pair<std::uint64_t, std::vector<std::uint32_t>>> regions;
Expand All @@ -1642,7 +1644,7 @@ struct PlanFixture {
request.context.waveSize = waveSize;
request.context.userDataBaseRegister = 0;
request.context.userData = userData;
if (stage == ShaderStage::Compute) request.context.compute = ShaderComputeStageInfo{{waveSize, 1u, 1u}, 0u, {false, false, false}, false, 1u};
if (stage == ShaderStage::Compute) request.context.compute = ShaderComputeStageInfo{{waveSize, 1u, 1u}, 0u, {groupId, false, false}, false, 1u};
request.context.pixel = pixel;
request.context.memory = memory;
request.target.vulkanVersion = 0x00401000u;
Expand Down Expand Up @@ -1742,6 +1744,60 @@ std::vector<PlanFixture> planFixtures() {
place(palette, 0x18u, imageWords(PlanTextureAddress + 0x100u));
add("pointer image table", 64, {0xf4080200u, 0xfa000000u, 0xf4080700u, 0xfa000010u, 0xf4080800u, 0xfa000020u, 0x7e200500u, 0x8f108210u, 0xf4200444u, 0x20000000u, 0x8711ff11u, 0x000000ffu, 0x8f128511u, 0xf40c0900u, 0x24000040u, 0xf09c0f08u, 0x01090000u, 0xe0700000u, 0x80070000u, 0xbf810000u}, srtPointer, {{PlanSrtAddress, palette}, {PlanMaterialAddress, {0u, 1u, 0u, 1u, 0u, 0u, 0u, 0u}}});

std::vector<std::uint32_t> nestedSrt(16u, 0u);
place(nestedSrt, 0u, bufferWords(PlanTableAddress, 16u, 4u));
place(nestedSrt, 4u, bufferWords(PlanMaterialAddress, 0u, 32u));
place(nestedSrt, 8u, bufferWords(PlanOutputAddress, 0u, 4096u));
std::vector<std::uint32_t> parents(16u, 0u);
place(parents, 2u, {static_cast<std::uint32_t>(PlanPointerAddress), static_cast<std::uint32_t>(PlanPointerAddress >> 32u)});
place(parents, 6u, {static_cast<std::uint32_t>(PlanPointerAddress + 256u), static_cast<std::uint32_t>(PlanPointerAddress >> 32u)});
std::vector<std::uint32_t> nestedBuffers(128u, 0u);
place(nestedBuffers, 40u, bufferWords(PlanPayloadAddress, 64u, 1u));
place(nestedBuffers, 104u, bufferWords(PlanPayloadAddress + 64u, 64u, 1u));
std::vector<std::uint32_t> nestedImages(32u, 0u);
place(nestedImages, 0u, imageWords(PlanTextureAddress));
place(nestedImages, 8u, imageWords(PlanTextureAddress + 256u));
place(nestedImages, 16u, imageWords(PlanTextureAddress + 256u));
place(nestedImages, 24u, imageWords(PlanTextureAddress + 512u));
std::vector<std::uint32_t> nestedCode{0xf4080100u, 0xfa000000u, 0xf4080200u, 0xfa000010u, 0xf4080700u, 0xfa000020u, 0xf4080800u, 0xfa000030u,
0x8f108302u, 0xf4200444u, 0x20000000u, 0xf4200504u, 0x20000004u, 0x8f128411u, 0x8f148514u,
0xf4240b02u, 0x24000008u, 0xf4080616u, 0xfa0000a0u, 0xf42c090cu, 0x28000000u,
0x360200bfu, 0x7e020d01u, 0x060202f0u, 0x100202ffu, 0x3c800000u, 0x7e0402ffu, 0x3e000000u, 0xf09c0f08u,
0x01090401u, 0x7e120202u, 0x34101286u, 0x4a101100u, 0x34101084u, 0xe0781000u, 0x80070408u, 0xbf810000u,};
nestedCode.insert(nestedCode.begin() + 13u, 0x87118311u);
nestedCode.insert(nestedCode.begin() + 15u, 0x87148114u);
add("nested pointer image table", 64u, std::move(nestedCode), srtPointer, {{PlanSrtAddress, nestedSrt}, {PlanTableAddress, parents}, {PlanPointerAddress, nestedBuffers}, {PlanPayloadAddress, nestedImages}, {PlanMaterialAddress, {0u, 0u, 0u, 1u, 1u, 0u, 1u, 1u}}});
fixtures.back().groupId = true;
std::vector<std::uint32_t> samplerSrt(20u, 0u);
std::copy(nestedSrt.begin(), nestedSrt.end(), samplerSrt.begin());
place(samplerSrt, 12u, imageWords(PlanTextureAddress));
const std::vector<std::uint32_t> pointClamp{0x92u, 0x400000u, 0u, 0u};
const std::vector<std::uint32_t> pointWrap{0u, 0x400000u, 1u << 24u, 0u};
std::vector<std::uint32_t> nestedSamplers(32u, 0u);
place(nestedSamplers, 0u, pointWrap);
place(nestedSamplers, 4u, pointClamp);
place(nestedSamplers, 16u, pointClamp);
place(nestedSamplers, 20u, pointWrap);
std::vector<std::uint32_t> samplerCode{0xf4080100u, 0xfa000000u, 0xf4080200u, 0xfa000010u, 0xf4080700u, 0xfa000020u, 0xf40c0900u, 0xfa000030u,
0x8f108302u, 0xf4200444u, 0x20000000u, 0xf4200504u, 0x20000004u, 0x8f128411u, 0x8f148414u,
0xf4240b02u, 0x24000008u, 0xf4080616u, 0xfa0000a0u, 0xf428080cu, 0x28000000u,
0x360200bfu, 0x7e020d01u, 0x060202f0u, 0x100202ffu, 0x3c800000u, 0x060202f2u, 0x7e0402ffu, 0x3e000000u, 0xf09c0f08u,
0x01090401u, 0x7e120202u, 0x34101286u, 0x4a101100u, 0x34101084u, 0xe0781000u, 0x80070408u, 0xbf810000u,};
samplerCode.insert(samplerCode.begin() + 13u, 0x87118311u);
samplerCode.insert(samplerCode.begin() + 15u, 0x87148114u);
add("nested pointer sampler table", 64u, std::move(samplerCode), srtPointer, {{PlanSrtAddress, samplerSrt}, {PlanTableAddress, parents}, {PlanPointerAddress, nestedBuffers}, {PlanPayloadAddress, nestedSamplers}, {PlanMaterialAddress, {0u, 0u, 0u, 1u, 1u, 0u, 1u, 1u}}});
fixtures.back().groupId = true;
std::vector<std::uint32_t> pointees(128u, 0u);
place(pointees, 8u, pointWrap);
place(pointees, 72u, pointClamp);
std::vector<std::uint32_t> pointerCode{0xf4080100u, 0xfa000000u, 0xf4080200u, 0xfa000010u, 0xf4080700u, 0xfa000020u, 0xf40c0900u, 0xfa000030u,
0x8f108302u, 0xf4200444u, 0x20000000u, 0x8f128411u, 0xf4240b02u, 0x24000008u, 0xf4080816u, 0xfa000020u,
0x360200bfu, 0x7e020d01u, 0x060202f0u, 0x100202ffu, 0x3c800000u, 0x060202f2u, 0x7e0402ffu, 0x3e000000u, 0xf09c0f08u,
0x01090401u, 0x7e120202u, 0x34101286u, 0x4a101100u, 0x34101084u, 0xe0781000u, 0x80070408u, 0xbf810000u,};
pointerCode.insert(pointerCode.begin() + 14u, {0xbf068011u, 0xbf840002u, 0xbeac03ffu, 0x000000eau});
add("pointer phi sampler table", 64u, std::move(pointerCode), srtPointer, {{PlanSrtAddress, samplerSrt}, {PlanTableAddress, parents}, {PlanPointerAddress, pointees}, {PlanMaterialAddress, {1u, 0u, 0u, 0u, 1u, 0u, 0u, 0u}}});
fixtures.back().groupId = true;

PlanFixture fragment;
fragment.name = "fragment parameters";
fragment.stage = ShaderStage::Fragment;
Expand Down Expand Up @@ -1851,7 +1907,7 @@ IrResourcePlan handBuiltPlan() {
DescriptorSource table;
table.dwordCount = 8u;
table.dwords[0] = &readConst(3);
table.tableColumn = TableColumn{2u, 32u, 16u, 4u, 8u, 0xffu, false, true, {KeyDomain{3u, 4u, 16u, false}, KeyDomain{2u, 8u, 4u, true}}, false};
table.tableColumn = TableColumn{2u, 32u, 16u, 4u, 8u, 0xffu, false, true, false, {KeyDomain{3u, 4u, 16u, false}, KeyDomain{2u, 8u, 4u, true}}, false};
table.tableColumn->selected = true;
table.tableColumn->selection = 2u;
table.tableColumn->pointerHops = {PointerHop{0u, 0x10u}, PointerHop{8u, 0x20u}};
Expand Down Expand Up @@ -2004,6 +2060,31 @@ void mutateWords(std::vector<std::uint32_t>& words, std::mt19937& random) {
}
}

void verifyNestedResolutionReuse(const IrResourcePlan& plan, const ResourceSnapshot& snapshot) {
auto info = plan.info;
ResourceMaterializer::PrepareImageModes(info);
constexpr std::uint64_t MemoKey = 0x6e6573746564u;
const auto first = ResourceMaterializer::ResolveImageTablesShared(info, snapshot, MemoKey);
const auto same = ResourceMaterializer::ResolveImageTablesShared(info, snapshot, MemoKey);
if (std::getenv("APS5_NO_TABLE_RESOLUTION_REUSE") == nullptr) require(first == same, "nested table resolution: an unchanged snapshot was not shared");
auto changed = snapshot;
auto codes = changed.tables.nested.at(0).codes.Copy();
require(!codes.empty(), "nested table resolution: the child fixture is empty");
codes[0] = ImageTableAbi::PoisonCode(ImageTableAbi::OutsideDomainPoison);
changed.tables.nested[0].codes = SharedValues<std::uint32_t>(std::move(codes));
const auto child = ResourceMaterializer::ResolveImageTablesShared(info, changed, MemoKey);
const auto freshChild = ResourceMaterializer::ResolveImageTables(info, changed);
require(child->map == freshChild.map && child->map != first->map, "nested table resolution: changing only a child reused the old map");
changed = snapshot;
auto pointers = changed.tables.tables.at(0).pointers.Copy();
require(!pointers.empty(), "nested table resolution: the pointer fixture is empty");
pointers[0] += 0x120u;
changed.tables.tables[0].pointers = SharedValues<std::uint64_t>(std::move(pointers));
const auto pointer = ResourceMaterializer::ResolveImageTablesShared(info, changed, MemoKey);
const auto freshPointer = ResourceMaterializer::ResolveImageTables(info, changed);
require(pointer->map == freshPointer.map && pointer->map != first->map, "nested table resolution: changing only a pointer reused the old map");
}

std::size_t verifyRoundTripRuntimes(const IrResourcePlan& plan, const IrResourcePlan& decoded, const PlanFixture& fixture, std::uint32_t seed, const std::string& what) {
std::mt19937 random(seed);
std::size_t succeeded = 0;
Expand All @@ -2022,6 +2103,7 @@ std::size_t verifyRoundTripRuntimes(const IrResourcePlan& plan, const IrResource
const auto original = materializePlan(plan, runtime);
const auto loaded = materializePlan(decoded, runtime);
require(sameMaterialization(original, loaded), what + ": runtime " + std::to_string(run) + " materialized differently from the decoded plan (" + original.error + " / " + loaded.error + ")");
if (run == 0u && original.ok && !original.snapshot.tables.nested.empty()) verifyNestedResolutionReuse(plan, original.snapshot);
if (original.ok) ++succeeded;
}
return succeeded;
Expand Down Expand Up @@ -2103,7 +2185,11 @@ void verifyMalformedPlans() {
rejects("a uniform fill of five words", [](IrResourcePlan& plan) { plan.uniformFill.fill.words = 5u; });
rejects("an image table heap past the sources", [](IrResourcePlan& plan) { plan.descriptorSources[1].tableColumn->heapSource = 4u; });
rejects("an image table key past the sources", [](IrResourcePlan& plan) { plan.descriptorSources[1].tableColumn->keyDomains[1].source = 4u; });
rejects("a buffer table with eight dwords", [](IrResourcePlan& plan) { plan.descriptorSources[1].tableColumn->buffer = true; });
rejects("an image table cycle", [](IrResourcePlan& plan) { plan.descriptorSources[1].tableColumn->heapSource = 1u; });
rejects("an image table parent that is not a buffer", [](IrResourcePlan& plan) { plan.descriptorSources[2].tableColumn = *plan.descriptorSources[1].tableColumn; });
rejects("an image table selection past the sources", [](IrResourcePlan& plan) { plan.descriptorSources[1].tableColumn->selection = 4u; });
rejects("a pointer-keyed table that is not indirect", [](IrResourcePlan& plan) { plan.descriptorSources[1].tableColumn->pointerKeyed = true; });
auto foreign = handBuiltPlan();
IrValue stray(IrOpcode::Void, IrType::U32, 99u);
foreign.srtReads[0].value = &stray;
Expand All @@ -2127,6 +2213,18 @@ void verifyPlanRoundTrip() {
require(phi.IsPhi() && phi.PhiBlockCount() == 2u && phi.PhiBlock(0)->Id() == 3u && phi.PhiBlock(1)->Id() == 7u && phi.Argument(1)->ImmediateU32() == 0u, "the decoded phi lost its blocks or operands");
require(handDecoded.uniformFill.values[0] == handDecoded.uniformFill.values[1] && handDecoded.uniformFill.values[0] != nullptr && handDecoded.uniformFill.values[2] == nullptr, "the decoded uniform fill lost its shared or null values");
require(samePlan(handBuilt, handDecoded), "the decoded hand-built plan differs from the plan in a field or a value");
auto bufferTable = handBuiltPlan();
bufferTable.descriptorSources[1].tableColumn->buffer = true;
bufferTable.descriptorSources[1].tableColumn->dwordCount = 4u;
const auto bufferBytes = encodedPlan(bufferTable);
IrResourcePlan bufferDecoded;
require(bufferBytes != handBytes && ShaderDiskCache::DecodePlan(bufferBytes, bufferDecoded) && samePlan(bufferTable, bufferDecoded), "the nested buffer column changed in a disk-cache round trip");
auto pointerTable = handBuiltPlan();
pointerTable.descriptorSources[1].tableColumn->indirect = true;
pointerTable.descriptorSources[1].tableColumn->pointerKeyed = true;
const auto pointerBytes = encodedPlan(pointerTable);
IrResourcePlan pointerDecoded;
require(pointerBytes != handBytes && ShaderDiskCache::DecodePlan(pointerBytes, pointerDecoded) && samePlan(pointerTable, pointerDecoded) && pointerDecoded.descriptorSources[1].tableColumn->pointerKeyed, "the pointer-keyed column changed in a disk-cache round trip");
PlanFixture handFixture;
handFixture.userData = {static_cast<std::uint32_t>(PlanSrtAddress), static_cast<std::uint32_t>(PlanSrtAddress >> 32u), 0u, 0u};
std::vector<std::uint32_t> handSrt(16, 0u);
Expand Down
Loading
Loading