Repository navigation
Conversation
|
A data point for the finisher on a committer-heavy title: Setup. PPSA21567 (ASTRO BOT 01.019.000), Crash Site hub (
(ms) So about -2.8 ms at p50 (-3 %) and +3.7 % presents, with the GPU time unchanged. It varies between intervals: of six matched 10 s intervals compared with The gain is small here because at this point the frame is not bound by queue 0's draw path alone. Summary lines of one matched interval (110-120 s), off then on: {"commit": "1e658521a0a5", "dirty": false, "env": {"APS5_NO_PAD_INPUT": "1", "APS5_TRACE_BENCH": "1", "APS5_TRACE_DIR": "<path>", "APS5_TRACE_SUMMARY_EVERY": "10"}, "gpu": "NVIDIA GeForce RTX 5090", "driver": "NVIDIA 621.01", "os": "Windows 10.0.26200", "cpu": "AMD Ryzen 7 9800X3D 8-Core Processor", "cpu_threads": 16, "memory_mib": 65140, "title_id": "PPSA21567", "title": "ASTRO BOT", "content_version": "01.019.000", "resolution": "3840x2160", "window": {"spec": "summary_every 10", "first_present": 1378, "ms": 10053.481}, "interval_start_s": 110.561, "interval_end_s": 120.614, "presents": 109, "frame_ms": {"p50": 92.4, "p90": 97.629, "p99": 102.506, "max": 103.871}, "gpu_busy_ms_per_present": 72.319, "worker_busy_pct": {"queue worker 0x0": 97.334, "queue worker 0x40": 99.936, "queue worker 0x48": 99.993, "queue worker 0x46": 1.848}, "top_phases_ms_per_frame": {"Driver.Packet": 274.852, "Driver.Packet.memory_wait": 157.283, "Driver.Packet.draw": 59.376, "Driver.Draw": 58.996, "Graphics.Draw": 46.022, "Graphics.Draw.draw_and_resource_release": 36.655, "Driver.Draw.draw_enqueued": 27.034, "Driver.Draw.shader_compile_and_link": 25.895}, "trace_dropped": false, "trace": ""}
{"commit": "1e658521a0a5", "dirty": false, "env": {"APS5_DRAW_PIPELINE": "1", "APS5_NO_PAD_INPUT": "1", "APS5_TRACE_BENCH": "1", "APS5_TRACE_DIR": "<path>", "APS5_TRACE_SUMMARY_EVERY": "10"}, "gpu": "NVIDIA GeForce RTX 5090", "driver": "NVIDIA 621.01", "os": "Windows 10.0.26200", "cpu": "AMD Ryzen 7 9800X3D 8-Core Processor", "cpu_threads": 16, "memory_mib": 65140, "title_id": "PPSA21567", "title": "ASTRO BOT", "content_version": "01.019.000", "resolution": "3840x2160", "window": {"spec": "summary_every 10", "first_present": 1414, "ms": 10050.441}, "interval_start_s": 110.712, "interval_end_s": 120.763, "presents": 114, "frame_ms": {"p50": 89.632, "p90": 92.984, "p99": 96.744, "max": 99.059}, "gpu_busy_ms_per_present": 72.283, "worker_busy_pct": {"queue worker 0x0": 96.42, "queue worker 0x40": 99.94, "queue worker 0x48": 99.913, "queue worker 0x46": 2.248}, "top_phases_ms_per_frame": {"Driver.Packet": 262.159, "Driver.Packet.memory_wait": 153.318, "Driver.Packet.draw": 47.798, "Driver.Draw": 47.492, "Driver.DrawFinish": 43.772, "Graphics.Draw": 42.232, "Driver.Draw.prepare": 40.626, "Graphics.Draw.draw_and_resource_release": 33.586}, "trace_dropped": false, "trace": ""}AI-assisted: yes (Claude Code). Measured on the machine above. |
❌ NVIDIA GPU test: failedPR head
Failing testsThis PR changes test files, so each failing test was also built and run on main with only the PR's test changes applied. ✅ there means the failure comes from the PR's other changes; ❌ means the test fails on main too, so this run does not show the PR caused it.
agc_driver_draw_recapture_on_change: SEGFAULT (also failed when re-run alone), assertion and diagnosticsagc_driver_image_table_cache_bounds: SEGFAULT (also failed when re-run alone), assertion and diagnosticsagc_driver_lazy_resolved_abi: Failed (also failed when re-run alone), assertion and diagnosticsagc_driver_linear_target_direct_write_completion: SEGFAULT (also failed when re-run alone), assertion and diagnosticsUnstable on main (4, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (3, not counted against this PR)Validated but not compared (5, not in the main baseline's validation pass)Validation IDs already present on main (4 IDs in 534 tests)Skipped (48)ReproduceAutomated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
XairRrR
left a comment
There was a problem hiding this comment.
Reviewed — changes requested
Merged onto current main, the PR makes agc_driver_queued_constant_ram_dump fail on every run: a draw reads a stale constant-RAM table. main has the same failure under APS5_DRAW_PIPELINE=1, so the finisher already had this bug, and this PR makes it the default path.
What I ran
Head 9b8f0d7e3298f4ec475a759f3e9e30b7d13bea47, main 086c0686c8adff3ee648fdbe34e0b0b647e1d511, merged tree 1399eec3d931d7d63ecd70c6838ecaae6f2bef43, on Debian 13 (VM, Xeon Gold 6136), GCC 14.2.0, lavapipe (Mesa 26.1.6, LLVM 19).
git diff --check 086c0686c8adff3ee648fdbe34e0b0b647e1d511...9b8f0d7e3298f4ec475a759f3e9e30b7d13bea47
python3 tools/check_conventions.py --base 086c0686c8adff3ee648fdbe34e0b0b647e1d511
# three runs each
ANYPS5_REQUIRE_VULKAN=1 ctest --test-dir build -R '^agc_driver_queued_constant_ram_dump$'
APS5_NO_DRAW_PIPELINE=1 ANYPS5_REQUIRE_VULKAN=1 ctest --test-dir build -R '^agc_driver_queued_constant_ram_dump$'
# negative control: production files restored from main, then with and without APS5_DRAW_PIPELINE=1
ninja -C build agc_driver_queued_constant_ram_dump_tests agc_driver_draw_recapture_on_change_tests agc_driver_draw_unsupported_buffer_type_tests agc_driver_draw_data_hit_user_words_tests agc_driver_pipelined_metadata_pass_tests
ANYPS5_REQUIRE_VULKAN=1 ctest --test-dir build -R '^agc_driver_(queued_constant_ram_dump|draw_recapture_on_change.*|draw_unsupported_buffer_type.*|draw_data_hit_user_words.*|pipelined_metadata_pass.*)$'
# merged tree restored, with the validation layer
VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ANYPS5_NO_SHADER_CACHE=1 ANYPS5_REQUIRE_VULKAN=1 ctest --test-dir build -j8 -R '^agc_driver_(queued_constant_ram_dump|draw_recapture_on_change.*|draw_unsupported_buffer_type.*|draw_data_hit_user_words.*|pipelined_metadata_pass.*|image_table_cache_bounds|lazy_resolved_abi|linear_target_direct_write_completion)$'
Results
| Check | Result |
|---|---|
Merge into main |
clean |
git diff --check |
clean |
check_conventions.py |
passed |
Configure, build, libs |
passed |
| Selected tests (2265) | 1 new failure: agc_driver_queued_constant_ram_dump. The 7 known failures also fail on main. |
queued_constant_ram_dump, merged tree, default environment |
failed 3 of 3 runs |
queued_constant_ram_dump, merged tree, APS5_NO_DRAW_PIPELINE=1 |
passed 3 of 3 runs |
queued_constant_ram_dump, main's production files, default / APS5_DRAW_PIPELINE=1 |
passed / failed |
check_skips.py |
agc_driver_pipelined_metadata_pass_no_draw_pipeline skipped unexpectedly (see non-blocking) |
| Validation layer (script, 802 tests, layer loaded in 801, none missing) | New VUIDs only in agc_driver_image_gather_volume (VUID-VkSamplerCreateInfo-addressMode*). main did not run that test, so there is no comparison for it (see Not verified). |
| Focused tests with the validation layer on the merged tree | 17 passed. queued_constant_ram_dump failed. pipelined_metadata_pass_no_draw_pipeline skipped (on purpose). linear_target_direct_write_completion skipped on this device. |
agc_driver_queued_constant_ram_dump on the merged tree
AGC graphics: queued constant RAM dump: draw 1 wrote 64, expected 255 (draw 0 reads the table before both dumps, draw 1 after the first, draw 2 after the second)
Negative control
I restored Driver.hpp, Execution/src/Driver/Draw/Draw.cpp, ShaderMemory.cpp and Graphics/src/Draw.cpp from main and rebuilt the affected test executables:
-
Default environment: the tests whose expectations now depend on the finisher being on by default fail as intended:
agc_driver_draw_data_hit_user_wordsagc_driver_draw_data_hit_user_words_draw_pipelineagc_driver_draw_unsupported_buffer_typeagc_driver_draw_unsupported_buffer_type_draw_pipelineagc_driver_pipelined_metadata_passagc_driver_pipelined_metadata_pass_draw_pipeline
-
APS5_DRAW_PIPELINE=1(finisher on, without the recapture and refused-draw fix): these fail, which shows the fix from commit6e2c50b26eis needed and covered:agc_driver_draw_recapture_on_changeagc_driver_draw_recapture_on_change_no_draw_pipelineagc_driver_draw_unsupported_buffer_type_skip_refusedagc_driver_draw_unsupported_buffer_type_skip_refused_no_draw_pipeline
agc_driver_queued_constant_ram_dumpalso fails in this run.
I then restored the merged files and rebuilt; git status --porcelain is empty.
Findings
Blocking
- The default draw path now gives a wrong result for draws that read a table written by a queued
DUMP_CONST_RAM.agc_driver_queued_constant_ram_dump(QueuedConstantRamDump.cpp#L243) fails on every run once the finisher is on. Draw 1 writes 64 instead of 255, meaning it read the descriptor table from before the first dump.- It passes with
APS5_NO_DRAW_PIPELINE=1, and onmainit fails only underAPS5_DRAW_PIPELINE=1. The bug is in the finisher, and flipping the default at Graphics/src/Draw.cpp#L3989 makes it the default behaviour. - The test arrived on
mainafter the baselines used in the description and in the NVIDIA run (1e65852). That likely explains why neither caught it. The claim "the^agc_suite has the same two failures asmain" does not hold on currentmain. - Suggested fix: rebase. Then either make a draw finished on the finisher honour queued constant-RAM dumps (served capture words, or the capture drain the test expects), or finish such draws on the worker. Add
agc_driver_queued_constant_ram_dumpto the finisher and_no_draw_pipelinevariants so the fix stays covered.
- It passes with
Non-blocking
- The registration helper adds a test that always skips.
agc_add_draw_pipeline_testnow always registers<name>_no_draw_pipeline(CMakeLists.txt#L645-L646).PipelinedMetadataPass.cpp:122returnsVulkanTestSkippedunder that switch, soagc_driver_pipelined_metadata_pass_no_draw_pipelinealways skips, andtools/check_skips.pycounts it as an unexpected skip. Suggested fix: give the helper an option to leave out the_no_draw_pipelinevariant, or register the metadata pass test without it. - NVIDIA failures not reproduced here. The NVIDIA run reported 4 new SEGFAULTs:
draw_recapture_on_change,image_table_cache_bounds,lazy_resolved_abiandlinear_target_direct_write_completion. In each log the test prints its final "passed" line before the crash, which points at process teardown with the finisher thread alive. On lavapipe here the first three pass andlinear_target_direct_write_completionskips, so I can neither confirm nor refute these. They should be explained or fixed before the finisher becomes the default, because NVIDIA users would hit them. - I checked the recursive retry in
finishDraw→restartFinishedDraw→finishDraw(Draw.cpp#L1266-L1271). It is bounded:capturedMemoryChangedreturns false while aRecaptureScopeis active. No issue there.
Not verified
- NVIDIA crashes: I have no NVIDIA hardware, so I could not run the tests that crashed there.
agc_driver_image_gather_volumeVUIDs:maindid not run this test in the validation baseline, so I could not tell whether its newVUID-VkSamplerCreateInfo-addressMode*lines are new. The PR does not touch sampler creation, so they are probably not caused by it, but I did not check.- Performance: I did not check the GTA V numbers or traces; I cannot launch titles. The description has two summary lines with different commits, as the rules require.
- Windows: I did not run the build or tests there.
To get this to a good state
- Rebase on current
main. - Fix the finisher's handling of queued
DUMP_CONST_RAMso thatagc_driver_queued_constant_ram_dumppasses with the finisher on, and register finisher and_no_draw_pipelinevariants for it. - Address or explain the NVIDIA teardown SEGFAULTs.
- Stop registering a
_no_draw_pipelinevariant that can only skip. - Rerun the
^agc_suite and the validation comparison against the rebasedmain, and update the description.
9b8f0d7 to
6330546
Compare
|
@XairRrR Thanks for the review and the negative control. The branch is rebased on
@TechLevelZero The three segfaults and the crash of the lazy-ABI test's eager reference process are the teardown above. |
XairRrR
left a comment
There was a problem hiding this comment.
Re-checked — approved
All previous findings are resolved. The new commits make a finisher job run with the pipelined flag of the draw it finishes, join the draw finisher thread at shutdown, and let agc_add_draw_pipeline_test leave out the variant that can only skip. The focused tests pass, and each fix is covered by a test that fails without it.
What changed since my last review
- The branch is rebased onto
main086c0686c8. Commit4e4b0f11b4is the same change as6e2c50b26e(range-diff=). - New
060cddc3f7: a restarted finished draw starts again from its resolved draw parameters (tail.resolvedParameters). It re-snapshots unregistered program code that changed after capture.DrawRecaptureOnChange.cppgains cases for changed raw code and for folding the vertex offset once. - New
b8f163c606:DrawFinisher::Stop()drains the finisher and joins its thread, andDriver::stop()now calls it (Lifecycle.cpp#L192). Once stopped, a draw handed to the finisher runs on the caller. New test:agc_driver_shutdown_threads_draw_finisher. - New
77cd20649c: the finisher job setsDrawPipeline::Active() = job.pipelined(Draw.cpp#L750).agc_driver_queued_constant_ram_dumpgains_draw_pipelineand_no_draw_pipelinevariants. 6330546a47: the helper takesPIPELINE_ONLY, and the metadata pass test uses it. The finisher assertion inDrawRecaptureOnChange.cppis limited toDepth() != 0.- The author's reply addresses each point of my previous review. The description is updated (new
mainbase, 3971-test suite, 91/116 validation runs).
What I ran
Head 6330546a47e6c4afda70b640f338678e6c9601a5, main 04a9eb4fa2877eb6e40bf2c83adf972e40d89b24, merged tree 729f064641b491c2bd1d42a1f25bb8f9b698fa91. Machine: Debian 13 (VM, Xeon Gold 6136), GCC 14.2.0, lavapipe (Mesa 26.1.6, LLVM 19).
git diff --check 04a9eb4fa2877eb6e40bf2c83adf972e40d89b24...6330546a47e6c4afda70b640f338678e6c9601a5
python3 tools/check_conventions.py --base 04a9eb4fa2877eb6e40bf2c83adf972e40d89b24
ANYPS5_REQUIRE_VULKAN=1 ctest --test-dir build -j8 --test-load 32 --repeat until-fail:3 --output-on-failure -R '^agc_driver_(queued_constant_ram_dump.*|shutdown_threads.*|draw_recapture_on_change.*|pipelined_metadata_pass.*|draw_unsupported_buffer_type.*|draw_data_hit_user_words.*|image_table_cache_bounds|lazy_resolved_abi.*|linear_target_direct_write_completion)$'
# negative control: drop the two new fixes, rebuild, run their tests
ninja -C build -j32 -l32 agc_driver_queued_constant_ram_dump_tests agc_driver_shutdown_threads_tests
ANYPS5_REQUIRE_VULKAN=1 ctest --test-dir build -j4 --output-on-failure -R '^agc_driver_(queued_constant_ram_dump.*|shutdown_threads_draw_finisher)$'
# restore the merged files, rebuild, rerun, git status --porcelain
| Check | Result |
|---|---|
Merge into main |
clean |
git diff --check |
clean |
check_conventions.py |
passed |
Configure, build, libs (script) |
passed |
| Selected tests (script, 2269) | no new failures or timeouts. The 7 known failures also fail on main. |
check_skips.py (script) |
115 skips, all expected. The always-skipping _no_draw_pipeline variant is gone. |
| Focused tests, 31, 3 runs each | all passed. linear_target_direct_write_completion skips on this device (as before). |
| Validation layer (script, 804 tests, layer loaded in 803, none missing) | New VUID lines only in agc_driver_image_gather_volume, which the main baseline did not run (same as last time) |
Negative control
In the merged tree I removed only the two new production lines and rebuilt both test executables:
DrawPipeline::Active() = job.pipelined;inDraw.cppDrawFinisher::Get().Stop();inLifecycle.cpp
Three tests then failed:
agc_driver_queued_constant_ram_dumpagc_driver_queued_constant_ram_dump_draw_pipelineagc_driver_shutdown_threads_draw_finisher
agc_driver_queued_constant_ram_dump_no_draw_pipeline still passed, as expected. I then restored both files from the merged tree and rebuilt. All 4 tests pass, and git status --porcelain is empty.
Failure without the pipelined-flag fix
AGC graphics: queued constant RAM dump: draw 1 wrote 64, expected 255 (draw 0 reads the table before both dumps, draw 1 after the first, draw 2 after the second)
I did not repeat the negative control for 060cddc3f7 (restart from resolved parameters and changed raw code). Its new DrawRecaptureOnChange.cpp cases pass on all three variants.
Previous findings
- Resolved: a queued
DUMP_CONST_RAMwas not seen by draws on the finisher.agc_driver_queued_constant_ram_dumpand both its variants pass 3 of 3 runs. Without theActive()line, the default and_draw_pipelinevariants fail with the same message as before. - Resolved: a
_no_draw_pipelinevariant that can only skip. The metadata pass test is registered withPIPELINE_ONLY, andcheck_skips.pyreports no unexpected skip. - Resolved (the fix is verified here; the NVIDIA result is author-reported): NVIDIA teardown SEGFAULTs. The finisher thread was never joined.
Stop()now joins it inDriver::stop()afterDrain().agc_driver_shutdown_threads_draw_finisherchecks that the finisher's thread-local state is released, and it fails without the join. I have no NVIDIA hardware. The author reports that the four crashing tests are fixed, and a new NVIDIA CI run should confirm it. - No longer applies: the bounded recursion in
finishDraw→restartFinishedDraw. It was not a defect.restartFinishedDrawnow also refreshes changed raw program code, and the retry stays bounded through the sameRecaptureScopeguard.
New findings
Blocking
None.
Non-blocking
None. A note on the closing path: when the finisher is closing, DrawFinisher::Enqueue runs the job on the caller (DrawPipeline.cpp#L187). The finisher job then sets the caller's thread-local DrawPipeline::Active() and does not restore it. This only happens after Driver::stop() has joined the queue workers, so I found no reachable case where it matters.
Not verified
- NVIDIA or other hardware vendors: I could not check the teardown fix there.
- Performance: I did not check the GTA V numbers or traces. The description carries two summary lines with different commits, as required.
- Validation of
agc_driver_image_gather_volume: themainbaseline did not run this test, so itsVUID-VkSamplerCreateInfo-addressMode*lines could not be compared. The PR does not touch sampler creation. - Windows build and tests.
|
RADV/RX 9060 XT focused draw-path check: the default finisher and the Head Sensitivity check: on the merged tree, forcing Host: CachyOS Linux ReproductionBuild the export ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1
export VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation VK_LOADER_DEBUG=layer
export VK_LAYER_PATH="$HOME/.local/share/anyps5-tester/vk-layers/usr/share/vulkan/explicit_layer.d"Run the three named GPU tests on each tree. On main also run the registered Limits: synthetic focused tests, not a game run, performance comparison or full-suite result; no PS5 hardware. The control checks the finisher-specific failure path, not every recapture or shutdown condition. AI-assisted independent hardware test run (GPT-6.1 Terra). |
✅ AMD GPU test: passedPR head
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (6, not counted against this PR)Validated but not compared (67, not in the main baseline's validation pass)Validation IDs already present on main (8 IDs in 532 tests)Skipped (57)ReproduceAutomated build and test on a contributor's AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
✅ NVIDIA GPU test: passedPR head
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (3, not counted against this PR)Validated but not compared (7, not in the main baseline's validation pass)Validation IDs already present on main (8 IDs in 546 tests)Skipped (50)ReproduceAutomated build and test on a contributor's NVIDIA machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs. |
|
A side finding while profiling queue 0 at the ASTRO BOT Crash Site (PPSA21567 01.019.000, Where. On head
Counters.
With relocation on, line 408 has already drained the finisher by the time the lookup checks it, so the finisher is almost never still busy there. With relocation off, the two really run alongside each other. Why the drain is there. As far as I can tell, Frame time. Here it makes no difference, so this doesn't block anything. I ran
That is neutral within noise, with relocation on or off. On this scene the frame is held by GPU time on AI-assisted: yes (Claude Code) |
|
Another ASTRO BOT data point, in a heavier scene than the hub run above: the opening desert level, where on Setup. PPSA21564 (ASTRO BOT 01.007.000), opening level from a new game, scripted pad input, 3840x2160. Windows 11 10.0.26300, RTX 5070 Ti (NVIDIA 621.01), Ryzen 9 7900X3D, WinLibs GCC 15.2.0 Release. One binary, four runs alternating on/off/off/on, a 20 s trace window at 1080 s (
(ms) The two arms are even here: p50 88.6 ms with the finisher, 89.2 ms without. The finisher took the draws ( From a separate profiled run on the same build ( |
|
Windows data on Goat Simulator 3 (PPSA04158), head Setup:
Trace windows (450 s + 4 s):
Stability (same route, 600 s cap, Goat crashes on
AI-assisted: yes. |
|
Follow-up to my earlier comment: four more alternating All trace windows (
Frame time:
Queue worker 0x0: consistently less busy with the PR, about 10–15 % at comparable p50, as the finisher takes 85–99 ms per frame (143 ms in pair 6's heavier window). Stability: all of today's runs on this route on
AI-assisted: yes. |
|
A diagnostic data point on which part of this PR does what, from the same Goat Simulator 3 route on Windows (RX 6700 XT).
AI-assisted: yes. |
|
A data point from Metal Gear Solid 4 (PPSA18194), which the description lists: its title screen (the cemetery tree, about 840 draws per frame, capped at 60 fps by the title's own vblank wait). Linux, RTX 4070 Ti, NVIDIA 615.71.
At this scene it's neutral within run-to-run noise. The finisher takes 8-9 ms per frame, but the worker's draw phase stays at 10 ms, so the worker doesn't get that time back here. It either waits on the finisher or the split adds work, and the 60 fps cap hides any throughput change. The gameplay scenes (Act 1, 25-45 fps on AI-assisted: yes (Claude Code) |
What
On
main, queue 0's worker and the draw committer bound draw-heavy scenes (#7895). The draw finisher from #6946 moves the second half of each pipelined draw off the worker: stage materialization, the draw cache insert and the hand-off to the committer. It also lets the committer keep resource proofs for the collect epoch. It has been opt-in behindAPS5_DRAW_PIPELINEsince 17 October. With #15455, a draw finished there recaptures changed memory and skips refused draws as the worker does. This PR turns the finisher on by default, andAPS5_NO_DRAW_PIPELINEturns it off again. In Grand Theft Auto V (PPSA04264) the frame p50 drops from 73.7 to 63.3 ms.APS5_PROFILE_DRAW=1) still finish every draw on the worker, as before; the debt entry says so.AgcDriverShutdown. A finisher job runs with the pipelined flag of the draw it finishes, so its captures see queued pipeline writes such as a queuedDUMP_CONST_RAM(agc_driver_queued_constant_ram_dump)._draw_pipelinevariants (depth 32, pipelined dispatches) and gains_no_draw_pipelinevariants for the worker path. The finisher-only metadata pass test registers no_no_draw_pipelinevariant (PIPELINE_ONLY).APS5_DRAW_PIPELINE=1, which this PR retires. The conflicts are textual; whichever lands second drops the variable.Tested
Windows 11 Pro 26300, Radeon RX 7900 XTX (AMD Software 26.10.1), Ryzen 7 7800X3D, Release, MinGW-w64 GCC 15.2.
main086c068 with this branch, the suite of 3971 tests (1352^agc_) fails the same six tests asmain:agc_driver_direct_write_completion,agc_driver_sample_order_grid_reference, and four tool tests that need symlink rights or a realpython.exeon this machine.mainand 116 on this branch: the same tests plus the_no_draw_pipelinevariants and the new shutdown and queued-dump tests. Both arms report onlyUndefined-Value-ShaderOutputNotConsumedwarnings, no VUID and no missing layer.APS5_VERIFY_DRAW_PIPELINE=1in Grand Theft Auto V checked 16,975 reused epoch proofs against the full check: 0 failed.Grand Theft Auto V, Performance graphics mode, gameplay of the opening level, same machine, warm caches, no profiling:
main9090972b7e{"commit":"9090972b7e91","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:30"},"gpu":"AMD Radeon RX 7900 XTX","driver":"AMD proprietary driver 26.10.1 (LLPC)","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31860,"title_id":"PPSA04264","title":"Grand Theft Auto V","content_version":"01.011.001","resolution":"3840x2160","window":{"spec":"seconds 150:30","first_present":3874,"ms":30033.654},"presents":408,"frame_ms":{"p50":73.666,"p90":76.967,"p99":79.540,"max":81.630},"gpu_busy_ms_per_present":31.673,"worker_busy_pct":{"queue worker 0x0":98.160},"top_phases_ms_per_frame":{"Driver.Packet":68.959,"Graphics.Draw":57.773,"Driver.Packet.draw":54.694,"Driver.Draw":54.380,"Graphics.Draw.draw_and_resource_release":53.413,"Driver.Draw.draw_enqueued":32.593,"Driver.Draw.shader_compile_and_link":16.823,"Shader.DrawStage":12.177},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":8.338,"events_lost":683195,"totals_full":false},"draw committer":{"events_full_after_s":17.189,"events_lost":195932,"totals_full":false}},"trace":"aps5-trace-9090972b7e91-29412.json.gz"} {"commit":"9b8f0d7e3298","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"150:30"},"gpu":"AMD Radeon RX 7900 XTX","driver":"AMD proprietary driver 26.10.1 (LLPC)","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 7800X3D 8-Core Processor","cpu_threads":16,"memory_mib":31860,"title_id":"PPSA04264","title":"Grand Theft Auto V","content_version":"01.011.001","resolution":"3840x2160","window":{"spec":"seconds 150:30","first_present":3923,"ms":30021.282},"presents":471,"frame_ms":{"p50":63.332,"p90":66.069,"p99":71.686,"max":76.487},"gpu_busy_ms_per_present":30.574,"worker_busy_pct":{"queue worker 0x0":85.791},"top_phases_ms_per_frame":{"Driver.Packet":51.490,"Graphics.Draw":48.176,"Graphics.Draw.draw_and_resource_release":43.875,"Driver.DrawFinish":40.324,"Driver.Packet.draw":35.832,"Driver.Draw":35.586,"Driver.DrawFinish.draw_enqueued":26.543,"Driver.Draw.prepare":26.318},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":10.634,"events_lost":474774,"totals_full":false},"draw committer":{"events_full_after_s":15.806,"events_lost":234733,"totals_full":false},"draw finisher":{"events_full_after_s":18.496,"events_lost":161505,"totals_full":false}},"trace":"aps5-trace-9b8f0d7e3298-41296.json.gz"}Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)