Skip to content

perf(agc): widen small epoch collects to their 64 KiB block on Windows - #6273

Open
SoRadGaming wants to merge 1 commit into
boykopovar:mainfrom
SoRadGaming:perf/windows-widen-collects
Open

SoRadGaming wants to merge 1 commit into
boykopovar:mainfrom
SoRadGaming:perf/windows-widen-collects

Conversation

@SoRadGaming

@SoRadGaming SoRadGaming commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

What

Within a collect epoch, #1310 widens a collect of at most one 64 KiB block to the whole block, so the epoch's collect memo serves the block's other ranges. It left Windows on the requested range because it was not tested there. Windows now widens too.

  • Why it matters more on Windows now. Since fix(libc): track writes to singly mapped direct memory without faults on Windows #5596, singly mapped direct memory is private MEM_WRITE_WATCH memory, and a walk over it is a GetWriteWatch call for each resident run it touches. With perf(agc): keep Windows host imports of write-watched private memory watched #6060, its host imports stay watched as well.
  • Measured. In ASTRO BOT's hub on main + perf(agc): keep Windows host imports of write-watched private memory watched #6060, queue worker 0 spends 12.4 % of its samples in GuestArenaCollectWrites → WindowsMappings::collectResident, mostly from ShaderResources::fastRevalidate on every draw. A local counter showed about 50k walks of at most 64 KiB per 10 s.
  • Uncommitted or inaccessible pages. Windows coverage (WriteWatchCoverage) does not know which pages of a block are committed or inaccessible. WindowsMappings::Collect refuses such a range before it collects anything (collectable). So a widened walk that fails is retried over the requested pages.
    • Without the retry, a collect beside uncommitted pages of its block fails, and callers take that as a failed collect. The new test checks this.
    • The retry is listed in the debt file.
  • Test expectation. agc_driver_image_table_reuse expected one more table resolution on Windows than on Linux (CpuWriteResolutions). The extra one came from the narrower Windows collects, so it now expects Linux's count on both.

Linux is unchanged: the widening block is the same, and the retry is Windows-only.

Tested

Windows 11 Pro 26200, Ryzen 7 5800X3D, Radeon RX 9070 XT (driver 32.0.23033.1002), WinLibs GCC 15.2.0 r7, Release.

  • New CheckWidenedCollectBesideUncommittedPages (agc_write_tracking, Windows):
    • The last 16 KiB of a 64 KiB block stays an uncommitted placeholder, which the test checks.
    • A 64-byte collect in the block must succeed and see a CPU write in the next epoch.
    • With the widening but without the retry, it fails with a collect beside uncommitted pages of its block failed.
  • agc_driver_image_table_reuse passes. With the widening and the old Windows expectation, it fails with a CPU write collected in a new epoch, then two dispatches: 2 reused and 1 resolved tables, expected 1 and 2.
  • ctest, the whole suite on this commit (rebased onto main c0be1f6): 1,250 of 1,254 pass.
  • tools/check_conventions.py --base origin/main passes.
  • Linux: not built here.

The frame-rate runs below were on main ab9a476, before the rebase; the tests above ran on the rebased commit.

ASTRO BOT (PPSA21564 01.007.000), -lvl hub_crashsite (the full Crash Site hub), no input, warm shader cache (1,904 hits, 0 misses), APS5_NO_SNAPSHOT_CHECK=1 APS5_RESOURCE_CACHE_ENTRIES=4096.

A B (this PR)
hub FPS 3.09 / 3.11 / 3.10 / 3.08 3.20 / 3.20 (+3.4 %)

Trace summary lines, APS5_TRACE_SECONDS=300:30 in the same scene, no other APS5_TRACE_*/APS5_PROFILE_* switch, log not redirected. In every capture, queue worker 0's event buffer filled about 5.6 s into the window (trace_dropped). The four traces are available on request.

capture commit presents in 30 s frame ms p50 frame ms p90 gpu_busy ms/present queue worker 0x0 busy Driver.Packet ms/frame
A1 0e4cea2533e7 91 329.2 341.8 152.2 99.3 % 995
B1 76e7495c50a1 94 320.2 328.2 150.7 99.3 % 962
A2 0e4cea2533e7 91 333.4 341.6 151.0 99.3 % 1003
B2 76e7495c50a1 96 312.5 324.5 151.2 99.3 % 944

0e4cea2533e7 is A (main ab9a476 + #6060) and 76e7495c50a1 is B (A + this PR's commit, cherry-picked). A's two captures and B's two were taken in separate sessions on the same day; the FPS rows above alternate.

Summary lines (A1, B1, A2, B2)
{"commit":"0e4cea2533e7","dirty":false,"env":{"APS5_NO_SNAPSHOT_CHECK":"1","APS5_RESOURCE_CACHE_ENTRIES":"4096","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"300:30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.3.1 (LLPC)","os":"Windows 10.0.26200","resolution":"3840x2160","window":{"spec":"seconds 300:30","first_present":7589,"ms":30088.041},"presents":91,"frame_ms":{"p50":329.230,"p90":341.761,"p99":358.002,"max":358.002},"gpu_busy_ms_per_present":152.221,"worker_busy_pct":{"queue worker 0x0":99.317,"queue worker 0x40":99.198,"queue worker 0x48":97.882,"queue worker 0x46":4.639},"top_phases_ms_per_frame":{"Driver.Packet":994.826,"Driver.Packet.memory_wait":623.748,"Driver.Packet.draw":274.862,"Driver.Draw":273.691,"Driver.Draw.draw_and_resource_release":150.867,"Graphics.Draw":149.011,"Graphics.Draw.draw_and_resource_release":127.293,"Driver.Draw.shader_compile_and_link":96.645},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":5.671,"events_lost":1126861,"totals_full":false}},"trace":"aps5-trace-0e4cea2533e7-38328.json.gz"}
{"commit":"76e7495c50a1","dirty":false,"env":{"APS5_NO_SNAPSHOT_CHECK":"1","APS5_RESOURCE_CACHE_ENTRIES":"4096","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"300:30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.3.1 (LLPC)","os":"Windows 10.0.26200","resolution":"3840x2160","window":{"spec":"seconds 300:30","first_present":7485,"ms":30012.035},"presents":94,"frame_ms":{"p50":320.238,"p90":328.198,"p99":334.560,"max":334.560},"gpu_busy_ms_per_present":150.677,"worker_busy_pct":{"queue worker 0x0":99.300,"queue worker 0x40":99.198,"queue worker 0x48":98.077,"queue worker 0x46":4.813},"top_phases_ms_per_frame":{"Driver.Packet":961.729,"Driver.Packet.memory_wait":603.154,"Driver.Packet.draw":262.151,"Driver.Draw":261.033,"Driver.Draw.draw_and_resource_release":140.028,"Graphics.Draw":138.340,"Graphics.Draw.draw_and_resource_release":117.132,"Driver.Draw.shader_compile_and_link":95.201},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":5.626,"events_lost":1150218,"totals_full":false}},"trace":"aps5-trace-76e7495c50a1-24348.json.gz"}
{"commit":"0e4cea2533e7","dirty":false,"env":{"APS5_NO_SNAPSHOT_CHECK":"1","APS5_RESOURCE_CACHE_ENTRIES":"4096","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"300:30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.3.1 (LLPC)","os":"Windows 10.0.26200","resolution":"3840x2160","window":{"spec":"seconds 300:30","first_present":5939,"ms":30305.004},"presents":91,"frame_ms":{"p50":333.391,"p90":341.607,"p99":357.428,"max":357.428},"gpu_busy_ms_per_present":150.968,"worker_busy_pct":{"queue worker 0x0":99.321,"queue worker 0x40":99.211,"queue worker 0x48":98.099,"queue worker 0x46":4.703},"top_phases_ms_per_frame":{"Driver.Packet":1002.867,"Driver.Packet.memory_wait":629.182,"Driver.Packet.draw":276.746,"Driver.Draw":275.514,"Driver.Draw.draw_and_resource_release":151.510,"Graphics.Draw":149.656,"Graphics.Draw.draw_and_resource_release":127.574,"Driver.Draw.shader_compile_and_link":97.106},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":5.664,"events_lost":1141939,"totals_full":false}},"trace":"aps5-trace-0e4cea2533e7-25884.json.gz"}
{"commit":"76e7495c50a1","dirty":false,"env":{"APS5_NO_SNAPSHOT_CHECK":"1","APS5_RESOURCE_CACHE_ENTRIES":"4096","APS5_TRACE_DIR":"<path>","APS5_TRACE_SECONDS":"300:30"},"gpu":"AMD Radeon RX 9070 XT","driver":"AMD proprietary driver 26.3.1 (LLPC)","os":"Windows 10.0.26200","resolution":"3840x2160","window":{"spec":"seconds 300:30","first_present":5828,"ms":30034.340},"presents":96,"frame_ms":{"p50":312.495,"p90":324.478,"p99":345.084,"max":345.084},"gpu_busy_ms_per_present":151.188,"worker_busy_pct":{"queue worker 0x0":99.292,"queue worker 0x40":99.210,"queue worker 0x48":97.981,"queue worker 0x46":5.269},"top_phases_ms_per_frame":{"Driver.Packet":943.545,"Driver.Packet.memory_wait":589.044,"Driver.Packet.draw":256.496,"Driver.Draw":255.348,"Driver.Draw.draw_and_resource_release":137.372,"Graphics.Draw":135.660,"Graphics.Draw.draw_and_resource_release":114.983,"Driver.Draw.shader_compile_and_link":92.531},"trace_dropped":true,"trace_dropped_threads":{"queue worker 0x0":{"events_full_after_s":5.541,"events_lost":1170046,"totals_full":false}},"trace":"aps5-trace-76e7495c50a1-20508.json.gz"}

Related: #1201's pipelining commit keeps a thread's collected ranges for the whole epoch (EpochCollectMap). That covers a separate repeat: the 64-entry memo ring is smaller than a queue-0 epoch here. The two changes add up. With an epoch-long memo, the widening cut the hub's walks on queue worker 0 from 81k to 57k and their time from 686 to 578 ms per 10 s (local counter). This tree plus #1201 (with @Raghav314's and @eliyarson's ordering fixes), APS5_PIPELINED_DRAWS=1, runs the hub at 5.33 / 5.36 FPS.

Update (2026-10-16)

#6060 has merged since this was opened, and so has #1201 (pipelined draws, with its per-epoch collect map). This branch still merges cleanly. I retested it merged onto main 5d9dcc4:

  • agc_write_tracking and agc_driver_image_table_reuse pass 3 of 3.
  • ctest -R "agc_|guest_memory|write_watch": 602 of 605.
    • agc_driver_quad_pixel_mask and agc_driver_layered_volume_vertex_no_gpl fail on this GPU without this change, as noted above.
    • agc_driver_gpu_indirect_arguments_misaligned_writer_ahead does not build under MinGW on main itself: alignas(65536) exceeds the object file maximum of 8192. test(agc): align the indirect arguments block at run time #6452 fixes that.

Checklist

  • Based on current main; no other open PR implements the same functions
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none (the gain shows with perf(agc): keep Windows host imports of write-watched private memory watched #6060, which keeps resident imports watched)
  • Unblocks: none
  • GPUs tested: AMD Radeon RX 9070 XT, driver 32.0.23033.1002, Windows 11 Pro 26200
  • AI-assisted: yes

🤖 Generated with Claude Code

Linux widens a collect of at most one 64 KiB block to the whole block within an epoch (boykopovar#1310), so
the memo serves the block's other ranges. Windows kept the requested range because it was not
tested there. On Windows with boykopovar#5596's resident direct memory every walk is a GetWriteWatch call,
and ASTRO BOT's hub walks about 50k ranges of at most 64 KiB per 10 s on queue 0.

Windows coverage does not know which pages of a block are committed or inaccessible, and a walk
refuses such a range before it collects anything. So a widened walk that fails is retried over the
requested pages; without that, a collect beside uncommitted pages of its block fails.

agc_driver_image_table_reuse expected one more table resolution on Windows than on Linux, from
the narrower collects; it now expects Linux's count on both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 2434 docs/dev/debt/libSceAgcDriver.md
PR 4448 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 4449 docs/dev/debt/libSceAgcDriver.md
PR 4650 docs/dev/debt/libSceAgcDriver.md
PR 5021 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 5058 docs/dev/debt/libSceAgcDriver.md
PR 5372 docs/dev/debt/libSceAgcDriver.md
PR 5499 docs/dev/debt/libSceAgcDriver.md
PR 5925 docs/dev/debt/libSceAgcDriver.md
PR 5926 docs/dev/debt/libSceAgcDriver.md
PR 6146 docs/dev/debt/libSceAgcDriver.md
PR 6169 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6185 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6186 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6187 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6188 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6192 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6194 docs/dev/debt/libSceAgcDriver.md
PR 6209 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6218 docs/dev/debt/libSceAgcDriver.md
PR 6223 core/libs/prx/libSceAgcDriver/tests/execution/ImageTableReuse.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6252 docs/dev/debt/libSceAgcDriver.md
PR 6280 docs/dev/debt/libSceAgcDriver.md
PR 6292 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6300 docs/dev/debt/libSceAgcDriver.md
PR 6308 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
PR 6340 core/libs/prx/libSceAgcDriver/tests/execution/ImageTableReuse.cpp
PR 6412 docs/dev/debt/libSceAgcDriver.md
PR 6451 docs/dev/debt/libSceAgcDriver.md
PR 6457 docs/dev/debt/libSceAgcDriver.md
PR 6472 docs/dev/debt/libSceAgcDriver.md
PR 6479 docs/dev/debt/libSceAgcDriver.md
PR 6481 docs/dev/debt/libSceAgcDriver.md
PR 6498 docs/dev/debt/libSceAgcDriver.md
PR 6529 docs/dev/debt/libSceAgcDriver.md
PR 6543 docs/dev/debt/libSceAgcDriver.md
PR 6548 docs/dev/debt/libSceAgcDriver.md
PR 6549 docs/dev/debt/libSceAgcDriver.md
PR 6557 docs/dev/debt/libSceAgcDriver.md
PR 6563 docs/dev/debt/libSceAgcDriver.md
PR 6571 docs/dev/debt/libSceAgcDriver.md
PR 6572 docs/dev/debt/libSceAgcDriver.md
PR 6588 docs/dev/debt/libSceAgcDriver.md
PR 6601 docs/dev/debt/libSceAgcDriver.md
PR 6612 docs/dev/debt/libSceAgcDriver.md
PR 6615 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6636 docs/dev/debt/libSceAgcDriver.md
PR 6639 docs/dev/debt/libSceAgcDriver.md
PR 6646 docs/dev/debt/libSceAgcDriver.md
PR 6650 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6683 docs/dev/debt/libSceAgcDriver.md
PR 6701 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
PR 6718 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6723 docs/dev/debt/libSceAgcDriver.md
PR 6727 docs/dev/debt/libSceAgcDriver.md
PR 6730 docs/dev/debt/libSceAgcDriver.md
PR 6741 docs/dev/debt/libSceAgcDriver.md
PR 6759 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6760 docs/dev/debt/libSceAgcDriver.md
PR 6762 docs/dev/debt/libSceAgcDriver.md
PR 6786 docs/dev/debt/libSceAgcDriver.md
PR 6801 docs/dev/debt/libSceAgcDriver.md
PR 6804 docs/dev/debt/libSceAgcDriver.md
PR 6808 docs/dev/debt/libSceAgcDriver.md
PR 6820 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6821 docs/dev/debt/libSceAgcDriver.md
PR 6867 docs/dev/debt/libSceAgcDriver.md
PR 6868 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6887 docs/dev/debt/libSceAgcDriver.md
PR 6914 docs/dev/debt/libSceAgcDriver.md
PR 6921 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6926 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6937 core/libs/prx/libSceAgcDriver/tests/execution/ImageTableReuse.cpp
PR 6941 docs/dev/debt/libSceAgcDriver.md
PR 6946 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6947 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 6958 docs/dev/debt/libSceAgcDriver.md
PR 6959 docs/dev/debt/libSceAgcDriver.md
PR 6960 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
PR 6965 docs/dev/debt/libSceAgcDriver.md
PR 6966 docs/dev/debt/libSceAgcDriver.md
PR 6973 docs/dev/debt/libSceAgcDriver.md
PR 6977 docs/dev/debt/libSceAgcDriver.md
PR 6987 docs/dev/debt/libSceAgcDriver.md
PR 6989 docs/dev/debt/libSceAgcDriver.md
PR 6995 docs/dev/debt/libSceAgcDriver.md
PR 7002 docs/dev/debt/libSceAgcDriver.md
PR 7008 docs/dev/debt/libSceAgcDriver.md
PR 7085 docs/dev/debt/libSceAgcDriver.md
PR 7154 docs/dev/debt/libSceAgcDriver.md
PR 7201 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
PR 7233 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
PR 7250 docs/dev/debt/libSceAgcDriver.md
PR 7254 docs/dev/debt/libSceAgcDriver.md
PR 7256 docs/dev/debt/libSceAgcDriver.md
PR 7258 docs/dev/debt/libSceAgcDriver.md
PR 7307 docs/dev/debt/libSceAgcDriver.md
PR 7310 docs/dev/debt/libSceAgcDriver.md
PR 7332 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7371 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
PR 7390 docs/dev/debt/libSceAgcDriver.md
PR 7413 docs/dev/debt/libSceAgcDriver.md
PR 7426 docs/dev/debt/libSceAgcDriver.md
PR 7432 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7445 docs/dev/debt/libSceAgcDriver.md
PR 7446 docs/dev/debt/libSceAgcDriver.md
PR 7449 docs/dev/debt/libSceAgcDriver.md
PR 7480 docs/dev/debt/libSceAgcDriver.md
PR 7505 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7533 docs/dev/debt/libSceAgcDriver.md
PR 7579 docs/dev/debt/libSceAgcDriver.md
PR 7600 docs/dev/debt/libSceAgcDriver.md
PR 7604 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7615 core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
PR 7640 docs/dev/debt/libSceAgcDriver.md
PR 7642 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7650 docs/dev/debt/libSceAgcDriver.md
PR 7659 docs/dev/debt/libSceAgcDriver.md
PR 7668 docs/dev/debt/libSceAgcDriver.md
PR 7683 docs/dev/debt/libSceAgcDriver.md
PR 7687 core/libs/prx/libSceAgcDriver/Execution/src/GuestMemory.cpp
core/libs/prx/libSceAgcDriver/tests/WriteTracking.cpp
docs/dev/debt/libSceAgcDriver.md
PR 7696 docs/dev/debt/libSceAgcDriver.md

This was referenced Oct 15, 2026
@Scramblrrrr

Copy link
Copy Markdown
Contributor

Windows/RTX5070Ti617.42 combined cross-test is ready at51b148e100509891c9b194da360e6dd80bdeb16b: https://github.com/Scramblrrrr/AnyPS5/tree/codex/first-light-watch-proof-current . Includes #6346 5532d51 and #6273 fdcbb83, on main93e54cedd plus our explicitly listed007/shared-table/level prerequisites. Both author commits applied cleanly; no replacement implementation.

30/30 selected native CPU/Vulkan checks PASS14.19s, no skips, including write_tracking's new cases, repeated-neighbour stores, image-table reuse/bounds, shared-table vouches, draw reuse/verify/inline, storage flush ordering, tessellation, serializer/cache and prebuild unset/0/1. Conventions clean. After final revision-string rebuild,5/5 related controlsPASS1.46s. Combined native evidence, not standalone each-PR evidence; no title FPS result yet.

Integration test adjustment: the a driver store over an entry case now counts2reuse/1resolution across its two dispatches, instead of1/1. With the finer range proof, clean siblings are reused even on the dispatch that rebuilds the changed entry. Both texel checks retained; no production proof weakened. #6273's CpuWriteResolutions=1 is retained. All other current #6340 expectations pass unchanged.

There is also an opt-in bounded copied-buffer ownership sampler in this test branch (maximum25small records per process, no game contents). Its initial asynchronous output triggered a native process-exit timeout; sampler-off control passed, and switching it to the existing direct trace sink made all3prebuild policies pass with sampling on. That defect was mine, not attributed to either PR. The full native result above has sampling enabled after the correction. Starting a guarded007 cross-test next. AI-assisted: Codex; raw title data local.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 17, 2026
@adriadam10 adriadam10 self-assigned this Oct 18, 2026
@github-actions github-actions Bot added the perf Performance change label Oct 18, 2026
@Amoenus

Amoenus commented Oct 19, 2026

Copy link
Copy Markdown
Contributor

Current-main Windows fixture check (2026-10-19)

Heads-up for the next refresh: the exact counter failure described above now also occurs without this PR's production change on unmodified main 0c25997a5a19dede15c8b0da5fb4bc3683bd14d3:

image table reuse: a CPU write collected in a new epoch, then two dispatches:
2 reused and 1 resolved tables, expected 1 and 2

Reproduced once on each actual GPU after a matching full Windows relinker/library + reuse-fixture build. Its preceding texel checks pass; it stops at this counter assertion.

I then applied only your four-line CpuWriteResolutions test correction from fdcbb838d69705002f14457881bac83388c93918, keeping all production code at that main pin. Credited test-only backport a868b033d4 retains Sorab's co-authorship. With it, the full agc_driver_image_table_reuse fixture passes 3/3 per GPU, including the later image-store cases. No validation error/warning, whole-test skip, internal no-write-watch bypass or timeout; Khronos insertion and device identities verified.

Windows 11 Enterprise 26200 / WinLibs GCC 15.2 r7; RTX 5080 driver 32.0.16.1062 (610.62), Radeon(TM) Graphics 32.0.21036.18; Khronos 1.4.363. ANYPS5_REQUIRE_VULKAN=1, project shader cache disabled, ctest -V -j1 --timeout 30 --repeat until-fail:3 -R '^agc_driver_image_table_reuse$'. Driver caches uncontrolled.

This validates the fixture expectation on that main pin, not the collect-widening/retry behavior or performance of #6273. In particular, the old Windows counter expectation no longer distinguishes the optimization from its base there. We will carry the credited fixture correction in our experimental composition; no duplicate PR for your change. Original build/test logs are retained. AI-assisted validation/report: Codex; author responsible.

Amoenus added a commit to Amoenus/AnyPS5 that referenced this pull request Oct 19, 2026
Backport only the fixture expectation from PR boykopovar#6273 by Sorab, commit fdcbb83. Main0c259 already produces the one-resolution outcome on both physical GPUs without the Windows collect-widening change. Retain every texel check and exact reuse-count assertion.

Co-authored-by: Sorab <sohorhab.azizdel@outlook.com>
(cherry picked from commit a868b03)

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* docs needs rebase Conflicts with main, rebase needed perf Performance change

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants