Repository navigation
Conversation
|
This pull request is labeled |
MarcZX10
left a comment
There was a problem hiding this comment.
I found a configuration edge case that can make the new worker pool try to create an effectively unbounded number of threads. std::strtoul("-1", nullptr, 10) returns ULONG_MAX on this Linux host, and malformed text returns 0, which the current max(1, ...) silently turns into one worker. With APS5_PIPELINE_LTO_THREADS=-1, the limit becomes 18,446,744,073,709,551,615 here; each queued job can start another worker while none is idle, until thread creation fails or exhausts resources. Please validate the whole decimal string and overflow, and cap/reject values to a documented reasonable maximum (for example, hardware concurrency).
Separately, this perf PR still lacks the required same-title, same-scene, same-machine main/change aps5-summary.jsonl lines, attached traces, and trace_digest.py output. The PR description says those will be added later; the repository performance-report rule still applies before approval.
|
@MarcZX10 thanks, you're right. Fixed in 93d15cc:
On the performance numbers: agreed, they're required. I'll add the Tested and written by Claude (AI assistant) on a contributor's machine. |
MarcZX10
left a comment
There was a problem hiding this comment.
Re-reviewed exact head 93d15cca50f7f3336076c6cd433791e871bd998f. The earlier worker-count blocker is resolved: std::from_chars consumes the full string, rejects parse/overflow/zero/out-of-range values before creating a worker, and the new invalid-setting cases cover the relevant inputs. The remaining blocker is the required performance report. This PR is labeled perf, and the current description still says the same-scene main/change captures will be added later; it has no two aps5-summary.jsonl lines, attached traces, or tools/trace_digest.py output for the High on Life scene. Please add that paired evidence on the exact current head and matching main before approval. I have not approved; hosted Windows is pending and the general Linux product job is skipped.
|
Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.
Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.
|
|
@Tamalero thanks, the pool and the shutdown path look right to me. Two small things, neither blocking:
For the gate we'd like the frame-time and shader-compile stutter comparison you mentioned (main vs this PR, same scene), ideally including one run with 8 or fewer hardware threads and the peak memory during a registration burst. |
adriadam10
left a comment
There was a problem hiding this comment.
Read the pool, the shutdown path and the new tests; they look right, and agc_pipeline_library_workers needs the second worker to pass. What is left:
- The PR is labeled
perfand the body still has no same-scene captures. Please add the twoaps5-summary.jsonllines (mainand this PR, same title, scene and machine), attach both traces and paste thetools/trace_digest.pyoutput (AGENTS.md; the labels check asks for the same). The Ratchet & Clank numbers are one run each on an oldermain, so they do not replace it. - Dean's two points, small: in
enqueue(PipelineLibrary.cpp:109),waitingWorkers == 0counts a notified-but-not-yet-woken worker as idle, so a burst queues behind it; spawn whilestore.waitingWorkers <= store.jobs.size()(checked before the push). And say indocs/dev/ENVIRONMENT.md:372that 0 is rejected (unlikeAPS5_PIPELINE_JOURNAL_THREADS, where 0 disables).
Happy to look again once the report is attached.
|
@oneandonlydean @adriadam10 thanks, both points are in e7af1f2.
The performance report for this head is in the next comment. Tested and written by Claude (AI assistant) on a contributor's machine. |
|
Performance report for head e7af1f2 against Setup: High on Life (PPSA15388, 01.120.000). Each run is Continue from the same save, followed by no input until the window closes: keyboard and mouse ignored (
Result: no measurable difference in this title. The two Why nothing changes here: High on Life never has two background LTO jobs queued at once, so the pool never starts a second worker. The process thread count, sampled every second from Other points from the review:
Also seen, not related to this PR: the spawn view loads in one of two states, about 19.5 FPS or about 6 FPS, on both builds. Four earlier runs in the fast state (default event buffer, so their traces dropped events) gave the same picture: p50 50.3 / 55.8 / 51.3 / 50.3 ms (main, PR, PR, main), 137 threads on both builds. I'll report the slow state separately. The four traces are attached:
|
| thread | busy | wait | untraced | in slices < 20 us | largest |
|---|---|---|---|---|---|
| queue worker 0x0 | 134.7 (83 %) | 5.3 (3 %) | 23.0 | 104.9 | Driver.Packet 139.7, Driver.EndSubmission 0.2 |
| draw committer | 88.5 (54 %) | 0.6 (0 %) | 73.7 | 26.4 | Graphics.Draw 72.4, Recorder.Submit 16.1 |
| queue worker 0x20 | 9.2 (6 %) | 153.3 (94 %) | 0.4 | 1.7 | Driver.Packet 160.2, Driver.EndSubmission 0.3 |
| presenter | 1.1 (1 %) | 14.9 (9 %) | 146.9 | 0.1 | VideoOut.Flip 16.0, Driver.Present 0.0 |
| gpu | 44.0 (27 %) | 0.0 (0 %) | 118.9 | 0.0 | batch 44.0 |
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 299.9, Driver.Packet.memory_wait 153.8, Graphics.Draw 72.4, Graphics.Draw.draw_and_resource_release 68.7, Driver.Packet.dispatch 47.1, batch 44.0, Driver.Dispatch 35.0, Driver.Packet.draw 28.9, Driver.Draw 28.7, Resources.Complete 26.0
Longest waits
- Driver.Packet.memory_wait (queue worker 0x20) 133.2 ms at 19385 ms, present 4590
- Driver.Packet.memory_wait (queue worker 0x20) 121.8 ms at 13461 ms, present 4553
- Driver.Packet.memory_wait (queue worker 0x20) 119.2 ms at 10198 ms, present 4533
- Driver.Packet.memory_wait (queue worker 0x20) 112.8 ms at 6543 ms, present 4511
- Driver.Packet.memory_wait (queue worker 0x20) 111.1 ms at 742 ms, present 4475
- Driver.Packet.memory_wait (queue worker 0x20) 105.1 ms at 4060 ms, present 4496
- Driver.Packet.memory_wait (queue worker 0x20) 99.9 ms at 10377 ms, present 4534
- Driver.Packet.memory_wait (queue worker 0x20) 99.1 ms at 19937 ms, present 4593
- Driver.Packet.memory_wait (queue worker 0x20) 98.4 ms at 7918 ms, present 4519
- Driver.Packet.memory_wait (queue worker 0x20) 97.9 ms at 11369 ms, present 4540
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
- batch 4668: 13.5 ms at 10770 ms, present 4536: GPU no ranges; recorded by Graphics.Draw (draw committer) 44.0, Graphics.Draw.draw_and_resource_release (draw committer) 43.9, Resources.Prepare (draw committer) 2.7, Resources.Complete (draw committer) 1.4
- batch 3608: 12.6 ms at 8307 ms, present 4521: GPU no ranges; recorded by Graphics.Draw (draw committer) 33.1, Graphics.Draw.draw_and_resource_release (draw committer) 33.0, Resources.Prepare (draw committer) 2.8, Resources.Complete (draw committer) 1.4
- batch 2538: 11.0 ms at 5767 ms, present 4506: GPU no ranges; recorded by Graphics.Draw (draw committer) 50.2, Graphics.Draw.draw_and_resource_release (draw committer) 50.2, Resources.Prepare (draw committer) 2.7, Resources.Complete (draw committer) 1.4
- batch 413: 10.6 ms at 942 ms, present 4476: GPU no ranges; recorded by Graphics.Draw (draw committer) 45.1, Graphics.Draw.draw_and_resource_release (draw committer) 45.0, Resources.Prepare (draw committer) 2.6, Resources.Complete (draw committer) 1.4
- batch 2397: 9.8 ms at 5427 ms, present 4504: GPU no ranges; recorded by Graphics.Draw (draw committer) 48.2, Graphics.Draw.draw_and_resource_release (draw committer) 48.2, Resources.Prepare (draw committer) 2.9, Resources.Complete (draw committer) 1.4
trace_digest.py: this PR e7af1f2, run 1 (aps5-trace-e7af1f2af21e-pr-1.json.gz)
seconds 300:20 from present 5535: 103 presents, frame p50 179.5 / p90 253.0 / p99 285.8 / max 299.5 ms, GPU busy 52.2 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.3.0-4-cachyos, 3840x2160, commit e7af1f2, dropped: no
{"commit":"e7af1f2af21e","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":5535,"ms":20088.451},"presents":103,"frame_ms":{"p50":179.532,"p90":253.049,"p99":285.779,"max":299.506},"gpu_busy_ms_per_present":52.224,"worker_busy_pct":{"queue worker 0x0":99.123,"queue worker 0x20":98.627},"top_phases_ms_per_frame":{"Driver.Packet":381.044,"Driver.Packet.memory_wait":174.404,"Graphics.Draw":87.734,"Graphics.Draw.draw_and_resource_release":81.838,"Driver.Packet.dispatch":63.687,"Driver.Dispatch":47.068,"Driver.Packet.draw":46.686,"Driver.Draw":46.481},"trace_dropped":false,"trace":"aps5-trace-e7af1f2af21e-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
- present 5586: 299.5 ms at 10556 ms: Driver.Packet (queue worker 0x20) 296.1, Driver.Packet (queue worker 0x0) 275.7, Driver.Packet.memory_wait (queue worker 0x20) 207.2, Graphics.Draw (draw committer) 90.8
- present 5622: 285.8 ms at 17107 ms: Driver.Packet (queue worker 0x20) 282.6, Driver.Packet.memory_wait (queue worker 0x20) 273.4, Driver.Packet (queue worker 0x0) 260.5, Driver.Packet.dispatch (queue worker 0x0) 124.3
- present 5595: 269.6 ms at 12301 ms: Driver.Packet (queue worker 0x0) 243.4, Driver.Packet (queue worker 0x20) 221.5, Driver.Packet.memory_wait (queue worker 0x20) 190.1, Graphics.Draw (draw committer) 88.3
- present 5569: 266.6 ms at 6962 ms: Driver.Packet (queue worker 0x20) 262.7, Driver.Packet (queue worker 0x0) 241.4, Driver.Packet.memory_wait (queue worker 0x20) 238.7, Graphics.Draw (draw committer) 99.6
- present 5584: 258.6 ms at 10064 ms: Driver.Packet (queue worker 0x20) 255.9, Driver.Packet (queue worker 0x0) 233.1, Driver.Packet.memory_wait (queue worker 0x20) 190.2, Graphics.Draw (draw committer) 85.5
Threads (ms per frame)
| thread | busy | wait | untraced | in slices < 20 us | largest |
|---|---|---|---|---|---|
| queue worker 0x0 | 160.2 (82 %) | 9.7 (5 %) | 25.2 | 115.3 | Driver.Packet 169.5, Driver.EndSubmission 0.3 |
| draw committer | 96.4 (49 %) | 6.8 (3 %) | 91.8 | 29.0 | Graphics.Draw 75.7, Recorder.Submit 20.5 |
| queue worker 0x20 | 21.4 (11 %) | 173.2 (89 %) | 0.4 | 1.6 | Driver.Packet 187.9, Driver.EndSubmission 4.2 |
| presenter | 0.7 (0 %) | 22.2 (11 %) | 172.1 | 0.1 | VideoOut.Flip 22.8, Driver.Present 0.1 |
| gpu | 52.1 (27 %) | 0.0 (0 %) | 142.9 | 0.0 | batch 52.1 |
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 357.4, Driver.Packet.memory_wait 174.4, Graphics.Draw 75.7, Graphics.Draw.draw_and_resource_release 71.7, Driver.Packet.dispatch 61.6, batch 52.1, Driver.Dispatch 44.7, Recorder.Submit 41.8, Resources.Complete 38.9, Vulkan.Dispatch 38.6
Longest waits
- Driver.Packet.memory_wait (queue worker 0x20) 142.3 ms at 10706 ms, present 5586
- Driver.Packet.memory_wait (queue worker 0x20) 138.4 ms at 3899 ms, present 5554
- Driver.Packet.memory_wait (queue worker 0x20) 124.4 ms at 11867 ms, present 5592
- Driver.Packet.memory_wait (queue worker 0x20) 123.7 ms at 7097 ms, present 5569
- Driver.Packet.memory_wait (queue worker 0x20) 122.6 ms at 3230 ms, present 5551
- Driver.Packet.memory_wait (queue worker 0x20) 122.3 ms at 11206 ms, present 5589
- Driver.Packet.memory_wait (queue worker 0x20) 121.8 ms at 12049 ms, present 5593
- Driver.Packet.memory_wait (queue worker 0x20) 120.1 ms at 13238 ms, present 5599
- Driver.Packet.memory_wait (queue worker 0x20) 107.5 ms at 11675 ms, present 5591
- Driver.Packet.memory_wait (queue worker 0x20) 107.1 ms at 9385 ms, present 5580
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
- batch 3820: 15.5 ms at 10284 ms, present 5584: GPU no ranges; recorded by Graphics.Draw (draw committer) 57.7, Graphics.Draw.draw_and_resource_release (draw committer) 57.7, Resources.Prepare (draw committer) 2.5, Resources.Complete (draw committer) 1.4
- batch 1980: 12.2 ms at 5279 ms, present 5560: GPU no ranges; recorded by Graphics.Draw (draw committer) 42.7, Graphics.Draw.draw_and_resource_release (draw committer) 42.7, Resources.Prepare (draw committer) 2.6, Resources.Complete (draw committer) 1.4
- batch 3216: 11.9 ms at 8727 ms, present 5576: GPU no ranges; recorded by Graphics.Draw (draw committer) 60.8, Graphics.Draw.draw_and_resource_release (draw committer) 60.7, Resources.Prepare (draw committer) 2.6, Resources.Complete (draw committer) 1.3
- batch 3062: 11.5 ms at 8304 ms, present 5574: GPU no ranges; recorded by Graphics.Draw (draw committer) 15.0, Graphics.Draw.draw_and_resource_release (draw committer) 15.0, Resources.Prepare (draw committer) 2.6, Resources.Complete (draw committer) 1.4
- batch 141: 11.5 ms at 402 ms, present 5536: GPU no ranges; recorded by Graphics.Draw (draw committer) 55.3, Graphics.Draw.draw_and_resource_release (draw committer) 55.3, Resources.Prepare (draw committer) 2.4, Resources.Complete (draw committer) 1.4
trace_digest.py: this PR e7af1f2, run 2 (aps5-trace-e7af1f2af21e-pr-2.json.gz)
seconds 300:20 from present 4139: 108 presents, frame p50 173.4 / p90 239.0 / p99 305.6 / max 311.5 ms, GPU busy 45.8 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.3.0-4-cachyos, 3840x2160, commit e7af1f2, dropped: no
{"commit":"e7af1f2af21e","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":4139,"ms":20071.876},"presents":108,"frame_ms":{"p50":173.375,"p90":239.019,"p99":305.604,"max":311.533},"gpu_busy_ms_per_present":45.77,"worker_busy_pct":{"queue worker 0x0":99.109,"queue worker 0x20":98.82},"top_phases_ms_per_frame":{"Driver.Packet":367.197,"Driver.Packet.memory_wait":180.7,"Graphics.Draw":80.364,"Graphics.Draw.draw_and_resource_release":74.772,"Driver.Packet.dispatch":59.456,"Driver.Packet.draw":52.114,"Driver.Dispatch":52.102,"Driver.Draw":51.912},"trace_dropped":false,"trace":"aps5-trace-e7af1f2af21e-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
- present 4220: 311.5 ms at 14582 ms: Driver.Packet (queue worker 0x20) 308.9, Driver.Packet.memory_wait (queue worker 0x20) 303.3, Driver.Packet (queue worker 0x0) 285.6, Recorder.Submit (draw committer) 112.8
- present 4139: 305.6 ms at 0 ms: Driver.Packet (queue worker 0x20) 302.5, Driver.Packet.memory_wait (queue worker 0x20) 295.2, Driver.Packet (queue worker 0x0) 281.3, Recorder.Submit (draw committer) 112.0
- present 4212: 261.0 ms at 13156 ms: Driver.Packet (queue worker 0x20) 258.6, Driver.Packet.memory_wait (queue worker 0x20) 251.0, Driver.Packet (queue worker 0x0) 235.9, Graphics.Draw (draw committer) 89.0
- present 4195: 258.3 ms at 10083 ms: Driver.Packet (queue worker 0x20) 255.9, Driver.Packet.memory_wait (queue worker 0x20) 247.9, Driver.Packet (queue worker 0x0) 233.3, Driver.Packet.draw (queue worker 0x0) 92.5
- present 4222: 255.9 ms at 15091 ms: Driver.Packet (queue worker 0x20) 252.8, Driver.Packet.memory_wait (queue worker 0x20) 238.5, Driver.Packet (queue worker 0x0) 231.3, Driver.Packet.draw (queue worker 0x0) 90.7
Threads (ms per frame)
| thread | busy | wait | untraced | in slices < 20 us | largest |
|---|---|---|---|---|---|
| queue worker 0x0 | 156.8 (84 %) | 4.5 (2 %) | 24.5 | 113.4 | Driver.Packet 161.0, Driver.EndSubmission 0.2 |
| draw committer | 92.4 (50 %) | 0.2 (0 %) | 93.3 | 28.1 | Graphics.Draw 68.7, Recorder.Submit 16.9 |
| queue worker 0x20 | 6.2 (3 %) | 179.2 (96 %) | 0.4 | 1.7 | Driver.Packet 183.1, Driver.EndSubmission 0.3 |
| presenter | 0.7 (0 %) | 20.5 (11 %) | 164.6 | 0.1 | VideoOut.Flip 20.7, Driver.Present 0.5 |
| gpu | 45.7 (25 %) | 0.0 (0 %) | 140.1 | 0.0 | batch 45.7 |
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 344.1, Driver.Packet.memory_wait 180.7, Graphics.Draw 68.7, Graphics.Draw.draw_and_resource_release 64.8, Driver.Packet.dispatch 57.4, Driver.Dispatch 49.7, Resources.Complete 45.9, batch 45.7, Vulkan.Dispatch 45.6, Vulkan.Dispatch.shader_resources 45.1
Longest waits
- Driver.Packet.memory_wait (queue worker 0x20) 164.7 ms at 10869 ms, present 4199
- Driver.Packet.memory_wait (queue worker 0x20) 157.9 ms at 2653 ms, present 4153
- Driver.Packet.memory_wait (queue worker 0x20) 154.9 ms at 19645 ms, present 4245
- Driver.Packet.memory_wait (queue worker 0x20) 150.7 ms at 10083 ms, present 4195
- Driver.Packet.memory_wait (queue worker 0x20) 148.6 ms at 14582 ms, present 4220
- Driver.Packet.memory_wait (queue worker 0x20) 147.4 ms at 17835 ms, present 4236
- Driver.Packet.memory_wait (queue worker 0x20) 143.6 ms at 7097 ms, present 4178
- Driver.Packet.memory_wait (queue worker 0x20) 142.6 ms at 16554 ms, present 4229
- Driver.Packet.memory_wait (queue worker 0x20) 142.3 ms at 14746 ms, present 4220
- Driver.Packet.memory_wait (queue worker 0x20) 142.0 ms at 156 ms, present 4139
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
- batch 6239: 10.7 ms at 15322 ms, present 4222: GPU no ranges; recorded by Graphics.Draw (draw committer) 59.6, Graphics.Draw.draw_and_resource_release (draw committer) 59.5, Resources.Prepare (draw committer) 2.7, Resources.Complete (draw committer) 1.5
- batch 4221: 10.1 ms at 10320 ms, present 4195: GPU no ranges; recorded by Graphics.Draw (draw committer) 55.3, Graphics.Draw.draw_and_resource_release (draw committer) 55.2, Resources.Prepare (draw committer) 2.8, Resources.Complete (draw committer) 1.3
- batch 6833: 10.1 ms at 16873 ms, present 4230: GPU no ranges; recorded by Graphics.Draw (draw committer) 57.6, Graphics.Draw.draw_and_resource_release (draw committer) 57.6, Resources.Prepare (draw committer) 2.4, Resources.Complete (draw committer) 1.3
- batch 5261: 9.9 ms at 12794 ms, present 4209: GPU no ranges; recorded by Graphics.Draw (draw committer) 43.2, Graphics.Draw.draw_and_resource_release (draw committer) 43.2, Resources.Prepare (draw committer) 2.6, Resources.Complete (draw committer) 1.4
- batch 6608: 9.8 ms at 16276 ms, present 4227: GPU no ranges; recorded by Graphics.Draw (draw committer) 39.1, Graphics.Draw.draw_and_resource_release (draw committer) 39.0, Resources.Prepare (draw committer) 2.6, Resources.Complete (draw committer) 1.4
trace_digest.py: `main` 316615d, run 2 (aps5-trace-316615d042c0-main-2.json.gz)
seconds 300:20 from present 6970: 111 presents, frame p50 175.3 / p90 235.5 / p99 295.3 / max 300.6 ms, GPU busy 47.7 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.3.0-4-cachyos, 3840x2160, commit 316615d, dropped: no
{"commit":"316615d042c0","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":6970,"ms":20099.169},"presents":111,"frame_ms":{"p50":175.314,"p90":235.543,"p99":295.301,"max":300.607},"gpu_busy_ms_per_present":47.712,"worker_busy_pct":{"queue worker 0x0":99.034,"queue worker 0x20":98.434},"top_phases_ms_per_frame":{"Driver.Packet":356.843,"Driver.Packet.memory_wait":169.089,"Graphics.Draw":86.573,"Graphics.Draw.draw_and_resource_release":80.167,"Driver.Packet.dispatch":72.197,"Driver.Dispatch":57.105,"Resources.Complete":52.17,"Vulkan.Dispatch":50.516},"trace_dropped":false,"trace":"aps5-trace-316615d042c0-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
- present 7066: 300.6 ms at 17056 ms: Driver.Packet (queue worker 0x0) 275.1, Driver.Packet (queue worker 0x20) 220.8, Driver.Packet.memory_wait (queue worker 0x20) 214.5, Driver.Packet.draw (queue worker 0x0) 85.9
- present 7051: 295.3 ms at 14073 ms: Driver.Packet (queue worker 0x20) 292.2, Driver.Packet.memory_wait (queue worker 0x20) 278.4, Driver.Packet (queue worker 0x0) 270.6, Graphics.Draw (draw committer) 159.4
- present 7057: 280.9 ms at 15322 ms: Driver.Packet (queue worker 0x20) 278.1, Driver.Packet.memory_wait (queue worker 0x20) 273.7, Driver.Packet (queue worker 0x0) 255.3, Recorder.Submit (draw committer) 143.2
- present 7079: 265.9 ms at 19650 ms: Driver.Packet (queue worker 0x20) 259.1, Driver.Packet (queue worker 0x0) 238.9, Driver.Packet.memory_wait (queue worker 0x20) 178.5, Graphics.Draw (draw committer) 161.4
- present 7056: 253.1 ms at 15069 ms: Driver.Packet (queue worker 0x20) 250.3, Driver.Packet.memory_wait (queue worker 0x20) 240.7, Driver.Packet (queue worker 0x0) 226.2, Graphics.Draw (draw committer) 148.3
Threads (ms per frame)
| thread | busy | wait | untraced | in slices < 20 us | largest |
|---|---|---|---|---|---|
| queue worker 0x0 | 151.1 (83 %) | 5.0 (3 %) | 24.9 | 115.0 | Driver.Packet 155.8, Driver.EndSubmission 0.3 |
| draw committer | 91.6 (51 %) | 0.3 (0 %) | 89.2 | 28.6 | Graphics.Draw 74.9, Recorder.Submit 16.6 |
| queue worker 0x20 | 11.8 (7 %) | 168.9 (93 %) | 0.4 | 1.7 | Driver.Packet 177.6, Driver.EndSubmission 0.3 |
| presenter | 0.7 (0 %) | 23.6 (13 %) | 156.7 | 0.1 | VideoOut.Flip 24.3, Driver.Present 0.0 |
| title | 0.0 (0 %) | 0.0 (0 %) | 181.1 | 0.0 | Shader.ResolveGraphicsAbi 0.0 |
| title | 0.0 (0 %) | 0.0 (0 %) | 181.1 | 0.0 | Shader.ResolveGraphicsAbi 0.0, Shader.ResolveGraphicsStagesAbi 0.0 |
| title | 0.0 (0 %) | 0.0 (0 %) | 181.1 | 0.0 | Shader.ResolveGraphicsStagesAbi 0.0 |
| title | 0.0 (0 %) | 0.0 (0 %) | 181.1 | 0.0 | Shader.ResolveGraphicsStagesAbi 0.0 |
| title | 0.0 (0 %) | 0.0 (0 %) | 181.1 | 0.0 | Shader.ResolveGraphicsAbi 0.0 |
| gpu | 47.8 (26 %) | 0.0 (0 %) | 133.2 | 0.0 | batch 47.8 |
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 333.4, Driver.Packet.memory_wait 169.1, Graphics.Draw 74.9, Graphics.Draw.draw_and_resource_release 70.2, Driver.Packet.dispatch 70.2, Driver.Dispatch 54.8, Resources.Complete 51.7, Vulkan.Dispatch 48.9, Vulkan.Dispatch.shader_resources 48.4, batch 47.8
Longest waits
- Driver.Packet.memory_wait (queue worker 0x20) 199.6 ms at 14162 ms, present 7051
- Driver.Packet.memory_wait (queue worker 0x20) 181.5 ms at 15416 ms, present 7057
- Driver.Packet.memory_wait (queue worker 0x20) 164.0 ms at 16887 ms, present 7065
- Driver.Packet.memory_wait (queue worker 0x20) 155.4 ms at 5296 ms, present 6999
- Driver.Packet.memory_wait (queue worker 0x20) 155.2 ms at 11252 ms, present 7034
- Driver.Packet.memory_wait (queue worker 0x20) 152.9 ms at 15163 ms, present 7056
- Driver.Packet.memory_wait (queue worker 0x20) 150.6 ms at 18040 ms, present 7070
- Driver.Packet.memory_wait (queue worker 0x20) 145.1 ms at 12020 ms, present 7038
- Driver.Packet.memory_wait (queue worker 0x20) 144.1 ms at 19391 ms, present 7077
- Driver.Packet.memory_wait (queue worker 0x20) 141.1 ms at 4214 ms, present 6993
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
- batch 4307: 11.4 ms at 10091 ms, present 7027: GPU no ranges; recorded by Graphics.Draw (draw committer) 55.2, Graphics.Draw.draw_and_resource_release (draw committer) 55.2, Resources.Prepare (draw committer) 2.5, Resources.Complete (draw committer) 1.4
- batch 6796: 11.3 ms at 16092 ms, present 7060: GPU no ranges; recorded by Graphics.Draw (draw committer) 19.6, Graphics.Draw.draw_and_resource_release (draw committer) 19.6, Resources.Prepare (draw committer) 2.5, Resources.Complete (draw committer) 1.4
- batch 2079: 11.2 ms at 4993 ms, present 6997: GPU no ranges; recorded by Graphics.Draw (draw committer) 54.2, Graphics.Draw.draw_and_resource_release (draw committer) 54.1, Resources.Prepare (draw committer) 2.6, Resources.Complete (draw committer) 1.4
- batch 2971: 11.1 ms at 7077 ms, present 7009: GPU no ranges; recorded by Graphics.Draw (draw committer) 39.3, Graphics.Draw.draw_and_resource_release (draw committer) 39.3, Resources.Prepare (draw committer) 3.2, Resources.Complete (draw committer) 1.8
- batch 1930: 10.2 ms at 4616 ms, present 6995: GPU no ranges; recorded by Graphics.Draw (draw committer) 44.4, Graphics.Draw.draw_and_resource_release (draw committer) 44.4, Resources.Prepare (draw committer) 2.5, Resources.Complete (draw committer) 1.4
Tested and written by Claude (AI assistant) on a contributor's machine.
|
A second title with the same result: LEGO Batman: Legacy of the Dark Knight (PPSA16833, 01.010.000) never starts a second LTO worker either.
So, as in High on Life, the background LTO queue never holds two jobs at once in this title, and the PR changes nothing here. One run each, RTX 4090, NVIDIA 615.78.08, Linux 7.3. Tested and written by Claude (AI assistant) on a contributor's machine. |
MarcZX10
left a comment
There was a problem hiding this comment.
Re-checked — changes requested
The new worker and burst regressions are useful, but the branch and performance measurements still use older main snapshots. The PR is 740 commits behind current main 52c09d567d2fa453494dd720fcf53a98149468e4; the author’s pipeline tests are reported on main 316615d04, and the separate title data uses e13027a1f. The repository checklist requires a current-main base, and this perf change needs its same-scene baseline/change evidence on the refreshed head.
What I ran
- Reviewed exact head
e7af1f2af21e73e997eea9f5f3f6a8292661eed1against currentmain. - Ran
git merge-tree --write-treeandgit diff --check. - Read the worker/burst tests, negative controls, and reported title data.
Results
| Check | Result |
|---|---|
| Current-main merge preview | Clean; current main is not in the branch history |
git diff --check |
Passed |
| Focused AGC tests | Author reports the pipeline tests pass, including 200/200 burst runs, on older bases |
| Performance evidence | The report is tied to older main snapshots; title results say no second LTO worker starts on that route |
| Current-main run | Not reported |
Please refresh onto current main, rerun the focused worker tests, and update the required same-scene performance comparison on that head. I did not run the GPU tests locally.
e7af1f2 to
07369ec
Compare
|
@MarcZX10 refreshed: the branch is rebased onto current Tests on 07369ec: all 32 Same-scene comparison: High on Life (PPSA15388), spawn view after Continue, the same save restored before every run, no input (
"Threads" is the highest process thread count between 60 and 340 s, sampled every second from Reading:
So, as before: no measurable change in this title, because it never queues two LTO jobs at once. The evidence for a gain is still the Ratchet & Clank data in the body, which can't be repeated on Summary lines and traces: all eight completed runs' summary lines are in the PR body. Traces attached:
|
| thread | busy | wait | untraced | in slices < 20 us | largest |
|---|---|---|---|---|---|
| queue worker 0x0 | 26.4 (50 %) | 2.2 (4 %) | 24.4 | 113.0 | Driver.Packet 28.2, Driver.EndSubmission 0.3 |
| draw committer | 20.2 (38 %) | 0.2 (0 %) | 32.6 | 28.0 | Graphics.Draw 19.9, Recorder.Submit 0.2 |
| queue worker 0x20 | 7.7 (15 %) | 44.8 (85 %) | 0.4 | 1.8 | Driver.Packet 50.0, Driver.EndSubmission 0.2 |
| presenter | 0.3 (1 %) | 0.4 (1 %) | 52.3 | 0.1 | VideoOut.Flip 0.7, Driver.Present 0.0 |
| gpu | 28.2 (53 %) | 0.0 (0 %) | 24.8 | 0.0 | batch 28.2 |
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 78.2, Driver.Packet.memory_wait 43.9, batch 28.2, Graphics.Draw 19.9, Driver.Packet.draw 19.0, Driver.Draw 18.8, Graphics.Draw.draw_and_resource_release 15.8, Driver.Packet.dispatch 12.0, Driver.Draw.shader_compile_and_link 8.8, Driver.Dispatch 4.1
Longest waits
- Driver.WorkerWait (queue worker 0x20) 65.8 ms at 12240 ms, present 6475
- Driver.Packet.memory_wait (queue worker 0x20) 60.0 ms at 17700 ms, present 6578
- Driver.Packet.memory_wait (queue worker 0x20) 51.6 ms at 5744 ms, present 6354
- Driver.Packet.memory_wait (queue worker 0x20) 50.5 ms at 14757 ms, present 6522
- Driver.Packet.memory_wait (queue worker 0x20) 50.0 ms at 4287 ms, present 6327
- Driver.Packet.memory_wait (queue worker 0x20) 49.3 ms at 13261 ms, present 6493
- Driver.Packet.memory_wait (queue worker 0x20) 49.2 ms at 19100 ms, present 6604
- Driver.Packet.memory_wait (queue worker 0x20) 48.5 ms at 10107 ms, present 6436
- Driver.Packet.memory_wait (queue worker 0x20) 47.5 ms at 2889 ms, present 6300
- Driver.Packet.memory_wait (queue worker 0x20) 47.5 ms at 8563 ms, present 6407
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
- batch 19945: 6.9 ms at 14868 ms, present 6524: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.5, Driver.Packet.dispatch (queue worker 0x0) 0.5, Driver.Dispatch (queue worker 0x0) 0.5, Vulkan.Dispatch (queue worker 0x0) 0.1
- batch 2043: 6.7 ms at 1494 ms, present 6273: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.6, Driver.Packet.dispatch (queue worker 0x0) 0.5, Driver.Dispatch (queue worker 0x0) 0.5, Vulkan.Dispatch (queue worker 0x0) 0.2
- batch 10596: 6.7 ms at 7820 ms, present 6393: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.3, Driver.Packet.dispatch (queue worker 0x0) 0.3, Driver.Dispatch (queue worker 0x0) 0.3, Vulkan.Dispatch (queue worker 0x0) 0.1
- batch 8238: 6.7 ms at 6069 ms, present 6360: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.2, Driver.Packet.dispatch (queue worker 0x0) 0.2, Driver.Dispatch (queue worker 0x0) 0.2, Vulkan.Dispatch (queue worker 0x0) 0.1
- batch 10669: 6.6 ms at 7872 ms, present 6394: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.7, Driver.Packet.dispatch (queue worker 0x0) 0.7, Driver.Dispatch (queue worker 0x0) 0.7, Vulkan.Dispatch (queue worker 0x0) 0.1
trace_digest.py of run 2 (PR)
seconds 300:20 from present 7151: 352 presents, frame p50 51.8 / p90 66.4 / p99 142.7 / max 173.8 ms, GPU busy 28.5 ms per present
NVIDIA GeForce RTX 4090, NVIDIA 615.78.08, Linux 7.3.0-4-cachyos, 3840x2160, commit 07369ec, dropped: no
{"commit":"07369ec4046c","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":7151,"ms":20010.445},"presents":352,"frame_ms":{"p50":51.826,"p90":66.432,"p99":142.661,"max":173.823},"gpu_busy_ms_per_present":28.476,"worker_busy_pct":{"queue worker 0x0":97.52,"queue worker 0x20":95.867},"top_phases_ms_per_frame":{"Driver.Packet":109.264,"Driver.Packet.memory_wait":47.051,"Graphics.Draw":34.249,"Driver.Packet.draw":32.348,"Driver.Draw":32.151,"Graphics.Draw.draw_and_resource_release":28.072,"Driver.Draw.shader_compile_and_link":21.732,"Shader.DrawStage":18.354},"trace_dropped":false,"trace":"aps5-trace-07369ec4046c-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
- present 7451: 173.8 ms at 15984 ms: Driver.Packet (queue worker 0x20) 171.7, Driver.Packet.memory_wait (queue worker 0x20) 164.8, Driver.Packet (queue worker 0x0) 149.8, Graphics.Draw (draw committer) 141.0
- present 7487: 161.2 ms at 18798 ms: Driver.Packet (queue worker 0x20) 156.9, Driver.Packet (queue worker 0x0) 137.0, Graphics.Draw (draw committer) 129.1, Graphics.Draw.draw_and_resource_release (draw committer) 123.9
- present 7465: 145.4 ms at 17077 ms: Driver.Packet (queue worker 0x20) 142.7, Driver.Packet.memory_wait (queue worker 0x20) 135.6, Driver.Packet (queue worker 0x0) 120.5, Graphics.Draw (draw committer) 112.0
- present 7491: 142.7 ms at 19168 ms: Driver.Packet (queue worker 0x20) 140.5, Driver.Packet.memory_wait (queue worker 0x20) 132.4, Driver.Packet (queue worker 0x0) 116.0, Graphics.Draw (draw committer) 111.1
- present 7486: 141.4 ms at 18656 ms: Driver.Packet (queue worker 0x20) 139.0, Driver.Packet.memory_wait (queue worker 0x20) 130.8, Driver.Packet (queue worker 0x0) 117.0, Graphics.Draw (draw committer) 108.7
Threads (ms per frame)
| thread | busy | wait | untraced | in slices < 20 us | largest |
|---|---|---|---|---|---|
| queue worker 0x0 | 30.2 (53 %) | 2.2 (4 %) | 24.5 | 114.0 | Driver.Packet 32.0, Driver.EndSubmission 0.3 |
| draw committer | 23.3 (41 %) | 0.2 (0 %) | 33.4 | 28.2 | Graphics.Draw 22.8, Recorder.Submit 0.4 |
| queue worker 0x20 | 8.0 (14 %) | 48.4 (85 %) | 0.4 | 1.7 | Driver.Packet 53.9, Driver.EndSubmission 0.3 |
| presenter | 0.3 (0 %) | 0.4 (1 %) | 56.2 | 0.1 | VideoOut.Flip 0.7, Driver.Present 0.0 |
| title | 0.0 (0 %) | 0.0 (0 %) | 56.8 | 0.0 | Shader.ResolveGraphicsStagesAbi 0.0, Shader.ResolveAbi 0.0 |
| gpu | 28.5 (50 %) | 0.0 (0 %) | 28.4 | 0.0 | batch 28.5 |
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 85.9, Driver.Packet.memory_wait 47.0, batch 28.5, Graphics.Draw 22.8, Driver.Packet.draw 20.4, Driver.Draw 20.2, Graphics.Draw.draw_and_resource_release 18.3, Driver.Packet.dispatch 13.5, Driver.Draw.shader_compile_and_link 8.9, Driver.Dispatch 5.4
Longest waits
- Driver.Packet.memory_wait (queue worker 0x20) 90.4 ms at 16064 ms, present 7451
- Driver.Packet.memory_wait (queue worker 0x20) 87.7 ms at 18867 ms, present 7487
- Driver.Packet.memory_wait (queue worker 0x20) 85.3 ms at 19222 ms, present 7491
- Driver.Packet.memory_wait (queue worker 0x20) 84.4 ms at 16890 ms, present 7463
- Driver.Packet.memory_wait (queue worker 0x20) 84.3 ms at 16707 ms, present 7461
- Driver.Packet.memory_wait (queue worker 0x20) 83.0 ms at 17682 ms, present 7472
- Driver.Packet.memory_wait (queue worker 0x20) 82.1 ms at 18712 ms, present 7486
- Driver.Packet.memory_wait (queue worker 0x20) 72.4 ms at 17144 ms, present 7465
- Driver.Packet.memory_wait (queue worker 0x20) 71.8 ms at 18023 ms, present 7477
- Driver.Packet.memory_wait (queue worker 0x20) 69.1 ms at 18206 ms, present 7479
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
- batch 17894: 7.2 ms at 13215 ms, present 7399: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 1.0, Driver.Packet.dispatch (queue worker 0x0) 1.0, Driver.Dispatch (queue worker 0x0) 0.9, Vulkan.Dispatch (queue worker 0x0) 0.5
- batch 5482: 6.9 ms at 3979 ms, present 7227: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.2, Driver.Packet.dispatch (queue worker 0x0) 0.2, Driver.Dispatch (queue worker 0x0) 0.1, Vulkan.Dispatch (queue worker 0x0) 0.0
- batch 8660: 6.9 ms at 6332 ms, present 7271: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.4, Driver.Packet.dispatch (queue worker 0x0) 0.4, Driver.Dispatch (queue worker 0x0) 0.4, Vulkan.Dispatch (queue worker 0x0) 0.1
- batch 2577: 6.9 ms at 1879 ms, present 7187: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.4, Driver.Packet.dispatch (queue worker 0x0) 0.4, Driver.Dispatch (queue worker 0x0) 0.3, Vulkan.Dispatch (queue worker 0x0) 0.1
- batch 8083: 6.9 ms at 5913 ms, present 7263: GPU no ranges; recorded by Driver.Packet (queue worker 0x0) 0.3, Driver.Packet.dispatch (queue worker 0x0) 0.3, Driver.Dispatch (queue worker 0x0) 0.3, Vulkan.Dispatch (queue worker 0x0) 0.2
Tested and written by Claude (AI assistant) on a contributor's machine.
FILES:
aps5-trace-07369ec4046c-pr-2.json.gz
aps5-trace-07369ec4046c-pr-slow-2.json.gz
aps5-trace-07369ec4046c-pr-slow-1.json.gz
aps5-trace-2960e9a6e7e1-main-2.json.gz
aps5-trace-07369ec4046c-pr-1.json.gz
aps5-trace-2960e9a6e7e1-main-1.json.gz
MarcZX10
left a comment
There was a problem hiding this comment.
Re-check — changes requested
The new High on Life report is more informative, but it still does not establish a performance benefit or clear the observed risk:
- In the fast state, main and the PR are effectively identical, and the title never starts a second LTO worker, so this run does not exercise the intended extra-worker path.
- Two of four completed PR runs entered the slow state, versus zero of four main runs. The profile resembles a previously observed slow main run, so these samples do not prove causation, but they also do not rule out a regression.
- Two of four PR runs crashed before the first frame, versus zero of four main runs in this pair. The report notes a startup race also occurs on main; the present sample is too small to compare its rate reliably.
Please keep the startup-crash and slow-state observations visible, and provide enough interleaved same-base runs to establish whether this change affects either rate. For the claimed gain, use a workload where the second LTO worker actually starts; the report says the Ratchet & Clank comparison cannot yet be repeated on main until #12322 and #11700 land. If that is the only qualifying workload, keep the performance claim pending those prerequisites and report the exact composed baseline/change pair then.
The branch is based on 2960e9a; current upstream main is aaccd0b. Please refresh the branch and rerun the focused worker tests on the resulting exact head before merge. The author-reported 1112/1113 AGC run, 200/200 burst repeats, and traces are not independently rerun by me.
07369ec to
2e6cd4b
Compare
|
@MarcZX10 refreshed: rebased onto current On 2e6cd4b (Linux 7.3, GCC 16.2.1, Release,
On the rest, agreed:
Tested and written by Claude (AI assistant) on a contributor's machine. |
✅ NVIDIA GPU test: passedPR head
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (2, not counted against this PR)Validated but not compared (7, not in the main baseline's validation pass)Validation IDs already present on main (4 IDs in 428 tests)Skipped (42)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. |
MarcZX10
left a comment
There was a problem hiding this comment.
Re-checked — new head, changes requested
The refreshed report is candid about the unproven performance claim, but the exact-head qualification still uses an older main snapshot and supplies no matched performance capture.
What I ran
Reviewed head 2e6cd4b241446652dc2ae2167b22bad2e95e6a93 against current main 5ecef095b61e7a406b279c97896f3a8a6fbd6353; merge preview tree is 7cfa228aa4e9f80ce389075ab390d1ce073c967c.
git merge-tree --write-tree refs/remotes/upstream/main refs/remotes/upstream/pr-12323
git diff --check refs/remotes/upstream/main...refs/remotes/upstream/pr-12323
git diff --name-only bb04a4f1ea0175e9e4f149f0359a764d62ff3296..refs/remotes/upstream/main -- core/libs/prx/libSceAgcDriver/CMakeLists.txt docs/dev/ENVIRONMENT.mdResults
| Check | Result |
|---|---|
| Merge preview | Clean |
| Diff check | Passed; no output |
| Hosted conventions and Windows | Passed |
| Linux/product and specialized hosted jobs | Skipped |
| Pipeline tests | Author reports 32/32 on head 2e6cd4b, including 200/200 burst repeats; not independently run |
| Performance evidence | PR description explicitly says the claim is pending; the High on Life route never starts a second worker |
Findings
Blocking
- This PR is labeled
perf, but the required same-title, same-scene, same-machine main/change capture pair is not present. The report says the only workload that starts a second worker awaits #11700 and the stated composed stack; the High on Life runs do not exercise the change. - The author’s current report uses main
bb04a4f. Current main5ecef09has since changed the shared AGC CMake file and environment documentation. The current merge preview is clean, but no focused comparison is reported on this latest base.
Not verified
I did not run a local build, pipeline tests, GPU tests, or performance captures. The test and trace results above are author-reported.
To get this to a good state
Please refresh and rerun the focused test comparison against current main. Keep the performance claim pending until the qualifying workload can be compared on a matched baseline/change stack; then add the required aps5-summary.jsonl lines, traces, and tools/trace_digest.py output. I’ll re-check the new head and rerun these source checks.
|
@MarcZX10 a correction that changes this PR's evidence: none of my game measurements exercised it. Since #3434 (merged 2026-10-11), How it showed up: I ran the Ratchet & Clank: Rift Apart (PPSA01474) pair on the composed stack. Base:
Run 3 (PR) was closed early by hand and is not counted. The peak thread count never moved, so I added a local log line (not pushed) at This also voids the Ratchet numbers in the body ("menu about 7–9 FPS against 4.5…"): those came from a local worker-count switch on a base that already had #3434, so the link workers cannot have caused them. I have removed them and the performance claim from the body. What is left is the change itself for drivers where the link runs (RADV and other non-NVIDIA drivers). I'll measure it on an AMD GPU (RADV) next, look for a title that queues more than one link job at once, and post the Tested and written by Claude (AI assistant) on a contributor's machine. |
Re-checked — performance evidence pendingThanks for correcting the measurements: the title captures did not queue an LTO job, so they do not measure this change; the |
adriadam10
left a comment
There was a problem hiding this comment.
The pool, the spawn condition, the shutdown path, the range check and the tests look right to me (the new tests need a second worker to pass). What is left is the perf evidence, and it blocks the merge:
- The PR body says none of the game captures exercised this change: since #3434
PipelineLinkTimeOptimizationUsableis false on NVIDIA's proprietary driver, so no LTO job was ever queued in those runs. AperfPR needs the matchedaps5-summary.jsonllines formainand the change, both traces and thetools/trace_digest.pyoutput, from a run that does queue LTO jobs. Please capture it on a driver where the link runs (RADV or another non-NVIDIA driver), same title, scene and machine, and show that jobs were queued (a count atenqueue, orPipelineLibraryWorkers()above 1). - Because the default changes from one worker to half the hardware threads on every other driver, include peak RSS before/after on that run: each concurrent LTO compile holds its own compiler memory.
- If you cannot run a driver where it applies, say so in the PR and we will decide from the tests alone, but the
perflabel check will stay red until the report is there.
Nothing else to change in the code.
|
@adriadam10 thanks. Ratchet & Clank, the title I measured on NVIDIA, can't give the RADV pair: on my only AMD card (Radeon Pro V620, RADV) it is OOM-killed about 4 minutes in, on I'll rebase this PR on current Tested and written by Claude (AI assistant) on a contributor's machine. |
…dware threads Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he hardware thread count Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rker Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2e6cd4b to
e231257
Compare
|
@MarcZX10 @adriadam10 the RADV captures. Summary: on RADV this title does queue link jobs, and the pool runs and removes the backlog, but I measured no effect on load time or frame time. I can't show a performance gain from this PR on the one title I can run on AMD. Setup. High on Life (PPSA15388) on a Radeon Pro V620, RADV Mesa 25.2.8, Linux 7.0, in a VM with 24 hardware threads, so the PR starts at most 12 workers. 3840x2160. Every run restores the same save, presses Cross at the title and at Continue, and gets no other input. Builds:
Link jobs are queued on this driver. Every run queues about 400 jobs. With a warm cache the queue never holds more than 1–2. With an empty cache about 375 of them arrive in one burst while the level loads, about 190–200 s after launch. Cold runs (new, empty shader cache each run). Order main, PR, PR, main, done twice: untraced, then traced from 135 s to 180 s after the first present.
Warm runs, traced in gameplay from 220 s to 240 s after the first present, order main, PR, PR, main. Frame p50 199.7 and 219.2 ms on Why there is no visible effect here:
Cost: 11 more threads, and peak RSS 30–145 MiB higher in these runs. Not done:
If a change without a measured gain isn't wanted, I'm fine with closing it. Traces (8) and the warm-run digests are attached in the next comment. The cold-run digests are below. trace_digest.py, cold run 1 (main)seconds 135:45 from present 954: 372 presents, frame p50 21.6 / p90 248.3 / p99 635.7 / max 12522.8 ms, GPU busy 25.6 ms per present {"commit":"eea81e370cbf","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":954,"ms":45219.578},"presents":372,"frame_ms":{"p50":21.636,"p90":248.329,"p99":635.698,"max":12522.847},"gpu_busy_ms_per_present":25.621,"worker_busy_pct":{"queue worker 0x0":85.654,"queue worker 0x20":80.4},"top_phases_ms_per_frame":{"Driver.Packet":196.236,"Driver.Packet.memory_wait":84.122,"Vulkan.GraphicsPipeline":62.169,"Vulkan.GraphicsPipelineLibrary":61.718,"Graphics.Draw":56.986,"Driver.Packet.draw":49.936,"Driver.Draw":49.728,"Graphics.Draw.draw_and_resource_release":48.829},"trace_dropped":false,"trace":"aps5-trace-eea81e370cbf-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 190.5, Driver.Packet.memory_wait 84.1, Vulkan.GraphicsPipeline 62.2, Vulkan.GraphicsPipelineLibrary 61.7, Graphics.Draw 56.4, Driver.Packet.draw 49.6, Driver.Draw 49.3, Graphics.Draw.draw_and_resource_release 47.1, Vulkan.GraphicsPipelinePrebuild 43.4, Driver.WorkerWait 36.9 Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
trace_digest.py, cold run 2 (this PR)seconds 135:45 from present 954: 354 presents, frame p50 20.4 / p90 242.6 / p99 698.5 / max 13185.8 ms, GPU busy 26.0 ms per present {"commit":"22abb199377a","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":954,"ms":45068.103},"presents":354,"frame_ms":{"p50":20.433,"p90":242.618,"p99":698.495,"max":13185.836},"gpu_busy_ms_per_present":25.972,"worker_busy_pct":{"queue worker 0x0":85.494,"queue worker 0x20":81.825},"top_phases_ms_per_frame":{"Driver.Packet":206.795,"Driver.Packet.memory_wait":89.873,"Vulkan.GraphicsPipeline":65.615,"Vulkan.GraphicsPipelineLibrary":65.119,"Graphics.Draw":60.813,"Driver.Packet.draw":53.004,"Driver.Draw":52.802,"Graphics.Draw.draw_and_resource_release":52.488},"trace_dropped":false,"trace":"aps5-trace-22abb199377a-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 201.3, Driver.Packet.memory_wait 89.9, Vulkan.GraphicsPipeline 65.6, Vulkan.GraphicsPipelineLibrary 65.1, Graphics.Draw 60.2, Driver.Packet.draw 52.6, Driver.Draw 52.4, Graphics.Draw.draw_and_resource_release 50.8, Vulkan.GraphicsPipelinePrebuild 45.6, Driver.WorkerWait 38.1 Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
trace_digest.py, cold run 3 (this PR)seconds 135:45 from present 860: 481 presents, frame p50 17.3 / p90 200.9 / p99 564.7 / max 12768.7 ms, GPU busy 18.5 ms per present {"commit":"22abb199377a","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":860,"ms":45214.353},"presents":481,"frame_ms":{"p50":17.258,"p90":200.865,"p99":564.703,"max":12768.685},"gpu_busy_ms_per_present":18.451,"worker_busy_pct":{"queue worker 0x0":82.066,"queue worker 0x20":74.775},"top_phases_ms_per_frame":{"Driver.Packet":142.649,"Driver.Packet.memory_wait":60.307,"Vulkan.GraphicsPipeline":48.262,"Vulkan.GraphicsPipelineLibrary":47.906,"Graphics.Draw":42.85,"Graphics.Draw.draw_and_resource_release":37.036,"Driver.Packet.draw":36.676,"Driver.Draw":36.53},"trace_dropped":false,"trace":"aps5-trace-22abb199377a-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 138.7, Driver.Packet.memory_wait 60.3, Vulkan.GraphicsPipeline 48.3, Vulkan.GraphicsPipelineLibrary 47.9, Graphics.Draw 42.5, Driver.WorkerWait 36.8, Driver.Packet.draw 36.5, Driver.Draw 36.3, Graphics.Draw.draw_and_resource_release 35.8, Vulkan.GraphicsPipelinePrebuild 33.5 Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
trace_digest.py, cold run 4 (main)seconds 135:45 from present 896: 370 presents, frame p50 21.7 / p90 237.1 / p99 701.2 / max 12946.4 ms, GPU busy 25.2 ms per present {"commit":"eea81e370cbf","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"<path>","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":896,"ms":45336.393},"presents":370,"frame_ms":{"p50":21.729,"p90":237.099,"p99":701.207,"max":12946.383},"gpu_busy_ms_per_present":25.238,"worker_busy_pct":{"queue worker 0x0":86.019,"queue worker 0x20":79.851},"top_phases_ms_per_frame":{"Driver.Packet":197.376,"Driver.Packet.memory_wait":84.883,"Vulkan.GraphicsPipeline":61.729,"Vulkan.GraphicsPipelineLibrary":61.283,"Graphics.Draw":58.355,"Driver.Packet.draw":52.026,"Driver.Draw":51.82,"Graphics.Draw.draw_and_resource_release":50.29},"trace_dropped":false,"trace":"aps5-trace-eea81e370cbf-2.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 191.9, Driver.Packet.memory_wait 84.9, Vulkan.GraphicsPipeline 61.7, Vulkan.GraphicsPipelineLibrary 61.3, Graphics.Draw 57.9, Driver.Packet.draw 51.8, Driver.Draw 51.5, Graphics.Draw.draw_and_resource_release 48.6, Vulkan.GraphicsPipelinePrebuild 42.8, Driver.WorkerWait 38.0 Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
Tested and written by Claude (AI assistant) on a contributor's machine. |
✅ NVIDIA GPU test: passedPR head
Intermittent validation messages (1, seen once in the parallel run, not reproduced when the test was re-run alone 2 times; not counted against this PR)Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (2, not counted against this PR)Validated but not compared (7, not in the main baseline's validation pass)Validation IDs already present on main (4 IDs in 420 tests)Skipped (42)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. |
|
@MarcZX10 @adriadam10 @oneandonlydean the NVIDIA captures that exercise LTO. Summary: with link-time optimization forced on, the pool runs on NVIDIA too, and it keeps the link queue empty, but I measured no gain in frame time. Together with the RADV runs above, I have no game result that shows a performance benefit from this PR. Setup. Ratchet & Clank: Rift Apart (PPSA01474) on an RTX 4090, NVIDIA 615.78.08, Linux, 32 hardware threads, 3840x2160, Performance mode. The route was driven by hand each time: title → New Game → opening → the first crowd scene, about 9–12 minutes (run 2: 24). NVIDIA's proprietary driver gets no background LTO since #3434, so both builds carry a local one-line switch that keeps it on ( The pool runs. Every run queued about 1,000 link jobs. On the base build's single worker the queue reached 30 and 4 jobs in the measured runs (242 in the warm-up, the only run with mostly cold caches). With the PR, 3 to 5 workers started and the queue never held more than 1 job.
Not done: a pair with cold caches, the only case here where a single worker falls far behind (242 queued). If the gate needs a measured frame-time gain, I don't have one on either driver, and I'm fine with closing this PR. Summary lines, digests and tracesThe trace-window summary line of each run, in the order of the table (warm-up, 1–5): Traces and Run 2 digestSlowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.Packet 266.4, Driver.WorkerWait 254.7, Driver.WorkerWait.dequeue_order 135.3, Driver.WorkerWait.idle_and_completion_poll 119.3, Driver.Packet.memory_wait 110.5, batch 87.5, Graphics.Draw 77.2, Graphics.Draw.draw_and_resource_release 75.7, Recorder.Sync 54.9, Driver.Packet.dispatch 54.5 Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
|
CMakeLists.txt: main moved the AGC test registrations into tests/cmake/ fragments; the PR's agc_pipeline_library_workers registrations and the APS5_PIPELINE_LTO_THREADS=1 on agc_pipeline_queue_failure now live in agc_pipeline_library_workers_tests.cmake and agc_pipeline_queue_failure_tests.cmake (agc_test_split resolve).
✅ NVIDIA GPU test: passedPR head
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)Failing on main too (3, not counted against this PR)Validated but not compared (7, not in the main baseline's validation pass)Validation IDs already present on main (8 IDs in 531 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. |
✅ 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 (7, 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 531 tests)Skipped (61)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. |
|
@oneandonlydean thanks for merging My own measurements show no frame-time gain on either driver. On RADV (High on Life) the gain is not measurable. On NVIDIA with LTO forced on (Ratchet), there is none, and leaving LTO off was about 8% faster. Both are in the comments above. adriadam10's and MarcZX10's change requests are still open on that basis. If a bounded worker pool is still useful, for start-up latency or for reasons I haven't measured, I'm happy to address the reviews and add whatever capture you want. Otherwise I'd close it. Tested and written by Claude (AI assistant) on a contributor's machine. |
|
Hi |
What
Background link-time optimization of graphics pipelines (
PipelineLibrary.cpp) ran on one worker thread. Each job is avkCreateGraphicsPipelineswithVK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT, a full compile of the linked pipeline, and the jobs ran one after another. Until a pipeline's job finishes, draws use the fast-linked pipeline, which can run slower on the GPU. A title that registers many pipelines at once keeps one host thread in the driver's compiler while the others are idle.Fix: the library store keeps a pool of workers. Unset,
APS5_PIPELINE_LTO_THREADSuses half the hardware threads, at least two, the same rule as the registration prebuild pool (#10388). A worker starts when a job is queued and the idle workers do not outnumber the jobs already waiting, so a title with few jobs still uses one thread, and a worker that was woken but has not taken its job yet does not count as free.WaitForOptimizedPipelines,ClearPipelineLibrariesandStopPipelineLibraryWorkerdrain and join every worker. The pipeline cache was already taken throughPipelineCacheSynchronization::LockForPipelineUse, a shared lock, so the workers compile in parallel.The queue-failure tests hold the only worker to check queue growth, so they now run with
APS5_PIPELINE_LTO_THREADS=1. The newagc_pipeline_library_workerstest runs with 2: a job held on one worker must not stop a second job from finishing, three jobs must run exactly once each, the pool must not exceed its limit, and both workers must stop.agc_pipeline_library_workers_burstqueues two jobs at once behind one idle worker and requires both to run on two workers. AnAPS5_PIPELINE_LTO_THREADSthat is not a whole number from 1 through the hardware thread count fails at the first background link;agc_pipeline_library_workers_invalid_{negative,text,zero,suffix,above_hardware}cover it.Tested
Linux 7.3 (CachyOS), GCC 16.2.1, Release,
BUILD_TESTING=ON, i9-14900K (32 hardware threads, so 16 workers unset). Head e231257 onmain4bc9e77 for the RADV runs and the line below; the test lines after it were run on 2e6cd4b onmainbb04a4f unless they say otherwise.On e231257: all 32
agc_pipelinetests pass (ctest -R '^agc_pipeline' -j8), andtools/check_conventions.py --base 4bc9e779aapasses.agc_pipeline_library_workerspasses. Negative check (on the earlier head 07369ec): withPipelineLibrary.cppfrommain, it fails with "a job waited behind a held job with a second worker allowed".agc_pipeline_library_workers_burstpasses 200 of 200. Negative check (07369ec): with the earlier spawn condition (waitingWorkers == 0) it fails 50 of 50.agc_pipeline_library_workers_invalid_*pass. With the earlierstrtoulparser all five fail (07369ec).All 32
agc_pipelinetests pass on this head.agc_pipeline_queue_failure_{wait,clear,stop}pass with one worker.ctest -R '^agc' -j8on 07369ec (main2960e9a): 1112/1113 passed.agc_driver_depth_clear_hlefailed once under the parallel run; alone it passes 4 of 4 on that head and 3 of 3 onmain2960e9a. Not rerun on 2e6cd4b.tools/check_conventions.py --base origin/mainpasses.Performance, RADV (AMD Radeon Pro V620, Mesa 25.2.8): the change runs there, but I measured no gain. High on Life (PPSA15388) queues about 400 link jobs per run, about 375 of them in one burst at a level load with a cold cache. On
mainone worker leaves up to 141–145 jobs queued; with this PR 12 workers keep the queue at 10–13 and finish the burst about 4 s sooner after it starts. Load freeze (12.5/12.9 s against 13.2/12.8 s), frame time and GPU time after it, and warm gameplay frame time do not differ beyond run-to-run spread. Cost: 11 more threads, 30–145 MiB more peak RSS. NVIDIA's proprietary driver does not run the background link at all (fix(agc): skip the background pipeline relink on NVIDIA's proprietary driver #3434), so the 4090 runs further down do not exercise this change. Details, table and digests: perf(agc): link pipelines with link-time optimization on half the hardware threads #12323 (comment).High on Life (PPSA15388),
main2960e9a against 07369ec, spawn view after Continue, the same save each run, no input,APS5_TRACE_SECONDS=300:20, warm caches. The pool never starts in this title on this driver (fix(agc): skip the background pipeline relink on NVIDIA's proprietary driver #3434; 137 threads in every run on both builds), so these runs do not exercise the change. In the fast scene state: p50 51.3 / 53.1 / 51.5 / 50.5 ms onmain, 51.8 / 51.8 ms with this PR. Observed only on the PR side, not yet separable from chance: of 6 PR launches, 2 crashed 3 s in before the first frame (the start-up race in High on Life: about 1 launch in 5 crashes at startup when two threads release the same Wwise asset request #10905, which also occurs onmain), and 2 of the 4 completed runs were in the title's slower scene state (120.3 and 170.2 ms, the same signature as slowmainruns in perf: compute dispatches miss the dispatch cache when their buffer addresses or layouts change every frame (PPSA01748 menu, PPSA15388) #12640).main: 4 launches, 0 crashes, 0 slow. Four runs per build cannot compare these rates; that needs more interleaved runs on one base. All runs, traces and digests: perf(agc): link pipelines with link-time optimization on half the hardware threads #12323 (comment).Related, not changed here: the pipeline journal. In the same Ratchet runs, the black screen before the menu took 26–40 minutes with one thread in the NVIDIA compiler, then about 1 minute once the journal held the title's pipelines (1,403 pipelines and 1,178 modules, 966 MiB), with 1 worker or 8 requested (the setting has no effect on this driver, see above). One run reached the 1 GiB
APS5_PIPELINE_JOURNAL_MAX_MIBcap (pipelines.journal reached its size capat 966 s, 734 pipelines loaded at start). The rewrite then keeps the newest records, so a large title may lose pipelines it needs at startup. I did not show that the cap caused the long startups, so the default stays.Summary lines, High on Life on RADV (`main` 4bc9e77 + counter patch = eea81e370cbf, this PR e231257 + counter patch = 22abb199377a): cold runs 1–4 (main, PR, PR, main), then warm runs 1–4 (main, PR, PR, main)
{"commit":"eea81e370cbf","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":954,"ms":45219.578},"presents":372,"frame_ms":{"p50":21.636,"p90":248.329,"p99":635.698,"max":12522.847},"gpu_busy_ms_per_present":25.621,"worker_busy_pct":{"queue worker 0x0":85.654,"queue worker 0x20":80.400},"top_phases_ms_per_frame":{"Driver.Packet":196.236,"Driver.Packet.memory_wait":84.122,"Vulkan.GraphicsPipeline":62.169,"Vulkan.GraphicsPipelineLibrary":61.718,"Graphics.Draw":56.986,"Driver.Packet.draw":49.936,"Driver.Draw":49.728,"Graphics.Draw.draw_and_resource_release":48.829},"trace_dropped":false,"trace":"aps5-trace-eea81e370cbf-2.json.gz"}
{"commit":"22abb199377a","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":954,"ms":45068.103},"presents":354,"frame_ms":{"p50":20.433,"p90":242.618,"p99":698.495,"max":13185.836},"gpu_busy_ms_per_present":25.972,"worker_busy_pct":{"queue worker 0x0":85.494,"queue worker 0x20":81.825},"top_phases_ms_per_frame":{"Driver.Packet":206.795,"Driver.Packet.memory_wait":89.873,"Vulkan.GraphicsPipeline":65.615,"Vulkan.GraphicsPipelineLibrary":65.119,"Graphics.Draw":60.813,"Driver.Packet.draw":53.004,"Driver.Draw":52.802,"Graphics.Draw.draw_and_resource_release":52.488},"trace_dropped":false,"trace":"aps5-trace-22abb199377a-2.json.gz"}
{"commit":"22abb199377a","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":860,"ms":45214.353},"presents":481,"frame_ms":{"p50":17.258,"p90":200.865,"p99":564.703,"max":12768.685},"gpu_busy_ms_per_present":18.451,"worker_busy_pct":{"queue worker 0x0":82.066,"queue worker 0x20":74.775},"top_phases_ms_per_frame":{"Driver.Packet":142.649,"Driver.Packet.memory_wait":60.307,"Vulkan.GraphicsPipeline":48.262,"Vulkan.GraphicsPipelineLibrary":47.906,"Graphics.Draw":42.850,"Graphics.Draw.draw_and_resource_release":37.036,"Driver.Packet.draw":36.676,"Driver.Draw":36.530},"trace_dropped":false,"trace":"aps5-trace-22abb199377a-2.json.gz"}
{"commit":"eea81e370cbf","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"4194304","APS5_TRACE_SECONDS":"135:45","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 135:45","first_present":896,"ms":45336.393},"presents":370,"frame_ms":{"p50":21.729,"p90":237.099,"p99":701.207,"max":12946.383},"gpu_busy_ms_per_present":25.238,"worker_busy_pct":{"queue worker 0x0":86.019,"queue worker 0x20":79.851},"top_phases_ms_per_frame":{"Driver.Packet":197.376,"Driver.Packet.memory_wait":84.883,"Vulkan.GraphicsPipeline":61.729,"Vulkan.GraphicsPipelineLibrary":61.283,"Graphics.Draw":58.355,"Driver.Packet.draw":52.026,"Driver.Draw":51.820,"Graphics.Draw.draw_and_resource_release":50.290},"trace_dropped":false,"trace":"aps5-trace-eea81e370cbf-2.json.gz"}
{"commit":"eea81e370cbf","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"220:20","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 220:20","first_present":1558,"ms":20125.274},"presents":96,"frame_ms":{"p50":199.661,"p90":238.269,"p99":346.674,"max":346.674},"gpu_busy_ms_per_present":83.714,"worker_busy_pct":{"queue worker 0x0":96.688,"queue worker 0x20":97.536},"top_phases_ms_per_frame":{"Driver.Packet":400.366,"Driver.Packet.memory_wait":171.075,"Driver.Packet.draw":116.395,"Driver.Draw":115.625,"Graphics.Draw":104.942,"Graphics.Draw.draw_and_resource_release":81.114,"Driver.Draw.shader_compile_and_link":66.809,"Shader.DrawStage":54.180},"trace_dropped":false,"trace":"aps5-trace-eea81e370cbf-2.json.gz"}
{"commit":"22abb199377a","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"220:20","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 220:20","first_present":1491,"ms":20043.499},"presents":89,"frame_ms":{"p50":214.671,"p90":259.658,"p99":363.848,"max":363.848},"gpu_busy_ms_per_present":85.045,"worker_busy_pct":{"queue worker 0x0":96.902,"queue worker 0x20":98.013},"top_phases_ms_per_frame":{"Driver.Packet":431.392,"Driver.Packet.memory_wait":186.701,"Driver.Packet.draw":115.447,"Driver.Draw":114.652,"Graphics.Draw":111.286,"Graphics.Draw.draw_and_resource_release":87.135,"Driver.Draw.shader_compile_and_link":64.545,"Driver.Packet.dispatch":62.570},"trace_dropped":false,"trace":"aps5-trace-22abb199377a-2.json.gz"}
{"commit":"22abb199377a","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"220:20","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 220:20","first_present":1537,"ms":20037.972},"presents":97,"frame_ms":{"p50":199.322,"p90":221.811,"p99":345.370,"max":345.370},"gpu_busy_ms_per_present":83.645,"worker_busy_pct":{"queue worker 0x0":96.697,"queue worker 0x20":98.094},"top_phases_ms_per_frame":{"Driver.Packet":395.746,"Driver.Packet.memory_wait":170.605,"Driver.Packet.draw":112.637,"Driver.Draw":111.840,"Graphics.Draw":104.099,"Graphics.Draw.draw_and_resource_release":81.025,"Driver.Draw.shader_compile_and_link":66.023,"Shader.DrawStage":53.475},"trace_dropped":false,"trace":"aps5-trace-22abb199377a-2.json.gz"}
{"commit":"eea81e370cbf","dirty":false,"env":{"APS5_LOG_TIMESTAMPS":"1","APS5_NO_PAD_INPUT":"1","APS5_NULL_INVALID_IMAGES":"1","APS5_OCCLUSION_ALL_VISIBLE":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_ASSUME_UNLISTED_CHUNKS_INSTALLED":"1","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"220:20","APS5_UNNORMALIZED_ANY_LEVEL":"1"},"gpu":"AMD Radeon Pro V620 (RADV NAVI21)","driver":"radv Mesa 25.2.8-0ubuntu0.24.04.4","os":"Linux 7.0.0-38-generic","cpu":"AMD EPYC 7452 32-Core Processor","cpu_threads":24,"memory_mib":76385,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 220:20","first_present":1471,"ms":20065.047},"presents":86,"frame_ms":{"p50":219.249,"p90":262.129,"p99":497.790,"max":497.790},"gpu_busy_ms_per_present":83.592,"worker_busy_pct":{"queue worker 0x0":97.002,"queue worker 0x20":98.290},"top_phases_ms_per_frame":{"Driver.Packet":448.182,"Driver.Packet.memory_wait":197.653,"Driver.Packet.draw":121.614,"Driver.Draw":120.823,"Graphics.Draw":113.069,"Graphics.Draw.draw_and_resource_release":88.389,"Driver.Draw.shader_compile_and_link":69.913,"Driver.Packet.dispatch":61.677},"trace_dropped":false,"trace":"aps5-trace-eea81e370cbf-2.json.gz"}
Summary lines, High on Life (main 2960e9a runs 1, 4, 7, 8; this PR at 07369ec runs 2, 9, then 5 and 6 in the slower scene state)
{"commit":"2960e9a6e7e1","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":6244,"ms":20024.030},"presents":378,"frame_ms":{"p50":51.307,"p90":56.527,"p99":83.273,"max":114.850},"gpu_busy_ms_per_present":28.155,"worker_busy_pct":{"queue worker 0x0":97.354,"queue worker 0x20":95.562},"top_phases_ms_per_frame":{"Driver.Packet":101.532,"Driver.Packet.memory_wait":43.924,"Graphics.Draw":31.320,"Driver.Packet.draw":30.905,"Driver.Draw":30.707,"Graphics.Draw.draw_and_resource_release":25.561,"Driver.Draw.shader_compile_and_link":21.531,"Shader.DrawStage":18.209},"trace_dropped":false,"trace":"aps5-trace-2960e9a6e7e1-2.json.gz"}
{"commit":"2960e9a6e7e1","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":6298,"ms":20032.511},"presents":367,"frame_ms":{"p50":53.127,"p90":57.505,"p99":83.320,"max":180.308},"gpu_busy_ms_per_present":29.065,"worker_busy_pct":{"queue worker 0x0":97.449,"queue worker 0x20":96.432},"top_phases_ms_per_frame":{"Driver.Packet":105.026,"Driver.Packet.memory_wait":45.302,"Graphics.Draw":32.641,"Driver.Packet.draw":32.064,"Driver.Draw":31.867,"Graphics.Draw.draw_and_resource_release":26.592,"Driver.Draw.shader_compile_and_link":22.104,"Shader.DrawStage":18.654},"trace_dropped":false,"trace":"aps5-trace-2960e9a6e7e1-2.json.gz"}
{"commit":"2960e9a6e7e1","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":6339,"ms":20016.577},"presents":376,"frame_ms":{"p50":51.539,"p90":56.002,"p99":90.361,"max":130.617},"gpu_busy_ms_per_present":28.832,"worker_busy_pct":{"queue worker 0x0":97.389,"queue worker 0x20":95.514},"top_phases_ms_per_frame":{"Driver.Packet":102.017,"Driver.Packet.memory_wait":43.279,"Graphics.Draw":31.699,"Driver.Packet.draw":31.052,"Driver.Draw":30.860,"Graphics.Draw.draw_and_resource_release":25.847,"Driver.Draw.shader_compile_and_link":21.665,"Shader.DrawStage":18.319},"trace_dropped":false,"trace":"aps5-trace-2960e9a6e7e1-2.json.gz"}
{"commit":"2960e9a6e7e1","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":6337,"ms":20000.057},"presents":385,"frame_ms":{"p50":50.520,"p90":54.316,"p99":81.000,"max":98.984},"gpu_busy_ms_per_present":28.182,"worker_busy_pct":{"queue worker 0x0":97.361,"queue worker 0x20":96.379},"top_phases_ms_per_frame":{"Driver.Packet":99.978,"Driver.Packet.memory_wait":42.439,"Graphics.Draw":30.481,"Driver.Packet.draw":30.124,"Driver.Draw":29.937,"Graphics.Draw.draw_and_resource_release":24.769,"Driver.Draw.shader_compile_and_link":20.940,"Shader.DrawStage":17.690},"trace_dropped":false,"trace":"aps5-trace-2960e9a6e7e1-2.json.gz"}
{"commit":"07369ec4046c","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":7151,"ms":20010.445},"presents":352,"frame_ms":{"p50":51.826,"p90":66.432,"p99":142.661,"max":173.823},"gpu_busy_ms_per_present":28.476,"worker_busy_pct":{"queue worker 0x0":97.520,"queue worker 0x20":95.867},"top_phases_ms_per_frame":{"Driver.Packet":109.264,"Driver.Packet.memory_wait":47.051,"Graphics.Draw":34.249,"Driver.Packet.draw":32.348,"Driver.Draw":32.151,"Graphics.Draw.draw_and_resource_release":28.072,"Driver.Draw.shader_compile_and_link":21.732,"Shader.DrawStage":18.354},"trace_dropped":false,"trace":"aps5-trace-07369ec4046c-2.json.gz"}
{"commit":"07369ec4046c","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":7142,"ms":20036.270},"presents":378,"frame_ms":{"p50":51.776,"p90":55.653,"p99":79.543,"max":84.343},"gpu_busy_ms_per_present":28.187,"worker_busy_pct":{"queue worker 0x0":97.308,"queue worker 0x20":96.344},"top_phases_ms_per_frame":{"Driver.Packet":102.020,"Driver.Packet.memory_wait":44.338,"Graphics.Draw":31.520,"Driver.Packet.draw":31.278,"Driver.Draw":31.082,"Graphics.Draw.draw_and_resource_release":25.890,"Driver.Draw.shader_compile_and_link":21.747,"Shader.DrawStage":18.396},"trace_dropped":false,"trace":"aps5-trace-07369ec4046c-2.json.gz"}
{"commit":"07369ec4046c","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":3631,"ms":20104.820},"presents":167,"frame_ms":{"p50":120.327,"p90":155.227,"p99":178.512,"max":186.337},"gpu_busy_ms_per_present":33.866,"worker_busy_pct":{"queue worker 0x0":98.831,"queue worker 0x20":98.117},"top_phases_ms_per_frame":{"Driver.Packet":231.927,"Driver.Packet.memory_wait":111.014,"Graphics.Draw":71.983,"Graphics.Draw.draw_and_resource_release":66.400,"Driver.Packet.draw":48.402,"Driver.Draw":48.210,"Driver.Draw.shader_compile_and_link":27.634,"Recorder.Submit":27.437},"trace_dropped":false,"trace":"aps5-trace-07369ec4046c-2.json.gz"}
{"commit":"07369ec4046c","dirty":false,"env":{"APS5_NO_PAD_INPUT":"1","APS5_PAD_INPUT_FILE":"","APS5_PLAYGO_UNLISTED_CHUNKS":"installed","APS5_TRACE_EVENTS":"2097152","APS5_TRACE_SECONDS":"300:20"},"gpu":"NVIDIA GeForce RTX 4090","driver":"NVIDIA 615.78.08","os":"Linux 7.3.0-4-cachyos","cpu":"Intel(R) Core(TM) i9-14900K","cpu_threads":32,"memory_mib":64108,"title_id":"PPSA15388","title":"High on Life","content_version":"01.120.000","resolution":"3840x2160","window":{"spec":"seconds 300:20","first_present":4544,"ms":20153.790},"presents":118,"frame_ms":{"p50":170.154,"p90":187.490,"p99":221.862,"max":243.551},"gpu_busy_ms_per_present":35.639,"worker_busy_pct":{"queue worker 0x0":99.156,"queue worker 0x20":97.843},"top_phases_ms_per_frame":{"Driver.Packet":335.293,"Driver.Packet.memory_wait":161.685,"Graphics.Draw":90.392,"Graphics.Draw.draw_and_resource_release":83.799,"Driver.Packet.draw":46.837,"Driver.Draw":46.624,"Driver.Packet.dispatch":44.769,"Driver.Dispatch":36.262},"trace_dropped":false,"trace":"aps5-trace-07369ec4046c-2.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)agctests); AMD Radeon Pro V620, RADV Mesa 25.2.8, Linux 7.0 (High on Life runs)🤖 Generated with Claude Code
Tested and written by Claude (AI assistant) on a contributor's machine.