Repository navigation
Conversation
ade8325 to
ca7b45b
Compare
|
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.
|
|
Rebase handoff — rebased onto current Verified on Linux (CachyOS, kernel 7.2.9, GCC 16.2.1, Ninja, Release, To pick it up: Head is |
|
Correction: the first push missed a required |
ca7b45b to
aa92e2c
Compare
|
Thanks for the rebase handoff, Linux validation, and the follow-up ENVIRONMENT.md row. Picked up your corrected handoff and rebased it onto main e1dae23; published head is aa92e2c. Both sides of the debt-doc conflict are retained, and I clarified that APS5_NO_SLEEP_WAKE disables early wakeups. The six focused Windows Release checks pass, including unimported-label ordering, CPU wake, same-queue waits, and the sleep checks. A matched SuperTuxKart A-B-B-A repeat with only libSceAgcDriver.prx differing gives 11.945 FPS for the exact #6658 control and 11.900 FPS for this topic (-0.045 FPS); the description now reports the individual captures and their limits instead of using the combined series to justify this topic. Logs, manifests and raw traces: https://github.com/Dripl1x/AnyPS5/releases/download/performance-series-20261018/review-rebase-20261018.zip |
|
@Dripl1x thanks. The ordering is right. Three things before this can merge:
|
|
Windows NVIDIA run on the rebase, with the Host: Windows 11 Pro 26220, NVIDIA GeForce RTX 4070 driver 596.21, Ryzen 7 5700X, WinLibs MinGW-w64 GCC 15.2 r7, Release. Head 1. 2. The new eight-byte case in
A gap between the two blocks, or a Tests and control.
main (8223 presents at the next Labels on the Sync path and imports avoided. Your point 2 stands: the Sync path returns 1, so in
vkQuake gave 0 / 0 in a 120 s run as well. So in Ping Pong this PR avoids 2 imports and syncs the recorder about once per frame instead, as you described. Ping Pong is vsync-bound and stays at 59.94 FPS with p50 16.683 ms on both sides. vkQuake takes the path 0 times, so its FPS difference against main in the same session (+6.8/+5.4% in a loaded round, +2.8/+2.5% in a quiet one: 105.44/105.68 vs 108.36/108.36 FPS) cannot come from the label change. #6658's short-sleep wake is the other change in this PR, but I did not build #6658 alone to confirm that. GPU pass on main + #7473 + this PR: 599 passed, 2 skipped as on main, 2 failed ( Not checked: #6658 on its own, the PR head on its own base, Linux, the full non-GPU suite. Written with Claude Code assistance (validation by a subagent, reviewed in this session). |
aa92e2c to
b31bc84
Compare
|
Rebased onto main @screamm, thank you, both blockers are confirmed and fixed. (1) The unimported path called @oneandonlydean, on your three points:
Tests (Windows 11, RTX 3070 Laptop, Release): AI-assisted: yes (Claude Code) |
|
SuperTuxKart race data on the unimported-label path, in case it helps with this PR and #8858. It doesn't call for a change; the two alternatives I tried were worse. Setup.
Where the remaining time goes.
Two alternatives, both worse. Measured locally, two runs each, same scene:
The drain looks like the right choice among these. Unless a completion could be reaped as soon as the progress watcher sees the batch finish (it already wakes the sleepers), the label has to land when the title wakes. I haven't tried that. |
…PU use The import-requester test now counts the map requester on a 128 KiB range and asserts that a 64 KiB range is not imported at map time and is imported, for the access requester, at its first use. The over-budget map test maps 128 KiB so it still reaches the budget check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…time importMappedFailureGenerationTests (boykopovar#8802) maps a single 64 KiB range and expects ImportMappedRanges to try its import. Ranges of 64 KiB are now left to their first GPU use, so the probe saw no allocation. The fixture maps 128 KiB as one window, which is still imported at map time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…orts An import covers a run of adjacent registered allocations. When VirtualAlloc placed the temporary block right after the 128 KiB-aligned labels block, the labels import also covered the temporary block, the eight-byte label correctly went to the GPU and the case failed (4 of 12 runs in review). The temporary block is now registered between two unregistered 64 KiB guards of its own allocation, so no import made for another block can cover it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The unimported label path synced the recorder: it submitted the open batch and waited for every batch in flight under the GPU mutex, running their completion actions. A compute worker must never run them (labels from other queues only submit), and the sync waited forever on a batch whose submit was held on a semaphore that only a later submission releases: agc_driver_indirect_arguments_pending_producer timed out in its argument-label case, which needs the label imported and recorded on the GPU. The path is now taken only for queue 0 while no submit is held (a hold armed for the next submit, or a held batch the GPU has not finished). Other labels import their memory and are recorded on the GPU, as on main. UnimportedLabelOrder covers a compute-queue label and a label behind a held batch, each of which must be recorded without a submit or a wait. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eir own The unimported path returned 1, the code of a label the CPU stores because nothing is recorded, so the [sync] line counted its labels as idle fallbacks and its stores as idle CPU stores. It now returns 7, which every caller handles as it handles 1 (the CPU writes the bytes without a device wait, and the label is noted and wakes short sleeps where 1 does), and the [sync] line counts it separately as "no covering import (recorder synced)" among the fallbacks and "on the CPU with no covering import (recorder synced)" among the stores. PipelinedDma counts these stores with the other committed ones. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rces Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
b31bc84 to
223f246
Compare
|
Updated on 2026-10-22; the description is rewritten to match.
|
|
Lodoss, which the description lists as not run: neutral on AMD/Linux, with no measurable cost from the new path. Setup
AI-assisted: yes (Claude Code); results above were run on this machine. |
What
Store a queue-0 label on the CPU after a recorder sync when no host import covers its destination, instead of importing the destination's allocation for the label.
VulkanDevice::WriteLabelOnGputakes that path only for queue 0 and only while no submit is held (Recorder::SubmitHeld()); it returns a new code 7, which every caller (commitLabelinPacketMemory.cpp,recordDeferredLabelsinDeferredLabels.cpp) handles like code 1: a CPU store without a device drain. Labels on compute queues, labels behind a held submit and labels whose memory an import already covers keepmain's path (import on demand, store recorded on the GPU). The[sync]profile line counts the new path on its own:no covering import (recorder synced)among the fallbacks andon the CPU with no covering import (recorder synced)among the stores (SynchronizationStatistics).A label the driver stores from the CPU (
commitLabel,recordDeferredLabels) also ends short guest sleeps (#6658), as a completed GPU batch or a flip already does.Why it depends on #7465. On
maina small block is imported when the title maps it, so its labels find a covering import and this path does not run. #7465 leaves mappings of 64 KiB or less unimported until their first GPU use. In SuperTuxKart (PPSA69421) that first use is a label, so with #7465 alone each of the blocks the menu maps every frame is imported by its first label instead, and the frame rate stays atmain's. With this PR on top, those labels are stored on the CPU after a recorder sync and the blocks are not imported at all:main94fbb8cea8main+ #7465a1cee90f52main+ #7465 + this PR223f2469f5The cost of the path is visible in the same traces:
Recorder.Synctakes 12.0 ms per frame on the draw committer, which #7465 alone does not show, and the frame still drops from 94.7 to 37.7 ms (p50).Tested
This head is
223f2469f5: currentmain94fbb8cea8, #7465's heada1cee90f52, and this PR's five commits on top, picked without conflicts and unchanged from the previous headb31bc845fb. Windows 11 Pro 26300, Ryzen 7 5800H, WinLibs GCC 15.2.0 r7, Release.ANYPS5_NO_SHADER_CACHE=1, three runs each: the 74 tests built fromtests/Recorder.cpp, andagc_driver_indirect_arguments_pending_producer,agc_driver_unimported_label_order,agc_driver_cpu_label_wake,agc_driver_same_queue_label_wait,agc_driver_alias_copy_label,agc_driver_pipelined_dma,agc_driver_graphics,agc_driver_host_import_windows,agc_driver_host_import_at_map,agc_driver_host_import_teardown,guest_sleep_wake,guest_sleep_wake_coarse,guest_nanosleep,precise_wait. 88/88 on this head; 87/87 onmainand on perf(agc): defer small host imports until first GPU use #7465 (agc_driver_cpu_label_wakeis added here).main94fbb8cea8and on this head (VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation,ANYPS5_NO_SHADER_CACHE=1,ANYPS5_REQUIRE_VULKAN=1,ctest -V, RTX 3070 Laptop GPU, NVIDIA 617.42;DISABLE_LAYER=1turns off a third-party implicit layer installed here, FPS Monitor, whosevkDestroyInstancehook crashes later instance lookups): 87/87 and 88/88 pass, neither log reportswas not found but was requested by env var VK_INSTANCE_LAYERS, and both report the same VUIDs the same number of times (VUID-VkImageViewCreateInfo-usage-022754,VUID-vkCmdCopyBuffer-srcBuffer-001182). The change adds none.ANYPS5_GPU=AMD), the same set once and once under the validation layer: 85/88 on this head, 84/87 onmainand on perf(agc): defer small host imports until first GPU use #7465. The same three tests fail on all three trees (agc_sample_dumps,agc_driver_vertex_target_range_copied,agc_driver_vertex_target_range_imported), so they aremain's; the validation logs report the same VUIDs as on NVIDIA and none new.llvmpipe (LLVM 21.1.8)):libSceAgcDriverbuilds;agc_driver_unimported_label_order,agc_driver_cpu_label_wake,agc_driver_same_queue_label_wait,agc_driver_indirect_arguments_pending_producer,guest_sleep_wakeandagc_driver_host_import_windowspass.b31bc845fbwith the same source: without the queue-0 gate the compute-queue case fails with reason 7; withSubmitHeld()ignoring a held batch still in flight the held-batch case fails after its 5 s watchdog; without the two wake callsagc_driver_cpu_label_wakefails.tools/check_conventions.pypasses for this range.SuperTuxKart captures. RTX 3070 Laptop GPU, NVIDIA 617.42, same machine and build as above; SuperTuxKart (PPSA69421) tutorial prompt over the main menu, 1920x1080 internal rendering in a maximized 2560x1369 window, warm shader caches, audio muted, no input;
APS5_TRACE_SECONDS=20:8withAPS5_TRACE_EVENTS=1048576, console output not redirected, no otherAPS5_*switch; 2026-10-22, one session, ordermain, #7465, this PR, this PR, #7465,main; every run kept the window in the foreground, and every summary line reportsdirty: falseandtrace_dropped: false.Summary lines (main, #7465, this PR, this PR, #7465, main)
{"commit":"94fbb8cea80a","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":38,"ms":8076.426},"presents":80,"frame_ms":{"p50":99.757,"p90":110.517,"p99":128.310,"max":128.310},"gpu_busy_ms_per_present":5.610,"worker_busy_pct":{"queue worker 0x0":2.846},"top_phases_ms_per_frame":{"Graphics.Draw":7.873,"Graphics.Draw.draw_and_resource_release":7.574,"Vulkan.DrawFromRecipe":6.254,"Graphics.DrawWithRecipe":6.229,"Graphics.DrawWithRecipe.draw_and_resource_release":6.216,"Recorder.Submit":2.908,"Driver.Packet":2.834,"Driver.Packet.draw":2.260},"trace_dropped":false,"trace":"aps5-trace-94fbb8cea80a-424.json.gz"} {"commit":"a1cee90f52cc","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":55,"ms":8065.429},"presents":83,"frame_ms":{"p50":94.730,"p90":106.217,"p99":129.954,"max":129.954},"gpu_busy_ms_per_present":5.650,"worker_busy_pct":{"queue worker 0x0":2.889},"top_phases_ms_per_frame":{"Graphics.Draw":8.166,"Graphics.Draw.draw_and_resource_release":7.877,"Vulkan.DrawFromRecipe":6.616,"Graphics.DrawWithRecipe":6.589,"Graphics.DrawWithRecipe.draw_and_resource_release":6.576,"Recorder.Submit":2.785,"Driver.Packet":2.769,"Driver.Packet.draw":2.207},"trace_dropped":false,"trace":"aps5-trace-a1cee90f52cc-21452.json.gz"} {"commit":"223f2469f5b7","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":131,"ms":8002.835},"presents":207,"frame_ms":{"p50":37.675,"p90":42.179,"p99":54.788,"max":57.409},"gpu_busy_ms_per_present":4.721,"worker_busy_pct":{"queue worker 0x0":5.801},"top_phases_ms_per_frame":{"Recorder.Sync":11.955,"Graphics.Draw":6.348,"Graphics.Draw.draw_and_resource_release":6.104,"Vulkan.DrawFromRecipe":5.275,"Graphics.DrawWithRecipe":5.255,"Graphics.DrawWithRecipe.draw_and_resource_release":5.243,"Recorder.Submit":2.463,"Driver.Packet":2.212},"trace_dropped":false,"trace":"aps5-trace-223f2469f5b7-7524.json.gz"} {"commit":"223f2469f5b7","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":136,"ms":8002.542},"presents":208,"frame_ms":{"p50":37.925,"p90":41.354,"p99":46.729,"max":49.249},"gpu_busy_ms_per_present":4.706,"worker_busy_pct":{"queue worker 0x0":5.815},"top_phases_ms_per_frame":{"Recorder.Sync":11.984,"Graphics.Draw":6.381,"Graphics.Draw.draw_and_resource_release":6.138,"Vulkan.DrawFromRecipe":5.259,"Graphics.DrawWithRecipe":5.238,"Graphics.DrawWithRecipe.draw_and_resource_release":5.227,"Recorder.Submit":2.455,"Driver.Packet":2.205},"trace_dropped":false,"trace":"aps5-trace-223f2469f5b7-36088.json.gz"} {"commit":"a1cee90f52cc","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":60,"ms":8047.206},"presents":82,"frame_ms":{"p50":95.592,"p90":109.603,"p99":121.282,"max":121.282},"gpu_busy_ms_per_present":5.638,"worker_busy_pct":{"queue worker 0x0":2.804},"top_phases_ms_per_frame":{"Graphics.Draw":8.185,"Graphics.Draw.draw_and_resource_release":7.900,"Vulkan.DrawFromRecipe":6.988,"Graphics.DrawWithRecipe":6.962,"Graphics.DrawWithRecipe.draw_and_resource_release":6.949,"Recorder.Submit":2.777,"Driver.Packet":2.710,"Driver.Packet.draw":2.157},"trace_dropped":false,"trace":"aps5-trace-a1cee90f52cc-30808.json.gz"} {"commit":"94fbb8cea80a","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":60,"ms":8004.322},"presents":82,"frame_ms":{"p50":94.350,"p90":108.262,"p99":142.124,"max":142.124},"gpu_busy_ms_per_present":5.714,"worker_busy_pct":{"queue worker 0x0":2.913},"top_phases_ms_per_frame":{"Graphics.Draw":7.571,"Graphics.Draw.draw_and_resource_release":7.276,"Vulkan.DrawFromRecipe":6.235,"Graphics.DrawWithRecipe":6.207,"Graphics.DrawWithRecipe.draw_and_resource_release":6.194,"Recorder.Submit":2.886,"Driver.Packet":2.803,"Driver.Packet.draw":2.235},"trace_dropped":false,"trace":"aps5-trace-94fbb8cea80a-36604.json.gz"}tools/performance_compare.py(first capture of #7465 against the first capture of this PR)**Performance comparison
**
**Configuration differences
**
**Frame and GPU times (ms)
**
**Top phases (ms per frame)
**
tools/trace_digest.py(first capture of #7465, then of this PR; every digest is in the evidence archive)v23-s02-7465seconds 20:8 from present 55: 83 presents, frame p50 94.7 / p90 106.2 / p99 130.0 / max 130.0 ms, GPU busy 5.7 ms per present
NVIDIA GeForce RTX 3070 Laptop GPU, NVIDIA 617.42, Windows 10.0.26300, 1920x1080, commit a1cee90, dropped: no
{"commit":"a1cee90f52cc","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":55,"ms":8065.429},"presents":83,"frame_ms":{"p50":94.73,"p90":106.217,"p99":129.954,"max":129.954},"gpu_busy_ms_per_present":5.65,"worker_busy_pct":{"queue worker 0x0":2.889},"top_phases_ms_per_frame":{"Graphics.Draw":8.166,"Graphics.Draw.draw_and_resource_release":7.877,"Vulkan.DrawFromRecipe":6.616,"Graphics.DrawWithRecipe":6.589,"Graphics.DrawWithRecipe.draw_and_resource_release":6.576,"Recorder.Submit":2.785,"Driver.Packet":2.769,"Driver.Packet.draw":2.207},"trace_dropped":false,"trace":"aps5-trace-a1cee90f52cc-21452.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.WorkerWait 94.0, Driver.WorkerWait.idle_and_completion_poll 94.0, Graphics.Draw 8.2, Graphics.Draw.draw_and_resource_release 7.9, Vulkan.DrawFromRecipe 6.6, Graphics.DrawWithRecipe 6.6
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
v23-s03-pairseconds 20:8 from present 131: 207 presents, frame p50 37.7 / p90 42.2 / p99 54.8 / max 57.4 ms, GPU busy 4.7 ms per present
NVIDIA GeForce RTX 3070 Laptop GPU, NVIDIA 617.42, Windows 10.0.26300, 1920x1080, commit 223f246, dropped: no
{"commit":"223f2469f5b7","dirty":false,"env":{"APS5_TRACE_EVENTS":"1048576","APS5_TRACE_SECONDS":"20:8"},"gpu":"NVIDIA GeForce RTX 3070 Laptop GPU","driver":"NVIDIA 617.42","os":"Windows 10.0.26300","cpu":"AMD Ryzen 7 5800H with Radeon Graphics","cpu_threads":16,"memory_mib":64863,"title_id":"PPSA69421","title":"SuperTuxKart","content_version":"00.001.000","resolution":"1920x1080","window":{"spec":"seconds 20:8","first_present":131,"ms":8002.835},"presents":207,"frame_ms":{"p50":37.675,"p90":42.179,"p99":54.788,"max":57.409},"gpu_busy_ms_per_present":4.721,"worker_busy_pct":{"queue worker 0x0":5.801},"top_phases_ms_per_frame":{"Recorder.Sync":11.955,"Graphics.Draw":6.348,"Graphics.Draw.draw_and_resource_release":6.104,"Vulkan.DrawFromRecipe":5.275,"Graphics.DrawWithRecipe":5.255,"Graphics.DrawWithRecipe.draw_and_resource_release":5.243,"Recorder.Submit":2.463,"Driver.Packet":2.212},"trace_dropped":false,"trace":"aps5-trace-223f2469f5b7-7524.json.gz"}Slowest frames (largest slices inside each, inclusive)
Threads (ms per frame)
Largest slices (ms per frame, inclusive, all threads): Driver.WorkerWait 36.1, Driver.WorkerWait.idle_and_completion_poll 36.1, Recorder.Sync 12.0, Graphics.Draw 6.3, Graphics.Draw.draw_and_resource_release 6.1, Vulkan.DrawFromRecipe 5.3
Longest waits
Largest GPU batches (GPU ranges inside, and the CPU slices that recorded each, inclusive)
Evidence: 7464-evidence-20261022.zip (the six traces, summary lines, digests and comparisons, test and validation-layer logs).
Where it helps, and what it costs
Probe counters from 2026-10-21, on
main2185dbf92ewith a local counter build that is not part of this PR (APS5_PROFILE_DRAW=1, medians of two runs per flip over the same 8-s window; they carry profiling overhead and are not used for FPS), in the scene above: the menu maps about 48 blocks of 64 KiB per frame and writes about 59 labels into them.mainimports each block when it is mapped (48.5 imports per frame,ImportMappedRanges784 µs per call). In a build ofmainwith the eleven PRs of that series, which include #7465 and this one, no block is imported (0 per frame) and the labels take this path instead: 58.9 recorder syncs per frame,WriteLabelOnGpu194 µs per call. With this PR reduced to its wake calls in the same build, 47.8 imports per frame come back, every one made by a label (WriteLabelOnGpu696 µs per call).@LeandroLP23 measured the same path in a SuperTuxKart race on a Radeon 860M (comment above): it is the largest cost left there (
Recorder.Sync41 ms of a ~96 ms frame), and the two alternatives he tried, importing the label pages and deferring the store to the batch reap, were slower (5.4 and 0.7 FPS against 10.5).Known limitations.
main's path.Dependencies and overlap
COPY_DATAstores) changes the same} else if (reason == 1) {line ofpreparePacketMemoryinPacketMemory.cppthat this PR extends with code 7, and fix(shader): validate and optimize SPIR-V on a host thread when the stack is short #9495 inserts lines after the sameagc_driver_gpu_map_on_fiber_testsline oflibSceAgcDriver/CMakeLists.txtas this PR's test registration. Both conflict with this head textually; neither implements the same thing.WriteLabelOnGpu(small labels behind copied write-backs) and merges cleanly with this head.Checklist
main94fbb8cea8through perf(agc): defer small host imports until first GPU use #7465a1cee90f52; 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)🤖 Generated with Claude Code