Skip to content

fix(agc): keep at most 4 GiB of the host heap from the host import budget - #7844

Merged
oneandonlydean merged 3 commits into
boykopovar:mainfrom
Mouhand-Kaddo:fix/agc-host-import-reserve-cap
Nov 1, 2026
Merged

oneandonlydean merged 3 commits into
boykopovar:mainfrom
Mouhand-Kaddo:fix/agc-host-import-reserve-cap

Conversation

@Mouhand-Kaddo

@Mouhand-Kaddo Mouhand-Kaddo commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

What

Demon's Souls (PPSA01342) stops on main while loading into the tutorial level, right after the intro cinematic, on a 32 GiB Linux machine (RX 6900 XT, RADV):

[gpu] host import budget: 7893 MiB live of 7955 MiB (APS5_HOST_IMPORT_MIB); 294335 imports (615986 MiB) refused so far, last 0x2a2b00000+0x38170000
FATAL: an address-based build copies 359 MiB of 1 registered ranges, past 64 MiB (APS5_ADDRESS_COPY_MAX_MIB); the largest: 0x260100000+0x16730000 (359.2 MiB committed, outside the write-watched arena)

#6472 keeps the larger of 2 GiB and half the largest host heap out of the import budget. That fixed the 16 GiB machine it was measured on (heap 8128 MiB, about 4 GiB kept back). The same half also applies to larger heaps, so a 32 GiB machine (RADV heap 15911 MiB) went from 13863 MiB to 7955 MiB. With APS5_TRACE_HOST_IMPORT, this title holds up to 10466 MiB of live imports at once while it loads the level, so the address-based build's imports are refused and the copy limit aborts.

The reserve is now half the heap kept between 2 and 4 GiB:

-reserve = max(2 GiB, hostHeap / 2)
+reserve = max(2 GiB, min(hostHeap / 2, 4 GiB))
 budget  = min(max(6 GiB, physical / 2), hostHeap - reserve)
host heap main this PR
3 GiB 1 GiB 1 GiB
8128 MiB (16 GiB machine, #6472's case) 4064 MiB 4064 MiB
15911 MiB (32 GiB, RADV here) 7955 MiB 11815 MiB
16 GiB 8 GiB 12 GiB
32 GiB (64 GiB machine) 16 GiB 28 GiB

Heaps up to 8 GiB keep main's budget. APS5_HOST_IMPORT_MIB still overrides it, and #6479 (lowering the budget after vkAllocateMemory failures) composes with this: it caps the effective budget, this sets the default it starts from. #7808 rewrites the APS5_HOST_IMPORT_MIB row of ENVIRONMENT.md; I left that row alone to avoid the conflict. The debt entry is updated.

Risk: two-way door, one constant. A machine with a host heap above 8 GiB pins more host memory for imports before the least-recently-used ones are retired. On the run below, total GTT use peaked at 12.6 of 15.9 GiB.

Tested

Linux 7.2.11 (EndeavourOS), i7-13700K, 32 GiB, RX 6900 XT with Mesa 26.2.5 RADV, GCC 16.2.1, Release, BUILD_TESTING=ON, main 36f60df; rebased onto main 98db779 on 2026-10-20 (only the debt entry conflicted: main had extended the same paragraph, so its text is kept with this PR's reserve sentence applied). Rebased again onto main 3a2c51a on 2026-10-25: the debt entry conflicted again, because main dropped its sentence on address-based builds evicting (now its own "Piece-split ranges" entry), so main's text is kept with this PR's reserve sentence applied. On Windows 11 (WinLibs GCC 15.2.0, RX 6900 XT, driver 32.0.21045.16010), ctest -R agc -j 8 on the rebased branch passes 1037 of 1040; agc_host_import_cut_lifetime, agc_driver_depth_plane_partial_store and agc_driver_sample_order_grid_reference fail the same way on main 3a2c51a there.

  • agc_driver_graphics (hostImportBudgetTests): with only the test change on main it fails with a 32 GiB machine does not keep 4 GiB of its 16 GiB host heap from imports; with the change it passes. The 8128 MiB and 3 GiB cases are unchanged and still pass. Rerun on 98db779: agc_driver_graphics_tests with main's GuestBufferMemory.cpp exits 1 with the same message, and with this PR it prints Graphics validation tests passed.
  • agc_host_import_unmap, agc_host_import_retirement, agc_host_import_retire, agc_host_import_sparse, agc_driver_bda_anchor_reads, agc_driver_bda_span_reads pass. agc_driver_bda_device fails the same way on main and on this branch on this GPU (an anchored BDA read differs from the same read through the lookups at anchor ...); it does not use the budget.
  • python3 tools/check_conventions.py --base upstream/main passes.
  • Demon's Souls PPSA01342 01.004.000, relinked with --to-intel, continuing a saved character (main menu → Continue → Continue Offline), 1080p (+r_Wants4K = WantsPerf in a copy of the renderconfig_ps5_*.txt files), no environment overrides:
    • main e12c913 (same HostImportBudget): the stop above while loading the level, exit 134 (one run).
    • The same main with APS5_HOST_IMPORT_MIB=13862 (the old default): reaches the level in both runs, peak 10466 MiB live imports, no refusal.
    • This PR, no override: no import refused, peak 10490 MiB live, the level loads into Outpost Passage with the HUD, and the left stick moves the character (level, after holding the stick right). The level runs at well under 1 fps; that is separate.
  • A main run with APS5_HOST_IMPORT_MIB=11815 (this PR's value) crashed in title code while loading: a guest heap pointer had been overwritten with RGBA16F texel data. No import was refused in it, so it is a separate bug, which I'm investigating.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: PPSA01342 Demon's Souls (PPSA01341) #1283 (loading the tutorial level on 32 GiB machines)
  • GPUs tested: AMD Radeon RX 6900 XT, Mesa 26.2.5 RADV, Linux 7.2.11
  • AI-assisted: yes

@github-actions github-actions Bot added the unblocks title Names a title ID on the Unblocks line label Oct 19, 2026
@github-actions

github-actions Bot commented Oct 19, 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 1395 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 4040 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 5021 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 5925 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6194 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6197 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 6223 docs/dev/debt/libSceAgcDriver.md
PR 6235 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6273 docs/dev/debt/libSceAgcDriver.md
PR 6280 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6300 docs/dev/debt/libSceAgcDriver.md
PR 6412 docs/dev/debt/libSceAgcDriver.md
PR 6481 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6548 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6808 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6918 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 6970 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 6977 docs/dev/debt/libSceAgcDriver.md
PR 7048 docs/dev/debt/libSceAgcDriver.md
PR 7256 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7410 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 7449 docs/dev/debt/libSceAgcDriver.md
PR 7457 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 7514 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 7604 docs/dev/debt/libSceAgcDriver.md
PR 7642 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7978 docs/dev/debt/libSceAgcDriver.md
PR 8592 docs/dev/debt/libSceAgcDriver.md
PR 8707 docs/dev/debt/libSceAgcDriver.md
PR 8874 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9012 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 9020 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9335 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9356 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9387 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9432 docs/dev/debt/libSceAgcDriver.md
PR 9489 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9508 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9592 docs/dev/debt/libSceAgcDriver.md
PR 9712 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
PR 9852 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 9915 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 9950 docs/dev/debt/libSceAgcDriver.md
PR 10025 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 10233 docs/dev/debt/libSceAgcDriver.md
PR 10256 docs/dev/debt/libSceAgcDriver.md
PR 10359 docs/dev/debt/libSceAgcDriver.md
PR 10442 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 11551 core/libs/prx/libSceAgcDriver/tests/Graphics.cpp
docs/dev/debt/libSceAgcDriver.md
PR 12120 docs/dev/debt/libSceAgcDriver.md
PR 12157 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 12764 docs/dev/debt/libSceAgcDriver.md
PR 13148 core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp
PR 14212 docs/dev/debt/libSceAgcDriver.md

@github-actions github-actions Bot added docs agc libSceAgc* labels Oct 19, 2026
@LeandroLP23

Copy link
Copy Markdown
Contributor

Windows and AMD's own driver. AMD Radeon 860M (RDNA 3.5, 1002:1114), driver 32.0.13058.8001, Windows 11, WinLibs GCC 15.2.0, Release, ANYPS5_NO_SHADER_CACHE=1. Head merged into main 118266a (clean merge). "Main's sources" means this PR's test files over main's other files.

Test This head main's sources
agc_driver_graphics pass, 3 of 3 fails: a 32 GiB machine does not keep 4 GiB of its 16 GiB host heap from imports
agc_host_import_unmap, agc_host_import_retirement, agc_host_import_retire pass, 3 of 3 pass
agc_host_import_sparse skips skips

AI-assisted: yes (Claude Code)

@fogydes fogydes 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.

Reviewed the change:

  • Capping the host heap reserve at 4 GiB (std::min<std::uint64_t>(hostHeap / 2, 4096ull << 20u)) prevents 32 GiB hosts with 16 GiB host heaps from clamping the import budget below the 10,466 MiB working set required by memory-intensive titles (PPSA24191), while preserving the 2 GiB minimum floor for smaller 16 GiB configurations.
  • The unit test cases in Graphics.cpp explicitly guard both 16 GiB, 32 GiB, and 15,911 MiB heap scenarios against regression.
  • Technical debt in docs/dev/debt/libSceAgcDriver.md updated accurately.
  • Confirmed independent hardware test results posted by @LeandroLP23 (AMD Radeon 860M) verifying agc_driver_graphics passes 3/3 on this head.
  • Zero comments added in code; Conventional Commits title; all CI checks pass.

Ready to merge.

AI-assisted: yes

@savvaniss

Copy link
Copy Markdown
Contributor

AMD and Intel Windows data: with this PR's test changes, agc_driver_graphics fails on main and passes with the PR, on an AMD RX 9070 XT and an Intel UHD 770.

Windows 11 Pro 26300, WinLibs GCC 15.2.0 r7, Release, every execution test built, ANYPS5_NO_SHADER_CACHE=1, serial CTest. Intel UHD Graphics 770 (8086:a780), driver 32.0.101.7088. AMD Radeon RX 9070 XT (1002:7550), driver 32.0.31041.1004, with VkCache emptied first. This head 096de7f53 merged into main 85029a00f. "Without" means only this PR's diff to tests/Graphics.cpp, applied to main 85029a00f.

Tests, ×3 UHD 770 RX 9070 XT
This head: the 29 tests built from tests/Graphics.cpp 29 of 29 pass 29 of 29 pass
Without agc_driver_graphics fails: a 32 GiB machine does not keep 4 GiB of its 16 GiB host heap from imports; the other 28 pass same

AI-assisted: yes (Claude Code)

@Celegans12

Copy link
Copy Markdown
Contributor

I ran into the same thing with Ghost of Yōtei (PPSA26344) on a 32 GiB Windows laptop with an NVIDIA GPU, so here's a second data point from another title and vendor. With #6472's rule the budget there comes out at 8,117 MiB. In a warm run from a save into the open world, imports started being refused as soon as the world began loading, 171,828 of them by the end of the run, and the environment only appeared in the frame dump at 492 s. The same build with the old 2 GiB reserve put back (about 14 GiB here) refused no import in a 1,408 s run, and the same frame showed the environment at 412 s.

I haven't run Yōtei with this PR's 4 GiB cap yet; it would give about 12 GiB on this machine. Our older notes put Yōtei's import working set at around 13 GiB, so it may still refuse some here, though far fewer than at 8 GiB. If it's useful, I can run your branch and post the refusal count.

One caveat: these runs are from our local tree (a main from this morning plus our Yōtei changes), not plain main. The two runs differ only in the reserve.

Details
  • Machine: Windows 11, i9-11900H, 32 GiB, NVIDIA GeForce RTX 3080 Laptop GPU, driver 610.62; host heap about 16 GiB.
  • With fix(agc): keep half the host heap out of the host import budget #6472's reserve: the budget (8,117 MiB) is full and refusals begin between 264 and 279 s, when the world starts loading; 9,654 refused imports (1.2 GiB) by frame 84 and 171,828 (about 150 GB of requests) by the end. Frame 88, the first with the environment, was read back at 492.3 s.
  • With a 2 GiB reserve, same save, settings and pad script: 0 host import budget / refused for the host heap lines in 1,408 s; frame 88 (environment complete) at 411.6 s.

@EdouardSence

EdouardSence commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Performance data from another title: on a 32 GiB Linux machine, #6472's budget makes ASTRO BOT about 2.5× slower, and this PR brings it back.

Setup: ASTRO BOT PPSA21567 01.019.000, -lvl hub_crashsite, no input. Linux 7.2.10 (CachyOS), Ryzen 7 7800X3D, 31 GiB RAM, RX 9070 XT, Mesa 26.2.4 RADV (host heap 16304 MiB). Headless gamescope at 3840×2160. APS5_NO_SNAPSHOT_CHECK=1, official trace APS5_TRACE_SECONDS=90:50, 180 s runs. Each build got a warm-up run first, and the main and override runs were interleaved.

Build Import budget presents (50 s) frame p50 / p90 / p99 ms GPU busy / present
main 12ee57a39, run 1 7807 MiB 210 234.5 / 298.3 / 370.4 92.2 ms
main 12ee57a39, run 2 7807 MiB 207 237.0 / 311.7 / 361.8 93.9 ms
main + APS5_HOST_IMPORT_MIB=11815, run 1 11815 MiB 524 94.5 / 102.7 / 107.1 56.3 ms
main + APS5_HOST_IMPORT_MIB=11815, run 2 11815 MiB 516 96.2 / 103.0 / 107.8 56.8 ms
main + this PR (ac03b41d4, clean merge), run 1 11518 MiB 521 95.2 / 103.0 / 108.8 56.6 ms
main + this PR, run 2 11518 MiB 509 97.3 / 106.9 / 110.0 61.1 ms

What happens on main: the scene keeps about 10.4 GiB of live imports, and the budget is 7807 MiB. On main the log ends with 7797 MiB live of 7807 MiB; 32 imports (51260 MiB) refused. The refused ranges then take device-local memory. VRAM use climbs to ~12.2 GiB of the 14.4 GiB budget, and the sampled texture cache drops to its 2048 MiB floor while the level holds ~2.5 GiB of sampled textures. So textures are evicted and recreated continuously, the same thrash @mrfelek measured in Sky Garden on #357. With this PR, VRAM use stays around 9.7 GiB, and the texture cache keeps 4.2 GiB under a 5.6 GiB budget.

How I found it: Crash Site went from p50 124 ms on aff725bf6 (2026-10-16) to 251 ms on 1e774a3b2. Rerunning the old build today still gives 126 ms, so the host is not the cause. A first-parent bisect narrowed it to the 25 merges between fd2ef7e28 (114 ms) and 8687da6c0 (249 ms), which include #6472. I stopped the bisect there because of the override result above: the budget alone accounts for the whole slowdown.

AI-assisted: yes (Claude Code)

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 19, 2026
@Mouhand-Kaddo
Mouhand-Kaddo force-pushed the fix/agc-host-import-reserve-cap branch from ac03b41 to 2af7b9b Compare October 20, 2026 06:43
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 20, 2026
@EdouardSence

Copy link
Copy Markdown
Contributor

Follow-up on the first level, Sky Garden (-lvl underwater_aerial_garden), same machine and builds as my comment above (Linux, RX 9070 XT 16 GB / RADV Mesa 26.2.4, 31 GiB RAM, ASTRO BOT PPSA21567 01.019.000). Headless, no input, level start, official trace APS5_TRACE_SECONDS=90:50, warm caches.

Build Frame p50 ms p90 ms GPU busy ms/present Texture cache budget
main 12ee57a 828.8 1110.7 255.2 2048 MiB (floor)
main + this PR, run 1 254.1 274.8 136.0 ~3.8–4.3 GiB
main + this PR, run 2 254.0 272.7 136.0 ~3.8–4.3 GiB
main + this PR + APS5_TEXTURE_CACHE_MIB=4096 (2 runs) 253.8 / 254.1 273.8 / 275.4 137.9 / 144.4 —
main + this PR + APS5_HOST_IMPORT_MIB=15000 255.1 275.5 145.6 ~4.4–5.0 GiB
  • On this level main is about 3.3× slower than with this PR (~1.2 FPS against ~3.9 FPS).
  • With the PR, neither a larger import budget nor a larger texture cache changes the frame time here, so on a 16 GB card the import budget is the only memory limit involved. The rest of the frame time is the existing draw cost.
  • One run for main, two for the PR.

Tested and written by Claude (AI assistant) on a contributor's machine.
AI-assisted: yes

@xXPBSXx

xXPBSXx commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

Windows data point for 2af7b9bfb merged onto main 9f4ddf7cf (clean, git merge-tree rc 0): Windows 10.0.19045, MinGW-w64 GCC 15.2.0, Release. ctest -N -R '^agc_driver_graphics$' lists exactly that one test; ctest --no-tests=error -R '^agc_driver_graphics$' was run three times per tree.

  • With the PR: passes 3 of 3 (9.9-11.2 s).
  • Same tree with core/libs/prx/libSceAgcDriver/Graphics/src/GuestBufferMemory.cpp restored to main (the new test cases kept): fails 3 of 3 (ordinary test failure, not a crash).
    Not tested: other platforms, a title run.
    AI-assisted (Claude Code).

@hugodearaujo

Copy link
Copy Markdown
Contributor

A data point from Linux with PRAGMATA (PPSA02530 01.200.000), where the default budget fills on a 32 GB machine.

Setup: Arch Linux, kernel 7.2.11, Ryzen 7 9800X3D, 32 GB RAM, Radeon RX 9070 XT 16 GB, Mesa 26.2.5 RADV. Host heap 0 is 15596 MiB, so the default budget is 7798 MiB on the base and 11500 MiB with this PR. Release build. The base is main e61a7c7 plus the open PRs this title needs to reach its opening cinematic (#10935, #8091, #10304, #6743, #6782, #10351, #7446, #6498, #9950, #10469, #10492, #10497, #11580, #4449). "With this PR" is the same tree with 31342e6 merged (clean merge). agc_driver_graphics passes on the merged tree.

Route: new game from the title menu (Standard difficulty), then the opening cinematic, Cross every 30 s, 1200 s per run, APS5_TRACE_SUMMARY_EVERY=10. Two shader cache states, each a fresh copy per run: "cold", where about 250 of the cinematic's pipelines are compiled during the run, and "warm".

cache build imports refused (shutdown line) presents/s from the difficulty confirm to the stop
cold base 218757 (611332 MiB, 174306 remembered) 1.13
cold this PR 0 1.31
warm base 54 (22 MiB) 1.17
warm this PR 0 1.33
  • On the base the budget stays full (7787 MiB live of 7798 MiB (the default; host heap 0 reports a budget of 15148 MiB and a usage of 11237 MiB)). Almost all refusals come from address-based builds (build 22644/218656/1); the last refused range in the budget lines is 0x202400000+0x30000000. With this PR the only budget line is ... which leaves imports 11456 MiB of the 11500 MiB of the default; the default stays until an import's vkAllocateMemory fails, and no import is refused.
  • The cinematic runs about 15% faster with this PR in both pairs (one run per arm).
  • All four runs then stop at the same cinematic frame, around 540-575 s, for a reason unrelated to the budget: the frame stays on screen while the title keeps presenting at about 3 fps (frame p50 334-344 ms in all four). So this PR does not change how far PRAGMATA gets here, but it removes the refusals.
  • An earlier base run with the cold cache showed a black screen instead of the frozen frame. It did not reproduce in the cold-cache base run above, so I do not attribute it to the budget.

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@Mouhand-Kaddo #11357 just landed on main and now conflicts with this PR in one place: the "Host import windows and budget" bullet in docs/dev/debt/libSceAgcDriver.md. Could you merge main and keep both edits there (your budget sentence plus the eviction sentences from #11357)? The code changes merge cleanly and are independent of each other. After the merge we'll run fresh CI on the new head. The open point about agc_host_import_sparse being skipped on CI is unchanged.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 27, 2026
…se/pr7844

# Conflicts:
#	docs/dev/debt/libSceAgcDriver.md
@Mouhand-Kaddo

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Merged main in 89d6a7c. The "Host import windows and budget" bullet now has both edits: this PR's budget sentence (half the heap, kept between 2 and 4 GiB) and the frame-based eviction text from #11357. Against main, this PR still changes only the budget sentence in the docs, GuestBufferMemory.cpp and the test. I resolved only the docs conflict and did not run a title on the merged head.

@thuanquang

thuanquang commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Correction (2026-10-30): the Persona 5 Royal pair below is not valid evidence (a harness fault drove both legs with an extra input driver); see the correction. The agc_host_import_sparse part stands.

@oneandonlydean Two notes on this head (89d6a7c).

agc_host_import_sparse skipped on CI. From the code, that test can't observe this change on any machine. It calls SetHostImportBudget(~std::uint64_t{0}) before its cases (HostImportSparseDmaBuf.cpp:407, a file this PR doesn't touch). configuredBudget() then returns that override (GuestBufferMemory.cpp:1726), and importBudget() returns it without calling HostImportBudget() (:1735-1736), the one function this PR changes (:4084). HostImportBudget() is checked directly by hostImportBudgetTests in agc_driver_graphics, which LeandroLP23, savvaniss and xXPBSXx showed above red with main's GuestBufferMemory.cpp and green with this PR's, on earlier heads with the same diff (096de7f, 2af7b9b). We can't run the sparse test here: it returns 77 on Windows (HostImportSparseDmaBuf.cpp:23-27), and our WSL has no /dev/udmabuf.

Persona 5 Royal (PPSA05110, own dump) with this head. Follow-up to our 10-25 comment, same machine, now on plain main with the GPU not shared and no profiling switch: main 3a2b919 (2026-10-28) against the same main with 89d6a7c merged (local merge ad27b32243; its diff to main is this PR's three files), each from its own clean build. Trace switches: only APS5_TRACE_SECONDS=560:4 and APS5_TRACE_DIR, no dropped events. The scripted input stops at the HUD, and the frame dumps inside both windows show the same in-game spot with the HUD up. One pair, main first:

presents/s frame p50 / p90, ms GPU busy, ms/present committer busy (trace_digest.py), ms/frame committer draws with a Resources.Complete: count / ms per frame peak private, whole 620 s run
main 13.1 73.7 / 88.8 48.6 52.3 9.7 / 25.1 21.68 GiB
this PR 16.7 58.9 / 71.5 40.3 34.7 4.7 / 3.6 18.67 GiB
  • Imports, from the one refusal line each run logs (in its first minute): on main 8128 of 8172 MiB live and one 768 MiB import refused (as on 10-25); with this PR 11443 of 12249 MiB live and one 1984 MiB import refused. The same lines report host heap 0 at 9119 vs 12879 MiB used of a 15577 MiB budget.
  • Resources.Complete (ShaderResources::buildComplete) itself takes 4.16 vs 0.12 ms per frame on the committer (per VideoOut.Flip, 52 and 66 in the windows). The queue worker's Driver.Draw.draw_enqueued step, which ends by handing a draw to the committer, takes 31.3 vs 18.2 ms per frame.
  • Not shown: only one pair, so no spread. Other-process CPU around main's window was 10.2 % (median; p90 16.8 %) against 5.2 %, above the 10 % limit we use for timing legs, so the frame-time columns are not a speed result (trace counters are less sensitive to that load than frame time, not immune). Frame dumps (one every 20 presents) ran through both windows. Three earlier legs (two main, one this PR) were stopped at 120 s by the same CPU check and rerun. Not tested: other titles, Linux, other GPUs. Traces, both summary lines and trace_digest.py output on request.

Setup: Windows 11 26200, Ryzen 5 5600X, 32 GiB, RX 6700 XT (AMD driver 26.10.1), WinLibs GCC 15.2.0 r7, Release.

AI-assisted: yes (Claude Code)

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 89d6a7c merged onto main 52c09d5 · tested 2026-10-29 09:29 UTC · 27 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,199 passed · 5 failed (0 new, 5 also fail on main) · 39 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,243 of 2,873 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (855 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) none
Failing on main too (5, not counted against this PR)
agc_compute_pipeline_inspection
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Passed on retry (1, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
agc_driver_pipelined_dispatch_item: Failed in the parallel run; also passed only on retry in 1 other runs in the last 7 days
Validation IDs already present on main (4 IDs in 405 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (405 tests): agc_compute_pipeline_replay, agc_driver, agc_driver_address_passes, agc_driver_address_passes_draw_transitions, agc_driver_address_passes_targets_split, agc_driver_alpha_to_coverage, agc_driver_array_layer_target_cpu, agc_driver_bc_block_copy, and 397 more
VUID-vkCmdCopyImage-srcImage-01548 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-vkCmdCopyImage-srcImage-01551 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
Skipped (39)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_msaa_dcc_compared_import_2: skipped, the device reports host imports that keep write protection, so the write-watch probe compares none of them
agc_driver_msaa_dcc_compared_import_4: skipped, the device reports host imports that keep write protection, so the write-watch probe compares none of them
agc_driver_msaa_dcc_compared_import_8: skipped, the device reports host imports that keep write protection, so the write-watch probe compares none of them
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_stencil_ref_export: skipped, the device lacks VK_EXT_shader_stencil_export
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fresh: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_labels: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SD
Reproduce
git fetch origin 89d6a7caf7ce9aad1d3e5f3d6e33a008e0fab083 52c09d567d2fa453494dd720fcf53a98149468e4
git checkout 52c09d567d2fa453494dd720fcf53a98149468e4 && git merge --no-ff 89d6a7caf7ce9aad1d3e5f3d6e33a008e0fab083
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated 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.

@thuanquang

Copy link
Copy Markdown
Contributor

Correction to my comment above: the Persona 5 Royal pair in it is not valid evidence. A fault in our run harness left the input driver of an earlier, aborted run going, and it pressed buttons into both legs: into the main leg until both drivers stopped at the HUD, and into this PR's leg for its first two and a half minutes. The frame times, the committer counter and the memory peaks in that table all come from those two legs, so please disregard them. The agc_host_import_sparse part stands. I'll post a fresh pair once it has run cleanly.

AI-assisted: yes (Claude Code)

@thuanquang

Copy link
Copy Markdown
Contributor

@oneandonlydean Here is the fresh Persona 5 Royal (PPSA05110) evidence that replaces the withdrawn pair. Three exclusive legs alternate main 3a2b919816 with this PR's head 89d6a7caf7 merged onto it (ad27b32243). A fourth leg (this PR) was cut short when our runner stopped, so it is left out. Every leg follows the same input route (New Game, opening movie skipped, then standing still in the first gameplay area) and takes a 4 s trace at 560 s (APS5_TRACE_SECONDS=560:4, default event buffer, no profile switches). During the trace windows, other processes used a median of 4.0-4.4 % CPU (p90 at most 7.5 %). Machine: RX 6700 XT (driver 32.0.21045.16010), Ryzen 5 5600X, 32 GB, Windows 11 26200.

leg build presents per 10 s frame p50 / p90 / p99, ms GPU ms per present worker / committer busy, ms per frame
1 main 104.9 93.5 / 99.4 / 157.5 57.3 75.9 / 67.8
2 this PR 169.6 59.2 / 69.0 / 79.9 38.8 39.2 / 32.5
3 main 104.8 96.5 / 100.5 / 103.8 57.8 76.3 / 69.7

Neighbouring pairs (this PR minus main, legs 2-1 and 2-3):

  • frame p50: -34.4 and -37.3 ms
  • presents per 10 s: +64.7 in both pairs
  • committer busy: -35.3 and -37.2 ms per frame
  • GPU time per present: -18.5 and -19.0 ms

The input driver dumps one frame every 20 presents, so 3 to 4 dumps fell inside each 4 s window, on both builds. The set holds only one leg of this PR; I'll add the next pair once it has run. Traces, summary lines and trace_digest.py output are available on request.

AI-assisted: yes (Claude Code)

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@Mouhand-Kaddo heads-up: #12074 just merged and now conflicts with this PR in GuestBufferMemory.cpp, tests/Graphics.cpp and the AgcDriver debt doc. Could you merge main and keep both sides (along with the #11357 debt edit mentioned earlier)? We'll re-review the merged head and run fresh CI. The open point about agc_host_import_sparse being skipped on CI is unchanged.

@thuanquang

Copy link
Copy Markdown
Contributor

@Mouhand-Kaddo in case it saves you time with @oneandonlydean's merge request above: only the debt entry conflicts. GuestBufferMemory.cpp and tests/Graphics.cpp merge cleanly (git merge-tree on main 3d1b1c30e8, where #12074 landed, and on 0835ec8bdc). A merge of this head with main 50843f45d9 is on thuanquang:hello/7844-main-5084 (b756937840). Its "Host import windows and budget" bullet is main's with this PR's budget sentence swapped in, so the #12074 and #11357 edits stay. Outside the debt file, its diff to 50843f45d9 is this PR's patch, line for line. It also merges cleanly into 0835ec8bdc (git merge-tree, not built). Feel free to pull it, or merge yourself.

Machine for everything below: RX 6700 XT (AMD driver 32.0.21045.16010), Ryzen 5 5600X, 32 GB, Windows 11 26200.

Tests on b756937840 (Release, ANYPS5_REQUIRE_VULKAN=1, 3 runs per tree). Of the 22 tests matching host_import, agc_address, agc_heap_mirror and agc_driver_graphics, 21 pass every time and agc_host_import_sparse skips (Linux only). With 50843f45d9's GuestBufferMemory.cpp (only this PR's one-line change reverted), agc_driver_graphics fails every time ("a 32 GiB machine does not keep 4 GiB of its 16 GiB host heap from imports"); 20 pass and the same test skips. A validation-layer run per tree (VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, ANYPS5_NO_SHADER_CACHE=1) loaded the layer in the 11 tests that create a Vulkan instance (agc_driver_graphics creates none) and logged no VUID- line or Validation Error.

Persona 5 Royal (PPSA05110) on a base with #12074. This is the second pair promised in our 10-29 comment, with the same route and trace form (New Game, opening movie skipped, standing in the first gameplay area; APS5_TRACE_SECONDS=560:4, default event buffer, no dropped events, no profile switches). Base: main bb04a4f1ea with #12074 merged (65bdd8fd54, thuanquang:hello/n7844b-base), the same patch as #12074's merge in 3d1b1c30e8. Fix: that base with this PR merged (d40655b86e, thuanquang:hello/n7844b-fix); its diff to the base is this PR's patch, with the debt bullet as above. Four exclusive legs alternate the two. Other processes used a median of 3.0-4.3 % CPU (p90 9.6-11.2 %) in each window ±20 s.

leg build presents per 10 s frame p50 / p90 / p99, ms GPU ms per present worker / committer busy, ms per frame
1 base 117.5 89.2 / 99.0 / 106.5 54.0 65.0 / 59.3
2 this PR 164.6 58.3 / 70.7 / 126.4 39.6 41.1 / 34.2
3 base 100.5 99.0 / 104.7 / 107.9 60.8 80.3 / 73.4
4 this PR 165.7 58.1 / 70.5 / 124.8 39.5 40.6 / 34.2
  • Neighbouring pairs (2-1, 2-3, 4-3): frame p50 -30.9 / -40.7 / -40.9 ms, presents per 10 s +47.1 / +64.1 / +65.2, committer busy -25.1 / -39.2 / -39.2 ms per frame, GPU per present -14.4 / -21.2 / -21.3 ms.
  • With fix(agc): let heap mirrors replace host imports when the import budget is full #12074 the base still runs at 100.5-117.5 presents per 10 s (main 3a2b919816 in our 10-29 set: 104.8-104.9). This PR brings it to 164.6-165.7.
  • Each run logs one import refusal line. Base: 8128 of 8172 MiB live, one 768 MiB import refused. This PR: 11443 of 12249 MiB live, one 1984 MiB import refused. The emulator's peak private bytes over each 620 s run: 21.57-21.84 GiB base, 18.62-18.69 GiB with this PR.
  • p99 is each window's slowest frame. In each leg of this PR it is one 125-126 ms frame, 86-90 ms of it in Driver.Draw.shader_compile_and_link on the queue worker; the next-slowest frame is 74-76 ms. A frame like it (157.5 ms, 86 ms in that step) set main's p99 in leg 1 of our 10-29 set.
  • Frame dumps (one every 20 presents) ran through every window on both builds, 2 to 4 per window.

Not tested: the title on b756937840 or on a newer main (GuestBufferMemory.cpp has changed since the pair base, though not HostImportBudget); Linux or lavapipe; other GPUs and titles. Traces and trace_digest.py output on request.

AI-assisted: yes (Claude Code)

@thuanquang

Copy link
Copy Markdown
Contributor

Follow-up to my comment above: the Persona 5 Royal (PPSA05110) pair on the merged head itself, which that comment listed as not tested. Four exclusive legs alternate main 50843f45d9 with b756937840 (that main with this PR merged, thuanquang:hello/7844-main-5084). Same route and trace form as before (New Game, opening movie skipped, standing in the first gameplay area; APS5_TRACE_SECONDS=560:4, default event buffer, no dropped events, no profile switches), same machine.

leg build presents per 10 s frame p50 / p90 / p99, ms GPU ms per present worker / committer busy, ms per frame peak private, GiB
1 main 104.7 94.8 / 101.8 / 105.0 58.4 76.6 / 69.9 21.59
2 this PR 169.8 56.4 / 69.1 / 97.3 39.7 39.6 / 32.8 18.74
3 main 105.6 94.3 / 101.1 / 109.0 56.5 76.3 / 69.4 21.43
4 this PR 171.4 56.5 / 69.0 / 78.2 39.0 39.3 / 32.3 18.35
  • Neighbouring pairs 2-3 and 4-3: frame p50 -37.9 / -37.8 ms, presents per 10 s +64.3 / +65.8, committer busy -36.6 / -37.1 ms per frame, GPU per present -16.8 / -17.5 ms.
  • Leg 1 is left out of the pairs: our CPU sampler had stopped before its window (the leg waited 40 minutes for a slot in our runner), so its window has no record of other processes' CPU. Its numbers match leg 3's. In legs 2-4, other processes used a median of 3.4-6.2 % CPU (p90 8.6-10.8 %) in the 44 s around each window.
  • Peak private bytes are the emulator's, over each 620 s run.
  • Frame dumps (one every 20 presents) ran through every window on both builds, at most 4 per window.

Not tested: Linux or lavapipe; other GPUs and titles.

AI-assisted: yes (Claude Code)

# Conflicts:
#	docs/dev/debt/libSceAgcDriver.md
@Mouhand-Kaddo

Copy link
Copy Markdown
Contributor Author

Note

🤖 Claude Opus 5.5 responding on behalf of Mouhand-Kaddo

@oneandonlydean Merged main (a644edf30) in 92c0089. Only docs/dev/debt/libSceAgcDriver.md conflicted; GuestBufferMemory.cpp and tests/Graphics.cpp merged cleanly. The "Host import windows and budget" bullet is main's, including the #11357 and #12074 edits, with this PR's budget sentence swapped in. The diff to main is the same three-file, 6+/4− patch as before. Not built locally; waiting on CI for the merged head.

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 1, 2026
@TechLevelZero

TechLevelZero commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 92c0089 merged onto main e6f5730 · tested 2026-11-01 16:37 UTC · 20 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,429 passed · 6 failed (0 new, 3 also fail on main, 3 unstable on main) · 45 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,480 of 3,148 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (931 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_graphics_maps_fallback 31.2 s, ⚠️ agc_driver_graphics 30.4 s
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 1 of the last 10 main runs
agc_submit_progress: failed in 6 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 8 of the last 10 main runs
Failing on main too (3, not counted against this PR)
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Validation IDs already present on main (5 IDs in 484 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (484 tests): agc_driver, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, agc_driver_bda_span_reads, and 476 more
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_prepared_exports
VUID-VkShaderModuleCreateInfo-pCode-08737 (1 test): agc_driver_image_sample_derivatives
Skipped (45)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_dcc: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_deferred: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fps_limit: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_o
Reproduce
git fetch origin 92c0089a9e1940b07000608bf9051af582ed8b56 e6f57307fa7f47165d7fc1bee945abdb2f6816e7
git checkout e6f57307fa7f47165d7fc1bee945abdb2f6816e7 && git merge --no-ff 92c0089a9e1940b07000608bf9051af582ed8b56
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated 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.

@github-actions github-actions Bot added the review queue Next in the maintainer review queue: checks pass, no open change request, no conflict label Nov 1, 2026
@oneandonlydean
oneandonlydean merged commit e3c27da into boykopovar:main Nov 1, 2026
11 checks passed
@github-actions github-actions Bot removed the review queue Next in the maintainer review queue: checks pass, no open change request, no conflict label Nov 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* docs unblocks title Names a title ID on the Unblocks line

Projects

None yet

Development

Successfully merging this pull request may close these issues.