Skip to content

fix(agc): snapshot host shader prologues before frame replay - #12871

Merged
oneandonlydean merged 4 commits into
boykopovar:mainfrom
JJenkx:codex/capture-host-prologue-main-20261029
Nov 2, 2026
Merged

oneandonlydean merged 4 commits into
boykopovar:mainfrom
JJenkx:codex/capture-host-prologue-main-20261029

Conversation

@JJenkx

@JJenkx JJenkx commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

What

Shader registration and ABI calls made before a frame-capture trigger are saved in the replay prologue. Their host-resident headers and code can lie outside registered guest allocations, so the initial snapshot omits them and strict replay cannot read the shaders.

Collect the host pages referenced by those calls while waiting and snapshot the still-readable pages at the capture boundary, before writing the prologue. Reuse the existing shader-page traversal, preserve read-only permissions, skip already-covered pages, and retain in-frame shader deltas.

Three regressions cover separate host code, host-resident header/code, and read-only header/code registered before the trigger. Existing shader controls retain their entry point. Read-only merge previews compose cleanly with the fetched heads of #11435, #11436, #12567 and #12568; their additional controls are retained. This is independent of the unwatched-memory fallback offered on #12568 and does not supply that fallback. Existing stale/freed historical shader-registration limitations remain documented under Frame replay debt.

Tested

Linux Release, GCC 16.2.1, AMD Radeon RX 6650 XT (RADV NAVI23), Mesa 26.2.4, kernel 7.2.9-arch1-1. Exact head ca858917b0cb25d494e692d2835b8d21f71f9009, based directly on main 5454cd2e455994d992aca39335ce60507eeda1eb.

Control Result
Unchanged main, existing focused capture/replay/multisample gate 14/14 pass
Test-only 863bda70fe062decbefbd8a1b89efc6dc5ce9321, unchanged recorder implementation Both existing shader controls pass; all three new prologue regressions fail on missing code bytes
This head, CPU serialization controls with invalid Vulkan ICD paths and syscall tracing All five pass; no DRM device opens
This head, complete focused gate 17/17 pass: the 14 common tests plus three new regressions

The main and change focused gates used the same machine/GPU, ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, and Mesa shader cache disabled. Both confirm the actual RX 6650 XT and validation-layer insertion; zero skips, missing-layer messages or VUIDs. The library stayed byte-identical through each gate. These gates include CPU serialization checks as well as hardware tests; this is not a claim that every group creates a GPU device.

Conventions and whitespace pass. A read-only merge preview against upstream 157b02c4f1803e9d2cd757677b9a805961203fc4 is clean. No new Windows execution, title replay fidelity, lighting or FPS improvement is claimed. The private title capture is separate and does not establish replay fidelity.

Source proof, negative/positive controls, builds, device-access traces and paired focused logs/JUnit, SHA-256 4a207cef8510163045dd48338a6742fc49184141d5aa803e762622fed638ce17 (download verified). No game memory, assets or binaries.

GitHub Windows CI passed for head ca858917b0c merged into main. Its configure and host-only linking workflow steps succeeded; the full library build, CTest execution and test-skip checks were skipped. This is limited CI coverage, not Windows runtime or physical-GPU qualification.

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
  • Fixes: none
  • Unblocks: none (capture-tool correctness; no title bring-up claim)
  • GPUs tested: AMD Radeon RX 6650 XT, RADV/Mesa 26.2.4, Linux 7.2.9-arch1-1
  • AI-assisted: yes (Codex)

@JJenkx

JJenkx commented Oct 29, 2026

Copy link
Copy Markdown
Contributor Author

Private title follow-up on integration 1983ce55581 (main 5454cd2e455 plus the replay stack, unwatched fallback and this host-prologue fix): the native run closed normally, recorded two frames without warnings, and now snapshots all 12 host shader headers referenced by the prologue.

Strict cold replay with --strict --no-synthesize --cold-pipelines completes: two 3840×2160 frames, zero pacing timeouts, synthesized values, unfinished submissions, failed registrations or VUIDs. Both output frames are pixel-identical to their captured references; an independent decoded-image comparison and direct image inspection agree. The tool still counts 33 stale historical prologue registrations. Actual RX 6650 XT and validation-layer insertion are confirmed; tested library bytes stayed unchanged and the kernel setting was restored.

This qualifies a two-frame rendering reproducer on that complete private integration, not a standalone-title or save-state result for this public PR. The underwater scene remains extremely dark; no lighting or native FPS improvement is established. Cold replay timings include compilation/pacing and are not game FPS. Captures, images and game binaries remain private.

Numeric comparison, source pin and replay command/harness only, SHA-256 54c395795b49170d347fba2a6cd735f18fe91df368ac2bff3295e372383a051b (download verified).

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

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.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 12568 core/libs/prx/libSceAgcDriver/tests/cmake/agc_driver_frame_replay_state_tests.cmake L9

@oneandonlydean oneandonlydean self-assigned this Oct 29, 2026
@github-actions github-actions Bot added build agc libSceAgc* labels Oct 29, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head ca85891 merged onto main bb04a4f · tested 2026-10-30 00:21 UTC · 24 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,313 passed · 6 failed (0 new, 5 also fail on main, 1 unstable on main) · 40 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,359 of 2,918 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (898 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_bda_device 61.8 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_submit_progress: failed in 4 of the last 6 main runs
Failing on main too (5, not counted against this PR)
agc_compute_pipeline_inspection
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (3, not in the main baseline's validation pass)
agc_driver_frame_replay_shader_prologue_code
agc_driver_frame_replay_shader_prologue_header
agc_driver_frame_replay_shader_prologue_readonly
Validation IDs already present on main (4 IDs in 433 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (433 tests): agc_compute_pipeline_replay, agc_driver, agc_driver_address_passes_draw_transitions, agc_driver_address_passes_targets_split, agc_driver_alias_copy_label, agc_driver_array_layer_target, agc_driver_array_layer_target_cpu, agc_driver_bda_anchor_reads, and 425 more
VUID-vkCmdCopyImage-srcImage-01548 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-vkCmdCopyImage-srcImage-01551 (11 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_cpu_write_after_memo, agc_driver_depth_plane_cpu_write_after_page_unwatch, agc_driver_depth_plane_cpu_write_after_partial_unwatch, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_storage_dispatch, and 3 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
Skipped (40)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_msaa_dcc_compared_import_2: skipped, the device reports host imports that keep write protection, so the write-watch probe compares none of them
agc_driver_msaa_dcc_compared_import_4: skipped, the device reports host imports that keep write protection, so the write-watch probe compares none of them
agc_driver_msaa_dcc_compared_import_8: skipped, the device reports host imports that keep write protection, so the write-watch probe compares none of them
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_stencil_ref_export: skipped, the device lacks VK_EXT_shader_stencil_export
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fresh: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_labels: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not
Reproduce
git fetch origin ca858917b0cb25d494e692d2835b8d21f71f9009 bb04a4f1ea0175e9e4f149f0359a764d62ff3296
git checkout bb04a4f1ea0175e9e4f149f0359a764d62ff3296 && git merge --no-ff ca858917b0cb25d494e692d2835b8d21f71f9009
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated 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.

@JJenkx

JJenkx commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

Additional title-level capture/replay diagnostic for this unchanged ca858917b0cb25d494e692d2835b8d21f71f9009 head, on Ikai (PPSA06584). This is a pinned private integration, not newest-main qualification or a rendering/FPS fix: main 39fc186c978aa6332538fb1101d1722124979ab5 plus the existing #6782/#6913 diagnostic changes and #12567 at 76ce637975b4102bcc90d68d353f0e39649e6990, then this PR. Before/after integration pins: e767e080b9e5b5285c73847569f683bd59b0311c / ea3ce8a1bd07572ab9b7b1b1473d470f6e783764.

The earlier native capture had no host-memory ranges, two unreadable prologue shader headers, and strict replay exited 2 on a missing host code read before image comparison. The new capture has six host-range chunks and all 2,652 recorded complete Shader structures readable, with zero missing headers. One frame, 20 calls, zero capture warnings or unreadable bytes. The original rendering defect is still visible.

  • Paired frozen integration regression selection: baseline 31/31 and candidate 34/34 executed, zero skips/VUIDs; actual RX6650XT/RADV and Khronos layer insertion verified on both. Includes the three new host code/header/read-only prologue cases. SPIRV-Tools OFF on both; no optimizer claim.
  • Fresh native capture: game/harness exit 0, two actual layer insertions, zero VUIDs, original seven input hashes unchanged, no leftover private processes, kernel import limit restored.
  • Strict same-library replay (--strict --no-synthesize --frames <private-output>): exit 0, 19 submissions, zero failed registrations, zero unfinished submissions, zero synthesized/released waits and zero pacing timeouts; one actual validation insertion, zero VUIDs. It now reaches both recorded display-buffer comparisons. There are 78 reported stale registrations; they did not become failed registrations in this replay.
  • Independent CPU image check: buffer 0 byte-identical; buffer 1 has 97.193769% identical pixels and maximum channel difference 8. Both saved native and replay images reproduce the black-paper/brush defect. This establishes a usable reproduction for investigating that scene, not exact pixel equivalence or general replay fidelity. The reported cold replay rate is not gameplay FPS.

The pinned original #12567 composition is still required for this diagnostic pipeline; this report does not claim this PR alone solves every native capture blocker. Windows/macOS were not run.

Numeric/source-pin and synthetic paired-test evidence, SHA256 67f371911b18478dd0fafa21d3de99e7d378d6991611c6b47db00ff7918f743f, uploaded then downloaded and verified. No game assets, images, binaries or captured memory attached. AI-assisted: yes.

@JJenkx

JJenkx commented Oct 30, 2026

Copy link
Copy Markdown
Contributor Author

Title-level control for this unchanged head ca858917b0c, on Echoes of the End (PPSA25636, 01.012.000). Private integration, not a newest-main qualification: a private Echoes base (main 899ae3d1ad3 plus open PRs it needs to boot, and #12827, #12066, #8874) with #12567, #12568 and #12696 merged for capture/replay. The two arms differ only in this PR's merge (control = the same stack with this PR's merge reverted).

Both arms: same seeded save and caches, APS5_FRAME_CAPTURE triggered at the in-world spawn (~1190 s), 2 frames, then agc_frame_replay <capture> --frames <dir> on the same build that captured. RX 6650 XT, RADV Mesa 26.2.4, Linux 7.2.9, Release.

capture replay
with this PR (fd71cc715d1) 2 frames, 193 calls, 189 deltas, no warnings 2 frames, 179 submits, 0 pace timeouts, 0 failed registrations; replayed display buffers written
without this PR (36b33e47ca1) 2 frames, 185 calls, 181 deltas, no warnings driver failure: AGC driver: guest memory is not readable at 0x7f812526c400 (range 0x7f812526c400+0x4), exit 2, no frames

An earlier capture on the stack without this PR, #12568 or #12696 failed the same way (guest memory is not readable at 0x7f1b5d493500), so the host-resident shader bytes this PR snapshots are what the Echoes replay was missing. No performance claim.

🤖 Generated with Claude Code

# Conflicts:
#	core/libs/prx/libSceAgcDriver/CMakeLists.txt
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 1, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 8f240b7 merged onto main e6f5730 · tested 2026-11-01 18:07 UTC · 25 min

GPU NVIDIA RTX 2000 Ada Generation, driver 595.99.02, Vulkan 1.4.329
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-38-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,485 passed · 5 failed (0 new, 3 also fail on main, 2 unstable on main) · 45 skipped (ANYPS5_REQUIRE_VULKAN=1)
Test setup CPU-only tests without a GPU; GPU tests (and any CPU-only test that failed or skipped without one) once on the GPU with VK_LAYER_KHRONOS_validation and ANYPS5_NO_SHADER_CACHE=1; main ran the same way
Test selection 2,535 of 3,148 tests run: the ones this change can reach, chosen by tools/select_tests.py from main's build graph
Vulkan validation ✅ no new validation IDs vs main (934 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_graphics 31.8 s, ⚠️ agc_driver_graphics_maps_fallback 31.3 s
Unstable on main (2, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 1 of the last 10 main runs
agc_submit_progress: failed in 6 of the last 10 main runs
Failing on main too (3, not counted against this PR)
agc_driver_image_table
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (3, not in the main baseline's validation pass)
agc_driver_frame_replay_shader_prologue_code
agc_driver_frame_replay_shader_prologue_header
agc_driver_frame_replay_shader_prologue_readonly
Validation IDs already present on main (5 IDs in 484 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (484 tests): agc_driver, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, agc_driver_bda_anchor_reads, agc_driver_bda_span_reads, and 476 more
VUID-vkCmdCopyImage-srcImage-01548 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (7 tests): agc_driver_depth_clear_hle, agc_driver_depth_plane_buffer_memory, agc_driver_depth_plane_partial_store, agc_driver_depth_plane_sampling, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_prepared_exports
VUID-VkShaderModuleCreateInfo-pCode-08737 (1 test): agc_driver_image_sample_derivatives
Skipped (45)
agc_driver_bda_reads_shadowed_results: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_bda_reads_shadowed_results_per_build: skipped, the device reports watched host memory written when it imports or reads it
agc_driver_sample_order_grid_reference: skipped, the device does not keep depth drawn at custom sample locations at those locations, even after a transition that names them: the composite of uniform renders holds the guest's depth in 0 of 3005 sloped samples, so no path can be compared with it bit for bit
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_import_settle_initial_dcc: skipped, the device has no deferred settle of host imports: imports under 1 MiB wait for one only on Windows
agc_unit_shadow_completion_store: skipped, the device reports watched host memory written when it imports or reads it
guest_http_uri_locale: 
guest_net_ctl: skipped, the host has no IPv4 address
guest_video_out_color_space: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_hdr: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_high_frame_rate: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_output_mode: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_resolution_status: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_wqhd_detection: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
video_out_flip_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_backtoback: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_controls: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_cpuflip_in_order: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_dcc: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_deferred: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_aftergpu: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_eop_main: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_out_flip_fps_limit: skipped, no display or Vulkan device: DisplayWindow: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
video_o
Reproduce
git fetch origin 8f240b71502d0e6c87dd70f237150c572fba1964 e6f57307fa7f47165d7fc1bee945abdb2f6816e7
git checkout e6f57307fa7f47165d7fc1bee945abdb2f6816e7 && git merge --no-ff 8f240b71502d0e6c87dd70f237150c572fba1964
git submodule update --init --recursive
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DANYPS5_ENABLE_SPIRV_TOOLS=ON
cmake --build build && cmake --build build --target libs
VK_DRIVER_FILES=/nonexistent/icd.json ctest --test-dir build -E '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 32 --output-on-failure
ANYPS5_REQUIRE_VULKAN=1 ANYPS5_NO_SHADER_CACHE=1 VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation \
  ctest --test-dir build -R '^(agc|shader|recompiler|videoout|video_out|guest_video_out|vulkan)|gpu' --timeout 120 --parallel 4 --output-on-failure
# failures are then re-run alone: --timeout 360 --parallel 2; new validation IDs: the test alone, twice, --parallel 1

Automated 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.

@JJenkx

JJenkx commented Nov 2, 2026

Copy link
Copy Markdown
Contributor Author

Fresh title-level capture/replay case on Linux RX6650XT / RADV Mesa26.2.6 / kernel7.2.11, using current main 66e1f7f993c9 versus private 5072cd52bbb6 (only this PR's feature/test commits replayed onto that main; CMake split resolved). The frozen SDKs differ only in patched/unpatched AgcDriver, whose ELF build IDs match within each pair.

PPSA19244, The Oregon Trail02.000.001, still presents black output on both arms. Both native runs close normally (0,184.0/183.7s), original inputs/save seed/SDK/generated ELF hashes stay intact, kernel settings restore, no native PIDs remain. One frame captured at100s; both captures contain21 draw and9 dispatch packets and two all-zero3840x2160 display references. No capture warnings.

  • Main capture replay: exit2 after11.3s, missing host shader-header/data memory, prologue registration failures and one unfinished submission.
  • This change's capture replay: exit0 after1.9s,2 submits,0 unfinished,0 failed registrations,0 pacing timeouts,0 skippedMiB; both display images match exactly (pixels_identical=1, max channel diff0). Two stale historical registrations remain reported, within the existing documented limitation.

Actual instance/device Khronos1.4.363 layers loaded in both replays; no replay VUIDs. Both native logs have the same existing vertex/index usage VUIDs (20 messages each, covered by #6913); no additional native VUID identifiers on the change. Replay used agc_frame_replay <capture> --no-pace --frames <dir> with matching unpatched SDK libraries.

This supplies a short reproducer for the black frame, not a graphics or game-performance fix. Native control used a cold cache; change used an independent warm-cache clone, so timing is not a loading/FPS comparison. Sanitized machine-readable evidence, SHA256 85dbcc26a21e44cbbb74be9e8144a1c8f728a2f82d0b9119178c3a701b9b9fb8; title memory, requests, code and raw logs stay private.

AI-assisted: yes.

@oneandonlydean
oneandonlydean merged commit 4df9e96 into boykopovar:main Nov 2, 2026
10 of 11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agc libSceAgc* build

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants