Skip to content

test(agc): keep queued_index_read_order's image results pending past the idle store - #10750

Merged
oneandonlydean merged 6 commits into
boykopovar:mainfrom
EagleBearerYS:fix/agc-queued-index-read-idle-store
Nov 2, 2026
Merged

oneandonlydean merged 6 commits into
boykopovar:mainfrom
EagleBearerYS:fix/agc-queued-index-read-idle-store

Conversation

@EagleBearerYS

@EagleBearerYS EagleBearerYS commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

What

agc_driver_queued_index_read_order (from #6914) fails on main on most runs on GitHub's Linux runner (lavapipe), at its setup check: "the image write left no pending result to order against". That check guards the order the test is for, so on those runs the order check never runs.

Why. Queue 0's worker stores every pending storage-image result once the queues have been idle for 50 ms (StoreIdleResults, from QueueWorker.cpp). The test submits an image write, calls AgcDriverWaitIdle, and expects the result to be still pending. Since #7233, Driver::WaitIdle also syncs the recorder and waits for the device under the GPU mutex. On lavapipe that outlasts the 50 ms, and the idle store flushes the result as soon as WaitIdle returns.

  • Neither change is wrong on its own. fix(agc): separate possible writes from complete coverage #7233's wait is what it set out to add, and the order fix(agc): order deferred write-backs after queued draws' index reads #6914 tests still holds. What broke is the test's assumption that nothing stores the result between WaitIdle and its check.
  • Under a parallel ^agc run, the store can instead land after the setup check but before the draw holds its read. The test then fails at "the queued draw's commit stored the image's results over its index buffer", although the commit never stored them. The idle store goes through FlushPending, which stores nothing while a queued draw holds a read (DrawPipeline::HeldReads).

What it does.

  1. APS5_NO_IDLE_STORE=1 turns the idle store off (f9b5cc2). The default is unchanged. It is documented in docs/dev/ENVIRONMENT.md.
  2. The test sets it (d57418e), as CopiedWriterLabelOrder sets APS5_NO_OPPORTUNISTIC_REAP, so only the queued draw's held read decides when the image's results are stored. The idle store keeps its own tests (agc_idle_publish_wait, agc_driver_store_idle_results_wake).
  3. With the switch, queue 0 still waits for work (433e43e, after oneandonlydean's review). With the idle store off, the retry after the idle check saw pending results on every pass, so an idle queue 0 with results pending went round its loop instead of waiting, unlocking and relocking the driver mutex until another submission came. That retry now applies only when the idle store is on. The retry on an idle epoch change and the wait's wakes, on a submission, an epoch change or a completion, are unchanged. docs/dev/ENVIRONMENT.md says queue 0 still waits.
  4. Its test (5f0c5f0): agc_driver_store_idle_results_disabled runs the idle store fixture with APS5_NO_IDLE_STORE=1. With a result pending and every queue idle, queue 0 must wait within 2 s, and 200 ms later the result must still be pending and not in guest memory. A second dispatch, to another texture, must then run, so its result is pending within 10 s, and queue 0 must wait again within 2 s.

A switch, rather than a change to the idle store: the idle store is run-time behaviour with its own tests, and its 50 ms timer is the one thing in this test it can't control. Lengthening or gating the timer to fit one test would change when every title's pending results are stored.

Tested

  • Where it broke (GitHub's Linux runner, lavapipe): passes 5 runs in a row at fix(agc): order deferred write-backs after queued draws' index reads #6914's merge 3efab5e (run) and at fix(agc): separate possible writes from complete coverage #7233's parent 8b3a6ba (run); fails its first run at fix(agc): separate possible writes from complete coverage #7233's merge 3ca07d0, with the setup message (run).

  • main without this PR, Linux: the test failed on its first run, at the setup check, in 4 of 5 runs:

    main 2fade7e passed its first run (run, the "before" arm), so the failure depends on timing and isn't certain.

  • This head (the same trees as d57418e, on main 2fade7e; run): agc_driver_queued_index_read_order, agc_idle_publish_wait and agc_driver_store_idle_results_wake, 20 runs in a row.

    • Linux: all 3 pass, none skipped or failed.
    • Windows: all 3 skip (the runner has no Vulkan device), none failed.
    • The libc and libkernel suites pass on both.
  • Validation comparison (CONTRIBUTING's AGC rule, d57418e, VK_LAYER_KHRONOS_validation on both arms, ANYPS5_NO_SHADER_CACHE=1; run): the same 3 tests on Linux (llvmpipe, Mesa 25.2.8, Ubuntu 24.04.5), all pass on both arms. The layer loaded 5 times in each. The only VUID is VUID-VkDeviceCreateInfo-pNext-pNext, on both arms; this PR adds none.

  • A parallel ^agc run with this head (run):

    • Linux: 987 run, 923 pass, 64 skip, 0 fail. This is the load under which the test failed at its order check before.
    • Windows: 1,015 run, 285 pass, 726 skip, 4 fail: agc_driver_pipelined_metadata_pass, agc_driver_pipelined_metadata_pass_draw_pipeline, agc_submit_progress and agc_submit_progress_no_timeline. The same 4 fail in an ^agc run on that runner without this change (run).
  • 5f0c5f0, red/green against d57418e (the switch without the wait fix) on GitHub's runners (run): the three tests above, agc_driver_store_idle_results_disabled and ^agc_driver_queue_zero (agc_driver_queue_zero_idle_wait, agc_driver_queue_zero_late_interrupt).

    • Linux: with d57418e's implementation, agc_driver_store_idle_results_disabled fails with "with APS5_NO_IDLE_STORE queue 0 kept polling over pending storage results with every queue idle instead of waiting". With this head all 6 pass 20 runs in a row, none skipped or failed.
    • Windows: all 6 skip (the runner has no Vulkan device), none failed.
    • The libc and libkernel suites pass on both (143 and 205 tests on Linux, 170 and 221 on Windows), run with APS5_SKIP_TIMING_TESTS=1, which relaxes precise_wait's median bounds on GitHub's hosted runners.
  • Validation comparison at 5f0c5f0 (run), main 2fade7e against this head, the same 6 tests once on Linux (llvmpipe), with VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, ANYPS5_NO_SHADER_CACHE=1 and ANYPS5_REQUIRE_VULKAN=1. main's tree ran the 5 it has, and agc_driver_queued_index_read_order failed there at its setup check, the failure this PR is for; this head ran all 6, and they pass. The layer was inserted 8 times on main and 10 with this PR, neither log has was not found but was requested, and both report only VUID-VkDeviceCreateInfo-pNext-pNext, so this PR adds no VUID- message.

  • Real AMD hardware, by @tablefrogpillow (comment): Linux, RADV (Mesa 25.2.8), kernel 6.8, ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1, the merge-base 2fade7e against d57418e, 25 standalone runs each. agc_driver_queued_index_read_order passes 25 of 25 on both trees on an RX 7900 GRE (RDNA3), a Ryzen 7 7800X3D's integrated GPU (RDNA2) and an RX Vega 56 (GCN5). So on that hardware main's setup check holds, and the failure is lavapipe's timing, as they say. These are standalone runs; the parallel ^agc case wasn't run there.

  • 519e411, a merge of main 63a863d (run). main's perf(agc): pipeline queue-0 DMA_DATA by default #9965 made queue-0 DMA_DATA pipelining the default and removed APS5_PIPELINE_DMA, including from this test's setup; the merge keeps that and this PR's APS5_NO_IDLE_STORE there, so the test no longer sets the removed variable. The PR's own lines are unchanged. agc_driver_queued_index_read_order, agc_driver_store_idle_results_disabled, agc_driver_store_idle_results_wake, agc_idle_publish_wait and the agc_driver_queue_zero tests pass 10 runs in a row. Linux: 6 run, 6 pass, 0 skip, 0 fail; the before arm fails agc_driver_store_idle_results_disabled and agc_driver_queued_index_read_order. Windows: 6 run, 0 pass, 6 skip (no Vulkan device), 0 fail. Suites: libc and libkernel pass on Linux (144 and 207) and on Windows (171 and 223). The suites ran with APS5_SKIP_TIMING_TESTS=1, which relaxes precise_wait's median bounds on GitHub's hosted runners.

  • NVIDIA GeForce RTX 5070 Ti (610.88), Windows 11 Pro, by @SeaSunPT (comment): Intel Core i5-14600K, WinLibs GCC 15.2.0 r7, Release, this PR's head 519e411 merged onto main 5a2744c and compared with that main, with ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 and VK_LAYER_KHRONOS_validation (SDK 1.4.363.0). With this PR, agc_driver_queue_zero_idle_wait, agc_driver_queue_zero_late_interrupt, agc_driver_queued_index_read_order, agc_driver_store_idle_results, agc_driver_store_idle_results_disabled, agc_driver_store_idle_results_wake and agc_idle_publish_wait pass 5 runs of 5, none skipped; on main the six that exist there pass 3 runs of 3, and agc_driver_queued_index_read_order did not hit its setup failure on this GPU. No VUID- line in any log. A full ctest -j 8 passes 2380 of 2382; the two failures, agc_host_import_cut_lifetime (agc_host_import_cut_lifetime fails on Windows since the merge of #9159 #10746) and agc_driver_depth_plane_partial_store (AGC: imported depth-plane partial-store test fails refresh-proof assertion on Windows (NVIDIA and AMD) #10664), fail on main on that machine too.

  • 314eff1, a merge of main 0836dfd (run). build(agc): register each AGC test executable in its own CMake fragment #12862 moved libSceAgcDriver's test registrations into tests/cmake/; the conflict in CMakeLists.txt is resolved with tools/agc_test_split.py resolve, which moves this PR's registration into tests/cmake/agc_driver_store_idle_results_tests.cmake (+5 lines). Nothing else conflicted. Apart from the move, this PR's diff is unchanged. With -DBUILD_TESTING=ON, ctest -N gives 3076 tests: main's 3075 plus agc_driver_store_idle_results_disabled, each listed once. The 6 tests of this PR's verify set pass 10 runs in a row. Linux: 6 run, 6 pass, 0 skip, 0 fail. Windows: 6 run, 0 pass, 6 skip (no Vulkan device), 0 fail. Suites: libc and libkernel pass on Linux (199 and 308) and on Windows (226 and 330). The suites ran with APS5_SKIP_TIMING_TESTS=1, which relaxes precise_wait's median bounds on GitHub's hosted runners.

Checklist

  • Based on current main; no other open PR implements the same functions (fix(agc): build the pending image snapshot and the queued index read order test with Apple's libc++ #10676 changes casts in the same test file, on other lines)
  • 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: none
  • GPUs tested: Mesa lavapipe (llvmpipe, LLVM 20.1.2), Ubuntu 24.04, on GitHub's runner; Windows build and tests on GitHub's runner, where the test skips (no Vulkan device); AMD Radeon RX 7900 GRE, Ryzen 7 7800X3D integrated GPU and RX Vega 56 (RADV, Mesa 25.2.8), Linux, in tablefrogpillow's runs; NVIDIA GeForce RTX 5070 Ti (610.88), Windows 11 (SeaSunPT)
  • AI-assisted: yes

… their readers

Queue 0's worker stores every pending storage-image result once the
queues have stayed idle for 50 ms. A test that orders a pending result
against a later consumer races that store: it can land before the
consumer is queued, and the order under test is never exercised.
APS5_NO_IDLE_STORE=1 turns the idle store off, so pending results stay
pending until a reader, a label or an explicit flush stores them. The
default is unchanged.
…the idle store

Since boykopovar#7233, Driver::WaitIdle also syncs the recorder and waits for the
device under the GPU mutex. On lavapipe that takes longer than the queue
worker's 50 ms idle quiet period, so the idle store flushes the image
write's results as soon as WaitIdle returns. The test then fails its
setup check ("the image write left no pending result to order against")
on most runs on GitHub's Linux runner. Under load the store can instead
land after that check but before the draw holds its read, and the test
fails at "the queued draw's commit stored the image's results over its
index buffer" although the commit never stored them.

The test now sets APS5_NO_IDLE_STORE=1, as CopiedWriterLabelOrder sets
APS5_NO_OPPORTUNISTIC_REAP, so only the queued draw's held read decides
when the results are stored. The idle store keeps its own tests
(agc_idle_publish_wait, agc_driver_store_idle_results_wake).
@oneandonlydean

Copy link
Copy Markdown
Collaborator

@EagleBearerYS The switch removes the idle store, but leaves a busy loop: with APS5_NO_IDLE_STORE present, idleResultsPending() is always false. Once queue 0 is idle with pending image results and no completions, the retry at QueueWorker.cpp:224-225 sees !storeIdleResults && AnyPending() and continues before changed.wait(). Nothing in that path clears those deliberately retained results, so it spins unlocking/relocking the driver mutex until another consumer arrives. Please gate the pending-result retry on idle-store eligibility while preserving epoch-change/completion wake handling, and add a disabled-store idle/pending regression showing the worker parks and still wakes. Keep the existing held-read assertions and default idle-store tests.

…lts stay pending

With the idle store off, idleResultsPending() is always false, so queue
0's retry after the idle check saw no stored results and pending ones
on every pass. Once every queue was idle with results pending and no
completions, it went round the loop without reaching changed.wait(),
unlocking and relocking the driver mutex until another submission came.
The retry for pending results now applies only when the idle store is
on. The retry on an idle epoch change and the wait's wake on a
submission, an epoch change or a completion are unchanged.
@github-actions

github-actions Bot commented Oct 24, 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 1896 docs/dev/ENVIRONMENT.md
PR 4472 docs/dev/ENVIRONMENT.md
PR 6186 docs/dev/ENVIRONMENT.md
PR 6501 docs/dev/ENVIRONMENT.md
PR 6924 docs/dev/ENVIRONMENT.md
PR 7449 docs/dev/ENVIRONMENT.md
PR 7457 docs/dev/ENVIRONMENT.md
PR 7514 docs/dev/ENVIRONMENT.md
PR 7604 docs/dev/ENVIRONMENT.md
PR 8004 docs/dev/ENVIRONMENT.md
PR 8246 docs/dev/ENVIRONMENT.md
PR 8484 docs/dev/ENVIRONMENT.md
PR 9012 docs/dev/ENVIRONMENT.md
PR 9248 docs/dev/ENVIRONMENT.md
PR 9289 docs/dev/ENVIRONMENT.md
PR 9345 docs/dev/ENVIRONMENT.md
PR 9356 docs/dev/ENVIRONMENT.md
PR 9387 docs/dev/ENVIRONMENT.md
PR 9508 docs/dev/ENVIRONMENT.md
PR 9712 docs/dev/ENVIRONMENT.md
PR 9852 docs/dev/ENVIRONMENT.md
PR 9875 docs/dev/ENVIRONMENT.md
PR 9898 docs/dev/ENVIRONMENT.md
PR 10069 docs/dev/ENVIRONMENT.md
PR 10193 docs/dev/ENVIRONMENT.md
PR 10442 docs/dev/ENVIRONMENT.md
PR 10757 docs/dev/ENVIRONMENT.md
PR 10894 docs/dev/ENVIRONMENT.md
PR 11351 docs/dev/ENVIRONMENT.md
PR 12120 docs/dev/ENVIRONMENT.md
PR 12323 docs/dev/ENVIRONMENT.md
PR 12324 docs/dev/ENVIRONMENT.md
PR 12544 docs/dev/ENVIRONMENT.md
PR 12568 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/QueueWorker.cpp
docs/dev/ENVIRONMENT.md
PR 12746 docs/dev/ENVIRONMENT.md
PR 12863 docs/dev/ENVIRONMENT.md
PR 12970 docs/dev/ENVIRONMENT.md
PR 13707 core/libs/prx/libSceAgcDriver/Execution/src/Driver/Queues/QueueWorker.cpp
docs/dev/ENVIRONMENT.md
PR 13793 docs/dev/ENVIRONMENT.md
PR 13809 docs/dev/ENVIRONMENT.md
PR 13863 docs/dev/ENVIRONMENT.md
PR 13920 docs/dev/ENVIRONMENT.md
PR 13928 docs/dev/ENVIRONMENT.md
PR 13929 docs/dev/ENVIRONMENT.md
PR 14262 docs/dev/ENVIRONMENT.md
PR 14264 docs/dev/ENVIRONMENT.md
PR 14299 docs/dev/ENVIRONMENT.md
PR 14344 docs/dev/ENVIRONMENT.md
PR 14943 docs/dev/ENVIRONMENT.md

@github-actions github-actions Bot added docs agc libSceAgc* labels Oct 24, 2026
@tablefrogpillow

Copy link
Copy Markdown
Contributor

Linux/RADV — the main failure doesn't reproduce on real AMD hardware; agc_driver_queued_index_read_order passes on both main and this PR across three AMD GPUs.

Since the failure on main is the lavapipe/CI timing (WaitIdle outlasting the 50 ms idle-store window), here's real-hardware data. Merge-base 2fade7ef4 vs head d57418e1b, 25 standalone runs each, ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1, RADV Mesa 25.2.8, kernel 6.8:

GPU (RADV) main this PR
RX 7900 GRE (NAVI31, 1002:744c, RDNA3) 25/25 pass 25/25 pass
Ryzen 7 7800X3D iGPU (RAPHAEL, 1002:164e, RDNA2) 25/25 pass 25/25 pass
RX Vega 56 (VEGA10, 1002:687f, GCN5) 25/25 pass 25/25 pass

So on real AMD hardware the setup check holds on main (WaitIdle returns well under the 50 ms window), i.e. the failure is specific to lavapipe's slow timing as your analysis says, and the PR keeps passing. This is standalone-run data only — I didn't exercise the parallel-^agc race — and it's just the real-HW data point; I'm not weighing in on the APS5_NO_IDLE_STORE tradeoff under discussion.

AI-assisted: yes.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I independently verified the shutdown path described in the existing inline comment at this exact head. With APS5_NO_IDLE_STORE present, idleResultsPending() is false; when queue 0 is idle and storage-image results remain pending, the retry condition after the device-lock section stays true and continues before the worker reaches changed.wait(). This can busy-spin until another consumer happens to clear those results. Please address the existing request to gate the retry on idle-store eligibility while retaining epoch/completion wake handling, and add an idle-pending regression that verifies the worker parks and wakes. I did not run the Vulkan runtime test locally.

agc_driver_store_idle_results_disabled runs the idle store fixture with
APS5_NO_IDLE_STORE=1. Once a dispatch leaves a storage result pending
and every queue is idle, queue 0 must wait within 2 s, and 200 ms later
the result must still be pending and not in guest memory. A second
dispatch, to another texture, must then run: its result is pending
within 10 s, and queue 0 waits again within 2 s.
@EagleBearerYS

Copy link
Copy Markdown
Contributor Author

@oneandonlydean thanks, that was a real spin: with the switch on, the pending-result retry after the idle check never let queue 0 reach changed.wait(). 433e43e applies that retry only when the idle store is on. The retry on an idle epoch change and the wait's wakes, on a submission, an epoch change or a completion, are unchanged.

5f0c5f0 adds agc_driver_store_idle_results_disabled, with the store off. Queue 0 must wait with a result pending, the result must stay pending, a second dispatch must still run, and queue 0 must wait again. It fails on d57418e with "with APS5_NO_IDLE_STORE queue 0 kept polling over pending storage results with every queue idle instead of waiting", and passes 20 of 20 on this head. agc_driver_queued_index_read_order's held-read assertions and the default idle-store tests are unchanged and pass alongside it (run).

@MarcZX10 this also addresses your review of the same path. Could you re-review 5f0c5f0?

@tablefrogpillow thank you for the runs on three AMD GPUs; they're in Tested now.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The PR explains the timing-dependent failure with a concrete cause in StoreIdleResults and keeps the production default unchanged. The opt-out is used only in the order test, while the idle-store behavior remains covered independently; the follow-up also preserves queue 0 waiting when disabled. The reported repeated lavapipe runs, validation-layer comparison, and AMD hardware runs provide useful coverage across the regression and affected queue behavior. I reviewed the head and hosted checks; native jobs are path-skipped on this PR head, so I rely on the described CI/test evidence rather than claiming a local Vulkan run.

@github-actions github-actions Bot added the build label Oct 25, 2026
@oneandonlydean oneandonlydean self-assigned this Oct 25, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 25, 2026
Main's boykopovar#9965 pipelines queue-0 DMA_DATA by default and drops
APS5_PIPELINE_DMA, including from queued_index_read_order's setup. The merge
keeps that and this branch's APS5_NO_IDLE_STORE there.
@oneandonlydean

Copy link
Copy Markdown
Collaborator

@EagleBearerYS This now conflicts with main: ce6865f ("perf(agc): pipeline queue-0 DMA_DATA by default") made queue-0 DMA_DATA pipelining the default and removed the APS5_PIPELINE_DMA environment variable, but this PR's test still sets it. Could you merge main and adjust the test so it no longer depends on that variable (the pipelined path is now the default)? The rest of the review stands. We'll look at the update as a delta.

@EagleBearerYS

Copy link
Copy Markdown
Contributor Author

@oneandonlydean done in 519e411d96: main is merged in, and the test sets only APS5_PIPELINED_DRAWS and this PR's APS5_NO_IDLE_STORE, relying on the default pipelined DMA_DATA path. The PR's own lines are unchanged. The six queue-0 and idle-store tests pass 10 runs in a row on Linux and skip on Windows, which has no Vulkan device (run).

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 25, 2026
@SeaSunPT

Copy link
Copy Markdown
Contributor

A run on real Windows hardware. The Windows runner skips these tests because it has no Vulkan device.

Windows 11 Pro 26200, Intel Core i5-14600K, NVIDIA GeForce RTX 5070 Ti (driver 610.88), WinLibs GCC 15.2.0 r7, Release. Head 519e411d9 merged onto main 5a2744c55, compared with that main.

ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ctest --test-dir build -R "agc_driver_queued_index_read_order|agc_idle_publish_wait|agc_driver_store_idle_results|^agc_driver_queue_zero" -V:

  • This PR, 5 runs: 7 of 7 pass every run (agc_driver_queue_zero_idle_wait, agc_driver_queue_zero_late_interrupt, agc_driver_queued_index_read_order, agc_driver_store_idle_results, agc_driver_store_idle_results_disabled, agc_driver_store_idle_results_wake, agc_idle_publish_wait), none skipped.
  • main, 3 runs: the 6 that exist there pass every run. agc_driver_queued_index_read_order did not hit its setup failure on this GPU, as on tablefrogpillow's AMD runs.
  • 0 VUID- lines and no missing-layer line in any log. The validation layer is Khronos vulkan-sdk-1.4.363.0, built from source with the same GCC (mimalloc off).

Full ctest -j 8 with ANYPS5_REQUIRE_VULKAN=1: 2380 of 2382 pass. The two failures, agc_host_import_cut_lifetime (#10746) and agc_driver_depth_plane_partial_store (#10664), fail on main on this machine too.

@EagleBearerYS

Copy link
Copy Markdown
Contributor Author

@SeaSunPT thank you, that's the run on real Windows hardware this PR was missing, with the validation layer on and no VUID- lines. I've put your results in the Tested section and added the RTX 5070 Ti to the GPUs tested.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Re-checked — new head, looks good

The updated tests keep the queued image results pending through the idle-store interval, and the author reports same-machine main/change comparisons on head 519e411d965397a509c507b4134f17ea3a0adc0d.

What I ran

Reviewed head 519e411d965397a509c507b4134f17ea3a0adc0d against PR base 63a863d3b07f2457ee1210f1abba1c11409cdff5; the merge preview against current main dc38224141e0b6096007b876b4c42fc9144d11b8 is clean. I inspected the four changed code/test files and the environment documentation. Local checks ran in Linux; no build or compiler was invoked.

git diff --check refs/remotes/upstream/main...refs/review/pr-10750-current
python3 tools/check_conventions.py --base refs/remotes/upstream/main --head refs/review/pr-10750-current
git merge-tree --write-tree refs/remotes/upstream/main refs/review/pr-10750-current
gh pr checks 10750 --repo boykopovar/AnyPS5
gh run view 40188153448 --repo boykopovar/AnyPS5 --json headSha,status,conclusion,displayTitle

Results

Check Result
Diff check Passed; no output
Repository conventions Passed
Merge preview with current main Clean; tree 8b7f242358c9bccaad60c83e3db0ea0915638d4c
Hosted checks Conventions, eligibility, labels and report passed on exact head; product Linux/Windows and specialized jobs skipped
Focused GPU tests Author reports seven tests pass 5/5 on an RTX 5070 Ti with Vulkan validation, and the six present on main pass 3/3 on the same machine; not independently run here
Unedited local check output
All conventions checks passed.
8b7f242358c9bccaad60c83e3db0ea0915638d4c

Findings

Blocking

None found in this re-check. The added setup and pending-result assertions address the prior timing sensitivity without pinning the implementation to refusing otherwise valid guest operations.

Non-blocking

The GPU runs are author-provided. I did not run a local build or tests; the hosted Linux/Windows product jobs skipped because no Vulkan device is available to those runners.

Sources

Not verified

No local tests, console behavior, or validation-layer run was performed. The GPU validation and same-machine baseline results above are from the author and tester's report.

@TechLevelZero

TechLevelZero commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 519e411 merged onto main 6b48aee · tested 2026-10-31 01:31 UTC · 23 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,408 passed · 5 failed (0 new, 3 also fail on main, 2 unstable on main) · 42 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,455 of 3,041 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 (909 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_bda_device 50.6 s, ⚠️ agc_driver_graphics 33.4 s, ⚠️ agc_driver_graphics_maps_fallback 31.8 s
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_submit_progress: failed in 6 of the last 10 main runs
agc_submit_progress: failed in 6 of the last 10 main runs
Failing on main too (3, not counted against this PR)
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (1, not in the main baseline's validation pass)
agc_driver_store_idle_results_disabled
Validation IDs already present on main (4 IDs in 421 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (421 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_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, and 413 more
VUID-vkCmdCopyImage-srcImage-01548 (13 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_plane_sampling, and 5 more
VUID-vkCmdCopyImage-srcImage-01551 (13 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_plane_sampling, and 5 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_srgb8_color_target
Skipped (42)
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_driver_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
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_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 plat
Reproduce
git fetch origin 519e411d965397a509c507b4134f17ea3a0adc0d 6b48aee5d2ea9fce6155163d78f8ce8dc84f7827
git checkout 6b48aee5d2ea9fce6155163d78f8ce8dc84f7827 && git merge --no-ff 519e411d965397a509c507b4134f17ea3a0adc0d
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 needs rebase Conflicts with main, rebase needed label Oct 31, 2026
The conflict in core/libs/prx/libSceAgcDriver/CMakeLists.txt from boykopovar#12862's split is resolved with tools/agc_test_split.py resolve, which moves this PR's test registrations into tests/cmake/.
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 31, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 314eff1 merged onto main 0836dfd · tested 2026-11-01 00:14 UTC · 16 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,444 passed · 6 failed (0 new, 4 also fail on main, 2 unstable on main) · 44 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,494 of 3,087 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 (925 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 34.4 s
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_submit_progress: failed in 7 of the last 10 main runs
agc_submit_progress_no_timeline: failed in 9 of the last 10 main runs
Failing on main too (4, not counted against this PR)
agc_driver_idle_store_yields
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (1, not in the main baseline's validation pass)
agc_driver_store_idle_results_disabled
Validation IDs already present on main (5 IDs in 476 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (476 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 468 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 (44)
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_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_f
Reproduce
git fetch origin 314eff1117d1616432d0d13b3f487461e268ee04 0836dfdf4fecb1e0326100c490476e15d3a74da5
git checkout 0836dfdf4fecb1e0326100c490476e15d3a74da5 && git merge --no-ff 314eff1117d1616432d0d13b3f487461e268ee04
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.

@oneandonlydean
oneandonlydean merged commit 5a2174a into boykopovar:main Nov 2, 2026
12 of 13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants