Repository navigation
Conversation
|
This pull request is labeled |
|
The Baseline (without this change): {"commit":"4ff898faefa3","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_DIR":"<path>","APS5_TRACE_FRAMES":"560:100"},"gpu":"AMD Radeon RX 6650 XT (RADV NAVI23)","driver":"radv Mesa 26.2.4-arch1.1","os":"Linux 7.2.9-arch1-1","cpu":"AMD Ryzen 9 7950X 16-Core Processor","cpu_threads":32,"memory_mib":127901,"title_id":"PPSA25636","title":"Echoes of the End","content_version":"01.012.000","resolution":"3840x2160","window":{"spec":"frames 560:100","first_present":560,"ms":105019.366},"presents":100,"frame_ms":{"p50":958.000,"p90":1456.922,"p99":3292.388,"max":3292.388},"gpu_busy_ms_per_present":434.116,"worker_busy_pct":{"queue worker 0x0":99.794,"queue worker 0x20":97.524},"top_phases_ms_per_frame":{"Driver.Packet":2048.790,"Driver.Packet.dispatch":1056.775,"Driver.Dispatch":992.721,"Driver.Packet.memory_wait":677.391,"Vulkan.Dispatch":628.122,"Vulkan.Dispatch.shader_resources":616.824,"Resources.Complete":615.461,"GpuMutex.wait.indirect":147.167},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":41.830,"events_lost":484625,"totals_full":false}},"trace":"aps5-trace-4ff898faefa3-3124014.json.gz"}With this change: {"commit":"a526b9bb47ca","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_DIR":"<path>","APS5_TRACE_FRAMES":"560:100"},"gpu":"AMD Radeon RX 6650 XT (RADV NAVI23)","driver":"radv Mesa 26.2.4-arch1.1","os":"Linux 7.2.9-arch1-1","cpu":"AMD Ryzen 9 7950X 16-Core Processor","cpu_threads":32,"memory_mib":127901,"title_id":"PPSA25636","title":"Echoes of the End","content_version":"01.012.000","resolution":"3840x2160","window":{"spec":"frames 560:100","first_present":560,"ms":103536.928},"presents":100,"frame_ms":{"p50":1033.962,"p90":1190.235,"p99":1658.498,"max":1658.498},"gpu_busy_ms_per_present":429.131,"worker_busy_pct":{"queue worker 0x0":99.764,"queue worker 0x20":97.312},"top_phases_ms_per_frame":{"Driver.Packet":2002.157,"Driver.Packet.dispatch":1030.803,"Driver.Dispatch":972.049,"Driver.Packet.memory_wait":663.697,"Vulkan.Dispatch":612.851,"Vulkan.Dispatch.shader_resources":602.088,"Resources.Complete":591.123,"Recorder.Submit":154.274},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":36.981,"events_lost":517833,"totals_full":false}},"trace":"aps5-trace-a526b9bb47ca-3289446.json.gz"} |
|
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.
|
jotitadev
left a comment
There was a problem hiding this comment.
Apple GPU / MoltenVK run, as a second vendor next to the RX 6650 XT. On MoltenVK the new importJoinTests case fails without the change and passes with it.
Machine: Apple M2 Max, macOS 27.2, x86_64 under Rosetta 2. Release, BUILD_TESTING=ON.
Drivers: MoltenVK 1.4.2 (Vulkan SDK 1.4.363.0), and MoltenVK main + SPIRV-Cross #2704.
Base/method: PR #8658 feat/macos-port @ ee0a438415 (current main plus the macOS port), not main, which does not build on macOS. This head merged into it (git merge-tree, no conflicts), diff without docs/. Full rebuild before each run.
- Test only (the new case in
tests/BdaResources.cpp,GuestBufferMemory.cppat the base):agc_driver_graphicsfails on both drivers witha buffer bound from the first of three pieces into the last was not imported over the pieces it crosses. - With the PR:
agc_driver_graphicspasses 2 of 2 on both drivers. - Full
^agcsuite with the PR:-j1 --timeout 30, 856 tests. The failures are the same as the base on both drivers (17 with MoltenVK 1.4.2, 16 with main + #2704). No timeouts.
GPUs tested: Apple M2 Max (MoltenVK 1.4.2; MoltenVK main + SPIRV-Cross #2704)
Written with AI assistance (Claude Code). I ran the builds and tests above on my machine.
|
Preparing a Windows 007 cross-test of 09fb61a, preserving your commit on the same current-main integration as our baseline: Head 62cf2d1 = b36dea0 (main d6eafa5 + #9591 + #6918), current-main #7961 merge 7e2ba73, then this PR. Clean source merge and conventions pass; UNBUILT and UNTESTED so far. The game is still running an unchanged b36 cache-capacity comparison, so no compilation or native tests concurrently. The baseline logs show substantial repeated CPU buffer copies outside imports, concentrated in one sparse heap. That is a reason to test your change, not proof it is this particular joined-run case. Next I will run the focused Windows/NVIDIA controls with a real Khronos layer, including a production-only negative control for your added assertion, before a title comparison. No 007 benefit claimed yet; title code/captures stay local. AI-assisted: Codex. |
|
Windows native cross-test completed for 09fb61a on integration 62cf2d1 (base58dd0d5e5 = b36dea0 + main7e2ba73e4; #6918 stays on both arms):
The broader179-case gate is running now. This is a native functional cross-test, not a 007 FPS/copy-count result. The prior b36 game session hit its unchanged28GiB private-memory guard during a large pipeline compile, about192s after Resume; no verified cinematic/gameplay. AI-assisted: Codex. |
|
Reviewed; the one-line predicate relaxation is sound. Two things to settle before merge:
|
|
007 title cross-test update: the combined9652+9565 integration c915980 aborted during startup after about29s, before reaching the menu. It throws std::invalid_argument, Not attributing it to this PR yet. Isolating the two changes now: c4162b2 has the same production sources as c915 except joinedRun retains the old exact-end predicate. The only other diff is your three-line regression addition in BdaResources.cpp. Both heads are public; the isolated branch is codex/first-light-oct22-command-memory. Rebuilding/validating that control before the next title run. The previously posted native results remain valid; they did not catch this title failure. No unsupported opcode bypass and no title shader/code uploaded. I will report which isolated arm reproduces it. AI-assisted: Codex. |
MarcZX10
left a comment
There was a problem hiding this comment.
The single predicate change is internally coherent: crossedRun limits the joined range to the registered pieces containing the binding, the positive test covers that case, and existing negatives protect mid-range binds and later growth. Exact-head diff-check and conventions pass. The PR supplies strong paired Vulkan evidence on RX 6650 XT, Windows/NVIDIA and MoltenVK, including a production-only negative control; I could not run GPU tests in this environment, and hosted GPU jobs are skipped.
Please resolve these repository requirements before merge:
- Update the technical debt entry.
docs/dev/debt/libSceAgcDriver.mdstill says the binding must cover exactly from the run start through its end, and later says growth is re-imported only when the buffer is bound exactly over all pieces. Both statements are now false. Please update the documentation alongside the implementation. - Refresh the base and rerun the paired gate. This head is based on
17f5335562, while currentmainis 61 commits ahead. GitHub can merge the branches cleanly, butGuestBufferMemory.cppchanged on main. Rebase and rerun the required focused validation-layer tests on current main and the rebased change, then compare VUIDs. The current performance A/B is from an integration tree containing other open PRs (which you disclose), not the repository's current main. If the title cannot reach the measured scene on main, document that limitation and get maintainer agreement on the integration-base comparison. - Attach the performance traces. The summary lines are in the PR, but the two trace files are on a separate fork branch. CONTRIBUTING asks perf PRs to attach the traces; please attach them to this PR or a linked report so reviewers can retain and inspect the exact artifacts.
- Complete the title reference. The checklist says
Unblocks: PPSA25636 (performance)but gives no Game bring-up discussion. I could not find one for PPSA25636 in the repository's discussions. Add the discussion link if this title is blocked on the change, or clarify the checklist if this is only a performance measurement.
| if (run.ranges.empty()) return run; | ||
| if (std::all_of(run.ranges.begin(), run.ranges.end(), [window](const auto& range) { return range->bytes > window; })) return run; | ||
| if (begin == run.base && end == run.base + run.bytes) return run; | ||
| if (begin == run.base) return run; |
There was a problem hiding this comment.
Please update the technical-debt description in the same PR. It still describes exact start-to-end bindings and exact-all-piece growth as the only join cases; this relaxed start-at-run-base case changes both statements.
09fb61a to
aac27c3
Compare
|
@MarcZX10 @fogydes thanks for the reviews. Status per point:
@Scramblrrrr thanks for isolating the 007 abort. |
|
Paired focused tests on current Setup:
Logs (paths redacted): https://github.com/JJenkx/AnyPS5/tree/evidence/join-run-start/vvl |
|
Follow-up from a short local copied-region diagnostic on 3f516d8 (current main4777 integration plus aac27c3, native87pass+1expectedskip with identical baseline VUIDs; production-only negative/restoration also passes the intended control). The prior VOP2 exception did not repeat through ~98s of this startup; I stopped intentionally for diagnostics, so this is not a complete-boot result or proof that the old failure is resolved. The dominant heap's region-buffer upload sample is finite and non-sparse: 12.5MiB, starting606720bytes into a2MiB allocation, writable=1/hostBacked=0/sparse=0. 7450 of7953 sampled uploads in that heap had this shape (diagnostic region-buffer uploads, not independently proven CPU reads for every row). It does not start at run.base, so the prefix-only predicate still declines it; #9551's sparse-only path also does not apply. I am investigating a dependent extension for interior starts whose descriptor span is at least the configured import window (8MiB in the runtime), preserving the existing tiny-crossing refusal. That would join only the contiguous registered owners intersected by the view and retain the existing ownership/budget checks. Test first: fresh small adjacent owners, interior large view, exact descriptor offset, reuse, removal invalidation and tiny-crossing control; then actual Vulkan controls and a title comparison. Let me know if you are already covering that case or know a reason it must stay copied. No speed claim; raw requests/captures stay local. AI-assisted: Codex. |
|
@Scramblrrrr thanks for isolating it, and good to hear the VOP2 exception did not repeat with this head. I'm not covering interior starts. Please take that extension; I'm happy to test it on Echoes afterwards. The one thing I'd watch is the reason ca95f74 kept interior starts apart: two joined imports that share a range retire each other. |
|
Thanks, taking that extension. Source integration is public now at 8942cb7, on current main4777 + our bring-up stack + your aac27c3: The production change adds end-begin >= window alongside begin==run.base; tiny crossings remain refused. Your overlapping-owner concern is now covered: large views over owner sets0..2 and2..4 alternate repeatedly, keeping the same grown0..4 import, and two views bind that established import in one build. Native Vulkan repeats actual byte readbacks for alternating views and checks the stable buffer handle after growth. The separately acquired-registry three-owner case also checks offset/reuse/removal; unused acquired ranges are not counted as the requested view's copies. Windows focused base/change gate:87pass+1expectedLinuxskip (36.74/35.97s), actual Khronos1.4.363 layer, identical two existing02275 errors and no new VUID. The two final new fixtures fail their intended assertions with only baseline production restored, then pass after exact candidate restoration, with fixture executable hashes unchanged and zero VUID in those controls. Source conventions:0errors, existing long host-import debt row warns. Full matched runtime packaging and guarded007 test next. No speed/title correctness claim yet. The branch is an integration WIP, not a clean upstream PR base; a standalone submission would explicitly depend on yours. AI-assisted: Codex. |
MarcZX10
left a comment
There was a problem hiding this comment.
Thanks for adding the paired current-main-at-the-time validation run (15/15 on the base and change, with the negative control failing only the intended regression), plus the Windows/NVIDIA and MoltenVK cross-checks. The debt description now matches the relaxed start-at-run-base rule, and Unblocks: none is clear.
One repository requirement has become stale again: the PR base is 7e2ba73e, while upstream main is now 8b3a6ba8 (13 commits ahead). I checked the intervening history; it does not touch GuestBufferMemory.cpp, BdaResources.cpp or the AGC debt entry. Please still rebase on current main and rerun the paired focused validation-layer gate there, so the checked merge result is current.
The performance summaries are in this PR, but the two trace archives and digests remain on the separate JJenkx/AnyPS5:evidence/join-run-start branch. CONTRIBUTING.md asks perf PRs to attach the traces and digest; please attach them here or provide a stable linked report artifact. I could not run the AGC/Vulkan suite locally, and the hosted product jobs are skipped, so the GPU evidence above is author/independent-tester reported.
aac27c3 to
da7eeb2
Compare
|
@MarcZX10 thanks.
|
|
A second title with the same pattern: RoboCop: Rogue City - Unfinished Business (PPSA28329), Windows 10.0.26200, RTX 5070 Ti (NVIDIA 617.42). Setup: Why I looked: stack samples of the queue 0 thread during gameplay showed about 15 % of it in CPU copies outside imports (
Frame time (median of the per-10 s frame p50 over the gameplay intervals, base and PR alternated):
That is 18–21 % less frame time in all three pairs. GPU busy per present is about the same in both (103–107 ms). A separate long run with this PR held 172.6 ms over 21 gameplay intervals. Image: at the same point of the input script, the 3D title screen looks the same with and without this PR. The menu artifacts this title shows also appear on the base, so they don't come from this PR. In 1 of 5 runs with this PR, the title stayed on the intro logos and did not take the input script. It was presenting normally at 60 presents per 10 s, with no fault. I have seen the same stall on builds without this PR, so I don't attribute it here. Logs are available if useful. |
|
@LeoFeitosa thank you, that's a valuable second title on a different vendor and OS. It also matters that it is a case where the change helps at default settings: on Echoes the buffer is only hot under a larger storage cache, while RoboCop shows 18–21 % less frame time across three alternated pairs and CPU copies outside imports falling from 109,192 to 8. I'll reference your results in the description. |
|
Paired focused validation-layer gate on the rebased head, on current Setup: same machine,
The loader adds |
|
@LeoFeitosa could you share the logs you offered for the RoboCop comparison, preferably the Your clean-main-based test is particularly useful because our Echoes performance capture uses a disclosed integration tree. Retaining the exact RoboCop artifacts would let reviewers inspect the separate main-versus-change measurement against CONTRIBUTING's performance-report requirements. We will keep your results attributed as independent tester measurements; we have not reproduced the RoboCop run locally. No need to repeat the runs if those existing files are available. |
|
@JJenkx here are the files of pair 2, an unprofiled pair (base 203.5 ms, this PR 163.1 ms): https://gist.github.com/LeoFeitosa/bb17132e2f9442986c4d0fd4a87926c7
Gameplay intervals used: lines 3–8 of each summary. Those are the intervals with ≥ 5 presents and more than 20 ms GPU busy per present. The figure is the median of their frame p50:
Line 3 is the first gameplay interval after the load in both runs. What I don't have: no trace archives or digests. These runs had |
…ent ranges joinedRun joined a run of adjacent registered ranges that has one no larger than the import window only for a binding exactly over the run. Echoes of the End (PPSA25636) binds a 24 MiB buffer from the start of three such ranges that ends inside the last one, so every use of it was copied on the CPU: 16,680 copies in one 480 s run. A binding that starts at the first crossed range now joins the ranges it crosses. One that starts inside the first range still stays apart, and a range registered after the run is outside the ranges a binding into the run crosses, so growth beside a joined import does not re-import it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the last Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ntry Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
da7eeb2 to
65dec56
Compare
|
Rebased on I ran the focused gate again on the new base, in one build directory with the same command on every arm:
No test was skipped. Logs, with local paths redacted: Title evidence is unchanged by the rebase. Echoes of the End remains integration-only, with the limits stated in the description. The independent RoboCop: Unfinished Business report above is from another tester's machine. |
What
joinedRunjoins the imports of a run of adjacent registered ranges under one of two conditions: every range in the run is larger than the 8 MiB import window, or the binding covers the run exactly (ca95f74). In Echoes of the End (PPSA25636), a 24 MiB buffer meets neither. It is bound from the start of two or three adjacent ranges, at least one of them no larger than the window, and ends inside the last one. For example,0x32a5700000+0x1800000over the run0x32a5700000+0x1970000.No import covers that buffer, so
copyRegioncopies it on the CPU at every use and diffs it at write-back: 16,680 copies in one 480 s run (APS5_TRACE_BIGBUF).With this change, a binding that starts at the first crossed range also joins the ranges it crosses. The test
begin == run.basecovers the exact case too, becausecrossedRunstops at the range that holds the binding's last byte. ca95f74's other two properties are kept:The last crossed range is imported whole, as the all-large branch already does for runs of large ranges.
Tested
importJoinTestsgains a case: a buffer bound from the first of three pieces into the last is imported once, over the three pieces. Linux, RX 6650 XT, RADV, one build directory:agc_driver_graphicsfails with "a buffer bound from the first of three pieces into the last was not imported over the pieces it crosses";17f5335562) and on the change, underANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation VK_LOADER_DEBUG=layerwithctest -V:agc_driver_graphics,agc_sparse_*,agc_heap_mirror_*,agc_host_import_unmap,agc_host_import_retirementandagc_host_import_sparsepass on both (14 tests;agc_host_import_retirewas not built in this job). The loader adds the layer for the tests that create a real instance. The VUIDs are identical on both: one pre-existingVUID-vkCmdCopyBuffer-srcBuffer-00118inagc_sparse_run_import_copied.Echoes of the End (PPSA25636), Linux 7.2.9, RX 6650 XT, RADV (Mesa 26.2.4). The title needs open PRs to reach its scene (fix(shader): preserve read lane dominance across branches #8089, feat(libSceAgcDriver): import scattered direct memory as a dma-buf run list and probe its coherence #4449, fix(agc): lower import budgets only on memory exhaustion #8091, fix(agc): keep the write-back ready barrier while hole copies are pending #8908). Both arms are the same integration tree, which also carries perf(agc): mirror a sparse heap whose committed span crosses adjacent ranges #9551, with and without this change.
APS5_PROFILE_DRAW=1 APS5_TRACE_BIGBUF=1:crossed run 0x32a8d10000+0x1970000 of 2 ranges, joined 2 ranges), and 4 MiB is read by CPU copies in the whole run;APS5_TRACE_FRAMES=560:100, same seed of shader caches and save state, one build directory, 480 s per arm, 0 amdgpu kernel events in either.4ff898faef):frames 560:100 from present 560: 100 presents, frame p50 958.0 / p90 1456.9 / p99 3292.4 / max 3292.4 ms, GPU busy 434.1 ms per presenta526b9bb47):frames 560:100 from present 560: 100 presents, frame p50 1034.0 / p90 1190.2 / p99 1658.5 / max 1658.5 ms, GPU busy 429.1 ms per presenttools/performance_compare.py: mean frame -1.4 %, p50 +7.9 %, p90 -18.3 %, p99 -49.6 %, GPU busy -1.1 %.Independent results from other reviewers:
main559f35d685with this PR's three commits cherry-picked, against the same tree without them. Same install, same input script, warm shader cache.copyRegion→GuestMemory::Read, mostly copies of about 1.8 MiB of0x30a0000000.559f35d685a9, 163.14 ms on2efa0e483cc1(19.85% lower). This is one unprofiled tester pair, not a local reproduction. The baseline reportsdirty: true; the tester attributes that to the test-only test(agc): align the array window test's texels at run time #8310 file, which we have not independently verified. No trace archives or digests were captured for this pair, so it does not replace the missing required performance-trace evidence.importJoinTestscase fails without the change and passes with it.Follow-up validation and retained evidence (2026-10-22)
The rebased focused gate tested clean main
1a745ae38eagainst submitted head65dec56705f797f44fdc0e01446a3a7e75c3e6b5: 15/15 tests passed in each arm, with no skips and no VUIDs. Independently reading the retained logs confirms fourVK_LAYER_KHRONOS_validationinstance-layer insertions per arm. The test-only negative control failed onlyagc_driver_graphics, with the expected three-piece import assertion (14/15 passed). This identifies the tested main revision; main has continued advancing since that snapshot.The same command was used for all three arms on Linux 7.2.9, RX 6650 XT, RADV Mesa 26.2.4:
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation VK_LOADER_DEBUG=layer ctest -V -j1 -R '^(agc_driver_graphics|agc_sparse_.*|agc_heap_mirror_.*|agc_host_import.*)$'This supersedes the earlier focused gate on main
3ca07d086d5f44fbe3c00370e7f03953ab46ca1b/ headda7eeb2201062c864cf0762d071d229ee43ae993; those logs remain in the release as historical evidence.The retained release assets include both Echoes trace archives, both summary files, both
trace_digest.pyreports andperformance_compare.pyoutput. Both Echoes summaries reporttrace_dropped: true; detailed phase attribution is incomplete. These remain integration-relative observations with the prerequisites listed above, and do not establish a clean-current-main title speedup. The rebase adds focused correctness evidence; qualifying clean-main title-performance evidence remains outstanding.Summary lines
The
aps5-summary.jsonllines of the present-matched pair (APS5_TRACE_FRAMES=560:100). The traces and thetools/trace_digest.pyoutput are on https://github.com/JJenkx/AnyPS5/releases/tag/pr9652-evidence.Baseline (without this change):
{"commit":"4ff898faefa3","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_DIR":"<path>","APS5_TRACE_FRAMES":"560:100"},"gpu":"AMD Radeon RX 6650 XT (RADV NAVI23)","driver":"radv Mesa 26.2.4-arch1.1","os":"Linux 7.2.9-arch1-1","cpu":"AMD Ryzen 9 7950X 16-Core Processor","cpu_threads":32,"memory_mib":127901,"title_id":"PPSA25636","title":"Echoes of the End","content_version":"01.012.000","resolution":"3840x2160","window":{"spec":"frames 560:100","first_present":560,"ms":105019.366},"presents":100,"frame_ms":{"p50":958.000,"p90":1456.922,"p99":3292.388,"max":3292.388},"gpu_busy_ms_per_present":434.116,"worker_busy_pct":{"queue worker 0x0":99.794,"queue worker 0x20":97.524},"top_phases_ms_per_frame":{"Driver.Packet":2048.790,"Driver.Packet.dispatch":1056.775,"Driver.Dispatch":992.721,"Driver.Packet.memory_wait":677.391,"Vulkan.Dispatch":628.122,"Vulkan.Dispatch.shader_resources":616.824,"Resources.Complete":615.461,"GpuMutex.wait.indirect":147.167},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":41.830,"events_lost":484625,"totals_full":false}},"trace":"aps5-trace-4ff898faefa3-3124014.json.gz"}With this change:
{"commit":"a526b9bb47ca","dirty":false,"env":{"APS5_PAD_INPUT_FILE":"<path>","APS5_TRACE_DIR":"<path>","APS5_TRACE_FRAMES":"560:100"},"gpu":"AMD Radeon RX 6650 XT (RADV NAVI23)","driver":"radv Mesa 26.2.4-arch1.1","os":"Linux 7.2.9-arch1-1","cpu":"AMD Ryzen 9 7950X 16-Core Processor","cpu_threads":32,"memory_mib":127901,"title_id":"PPSA25636","title":"Echoes of the End","content_version":"01.012.000","resolution":"3840x2160","window":{"spec":"frames 560:100","first_present":560,"ms":103536.928},"presents":100,"frame_ms":{"p50":1033.962,"p90":1190.235,"p99":1658.498,"max":1658.498},"gpu_busy_ms_per_present":429.131,"worker_busy_pct":{"queue worker 0x0":99.764,"queue worker 0x20":97.312},"top_phases_ms_per_frame":{"Driver.Packet":2002.157,"Driver.Packet.dispatch":1030.803,"Driver.Dispatch":972.049,"Driver.Packet.memory_wait":663.697,"Vulkan.Dispatch":612.851,"Vulkan.Dispatch.shader_resources":602.088,"Resources.Complete":591.123,"Recorder.Submit":154.274},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":36.981,"events_lost":517833,"totals_full":false}},"trace":"aps5-trace-a526b9bb47ca-3289446.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 (no unimplemented path added).mdfiles or images added to the repository (attach them to this PR)🤖 Generated with Claude Code