Skip to content

feat(agc): group GPU draw timings by complete shader stage sets - #15572

Open
JJenkx wants to merge 1 commit into
boykopovar:mainfrom
JJenkx:feat/agc-profile-draw-stage-sets-20261103
Open

JJenkx wants to merge 1 commit into
boykopovar:mainfrom
JJenkx:feat/agc-profile-draw-stage-sets-20261103

Conversation

@JJenkx

@JJenkx JJenkx commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

What

The existing per-draw GPU report groups a draw by its fragment variant. Different vertex/geometry programs using the same fragment variant therefore collapse into one timing group, including draws using the built-in null pixel program.

Add opt-in APS5_PROFILE_GPU_DRAW_STAGES alongside APS5_PROFILE_GPU=1 APS5_PROFILE_GPU_DRAWS=1. Recorded draws use a canonical complete shader-stage/64-bit-variant set as their timing key. [drawstages] drawset 0xN stage:0xvariant ... maps each process-local key once; [gputime] reports drawset 0xN. Stage order does not affect identity, and distinct programs/stages do not collapse. The previous labels/grouping remain the default. This measures whole draws, not individual shader-stage execution time. Existing timestamp-range caps and top-twelve reporting limits still apply.

This is developer instrumentation, with no title fix or FPS improvement claimed.

Tested

Linux x86-64, GCC 16.2.1 Release. Current production head be736b2f0a22750a38807bf9aa91943169de8f3b is one commit on main 086c0686c8adff3ee648fdbe34e0b0b647e1d511. The rebase retains the identical stable patch ID. The following host and focused GPU checks were rebuilt and repeated on that main/change pair:

  • Host-only key tests and actual Recorder key/label tests: 3/3 pass with Vulkan ICD disabled. Coverage includes shared-fragment/different-vertex cases, geometry/tessellation stages, full-width variants, reordered inputs, concurrency, and key-space exhaustion. A private fragment-only mutation fails with shared fragment collapsed distinct vertex programs.
  • Same focused 15-case Vulkan suite on main and this change, with ANYPS5_REQUIRE_VULKAN=1, ANYPS5_NO_SHADER_CACHE=1, the Khronos validation layer, and all three profiling flags enabled: 15/15 each, zero skips and zero VUIDs. Layer insertion and RX 6650 XT selection confirmed; sources and loaded unpatched library hashes unchanged during each arm. These cases exercise real GPU work but do not activate the recorded-draw stage mapping path; the separate native diagnostic below covers that path.

Outer Wilds PPSA08102 recorded-draw diagnostic: immutable integration 616721c3ac514955c26ebe537836c957142b25de combines this change with the same #15436/#15487 stack/mapped-copy prerequisites used by the prior control. Reused extracted assets; independent 406-module SDK, source snapshot, and caches; fresh save; Wake Up at 140 s, outdoor scene at 170 s and after the trace. The 320 s scheduled close exited normally (native 0), no remaining process, SDK/generated files unchanged, save locations and shared kernel setting restored. 594 stage-set mappings and 30 GPU timing reports were captured. The built-in NullPixelCode fragment variant was resolved through its loaded ELF mapping and symbol, and split into 22 distinct complete stage sets. Compositor/X11 captures agree after the trace. This verifies actual instrumentation, not FPS improvement, console-equivalent graphics, audio or a full playthrough.

Patch, raw qualification logs, native metadata/captures and stage mappings, SHA-256 3d0f5189dd1a76791b2d034f4d70c6f6c6ddd63ab5f42422ebb52364728d0b5c (internal manifest and GitHub upload digest verified).

Current-main stage-profiling follow-up (2026-11-04): private integration b7c979652829c8cb10de87eb7328ac96b4ef380b is main b611e634f7fc024f0c13e342d96de744448ef1d9 plus the unchanged #15572 patch (stable patch IDs match). Same focused real-Vulkan/VVL/cache-off gate: main 5/5, change 7/7, no failures/skips/VUID messages, frozen SDK/source integrity retained.

The first separately staged native run crashed during startup (exit 139, 14.5 s). A fresh independent runtime with a first-fault-only debugger then reached Wake at 137.75 s, the outdoor scene, and its scheduled ordinary close (native/debugger exit 0, 279.1 s); the debugger saw no fault, changed no guest state and bypassed no failing execution. The earlier startup crash remains unexplained; no crash fix is claimed. Both runs and cleanup receipts are retained.

The successful diagnostic emitted 594 complete stage mappings and 26 GPU timing reports. Eleven safely post-Wake report intervals cover 1,292 presents with zero dropped ranges and no missing stage keys. Four complete draw sets sharing the built-in NullPixelCode fragment account for at least 39.89 ms/present in the logged top-twelve program costs; draw-class timing totals 69.33 ms/present. Their vertex variants are distinct (0x82, 0x96, 0x91, 0x83 in this process). Fragment identity is proven from [drawvariant], the captured loaded-driver mapping and the frozen ELF symbol, rather than assumed from an old process ID.

This identifies costly whole draws, not isolated vertex/fragment execution. Top-twelve reporting makes aggregates lower bounds. Profiling/debugger overhead, animated sky/lighting and fixed upward camera prevent a matched FPS comparison. Reviewed captures show the opening trees/tower/tutorial; audio, reference rendering and full gameplay remain unverified.

Raw paired gates, normal/failure accounting, native logs, mappings, timing analysis, trace and captures, SHA-256 174c5997ea489550dc173298e092c082ad9c19dcec88385bd8f60d9d04364cbc (public download verified). No provider module bytes, game assets/saves or shader request/SPIR-V payloads included.

Overlap: official scan checked 1,777 open PRs. Its 85 failed-closed shared-file branches were compared separately from their own merge bases; no duplicate timing-key/grouping implementation was identified. #11566 covers mocked fixture profiling, #13417 fixes parsing of unlisted timing keys, and #15548 changes mesh-compute render-pass sharing; none supplies this stage-set grouping or is required by it.

Current-main086 refreshed build/test logs, hashes and rebase proof, SHA-256 aa95fffcdef446bd723804063e52b95442b87fff6459ee42b06418340394b7a3 (internal manifest and GitHub digest verified): host 3/3; same 15/15 Vulkan cases on main and change, actual validation layer, zero VUIDs/skips, sources/libraries unchanged. That earlier archive retains its main1e/integration616721 pins; the following diagnostic is separate current-main evidence.

Additional current-main native proof: integration 129d0b19805f160b605451c8ac00171042c0ae78 combines main 086c068, this head be736b2f, and the #15487 mapped-copy prerequisite. The first fixed-input attempt remained at the title screen and is retained as menu-only evidence. The retry recognized Start/Expedition/Wake Up prompts, reached the outdoor trees/tower/tutorial scene in both reviewed capture channels, and closed normally at 227 s with SDK/generated files unchanged and saves/kernel restored. It emitted 594 stage-set mappings, including 22 combinations sharing the null fragment variant. Profiling, shader dumps and OCR navigation were enabled; this is instrumentation/scene proof, not a performance comparison. Raw logs, provenance, input records and captures, SHA-256 a08959bc587af92f60faaf5099c75d4ac423330212c1d03a1f930a9785052d78 (manifest and GitHub digest verified). Private game request/SPIR-V payloads, saves, binaries and assets are excluded.

Conventions and whitespace checks pass. No Windows/macOS result is claimed.

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
  • GPUs tested: AMD Radeon RX 6650 XT (RADV NAVI23), Mesa 26.2.6, Linux 7.2.11
  • AI-assisted: yes

@JJenkx
JJenkx force-pushed the feat/agc-profile-draw-stage-sets-20261103 branch from ef71662 to be736b2 Compare November 3, 2026 19:32
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head be736b2 merged onto main 1c8c0ef · tested 2026-11-04 06:24 UTC · 20 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,787 passed · 4 failed (0 new, 3 also fail on main, 1 unstable on main) · 50 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,841 of 3,842 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 (953 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 s, ⚠️ agc_driver_interpolation_modes 40.7 s, ⚠️ agc_driver_lazy_resolved_abi 31.0 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 4 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 (1, not in the main baseline's validation pass)
agc_gpu_draw_stage_timing_key
Validation IDs already present on main (8 IDs in 532 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (532 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 524 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_srgb8_color_target
VUID-VkSamplerCreateInfo-addressModeU-01079 (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeU-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeV-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeW-parameter (1 test): agc_driver_image_gather_volume
Skipped (50)
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_gcn_display_present: skipped, no display: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
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_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
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_driver_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
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
vide
Reproduce
git fetch origin be736b2f0a22750a38807bf9aa91943169de8f3b 1c8c0efc8c41314402e6966da5bef6ea3d639d10
git checkout 1c8c0efc8c41314402e6966da5bef6ea3d639d10 && git merge --no-ff be736b2f0a22750a38807bf9aa91943169de8f3b
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.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head be736b2 merged onto main 1c8c0ef · tested 2026-11-04 07:16 UTC · 45 min

GPU AMD Radeon RX 6300 (RADV NAVI24), driver Mesa 25.2.8-0ubuntu0.24.04.4, Vulkan 1.4.318
Host Ubuntu 26.04.1 LTS, kernel 7.0.0-42-generic, container ubuntu:24.04
Logs build and test logs for this run
Build ✅ passed (Release, -DANYPS5_ENABLE_SPIRV_TOOLS=ON)
Tests ✅ 2,773 passed · 8 failed (0 new, 7 also fail on main, 1 unstable on main) · 60 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,841 of 3,842 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 (953 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.3 s, ⚠️ public_headers 70.0 s, ⚠️ agc_driver_sample_multisample_target 39.6 s, ⚠️ agc_driver_image_sample_unnormalized 35.3 s, ⚠️ agc_shader_sampler_limits 33.7 s
Unstable on main (1, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 8 of the last 10 main runs
Failing on main too (7, not counted against this PR)
agc_driver_image_table
agc_driver_native_depth_bda_clear
agc_driver_native_multisample_depth
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (1, not in the main baseline's validation pass)
agc_gpu_draw_stage_timing_key
Validation IDs already present on main (8 IDs in 532 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (532 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 524 more
VUID-vkCmdCopyImage-srcImage-01548 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-vkCmdCopyImage-srcImage-01551 (4 tests): agc_driver_depth_clear_hle, agc_driver_depth_storage_dispatch, agc_driver_depth_surface_from_storage, agc_driver_dispatch_move_depth
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (1 test): agc_driver_srgb8_color_target
VUID-VkSamplerCreateInfo-addressModeU-01079 (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeU-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeV-parameter (1 test): agc_driver_image_gather_volume
VUID-VkSamplerCreateInfo-addressModeW-parameter (1 test): agc_driver_image_gather_volume
Skipped (60)
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_copied_writer_label_order: skipped, the device reports a minStorageBufferOffsetAlignment of 4, so the dispatch binds its record at +0x1004 in place and nothing is written back; the test needs an alignment above 4
agc_driver_float16_unused_nan_payloads: skipped, the device has no native f16 conversions with RTE rounding and kept f16 denormals
agc_driver_gcn_display_present: skipped, no display: Vulkan support is either not configured in SDL or not available in current SDL video driver (offscreen) or platform
agc_driver_image_table_vouched_lookups: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a watched imported table cannot be vouched for
agc_driver_linear_target_direct_write_completion: skipped, the device does not keep host imports write-watched, so no completion stamp over the target is tracked
agc_driver_ngg_vertex_wave_reduction: skipped, s3 describes a 32-lane wave only on 32-lane subgroups, and the device has 64 lanes
agc_driver_scattered_runs: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_sparse_dma_buf_import: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_driver_unit_shadow: skipped, the device does not import watched host memory for unit shadows
agc_driver_unit_shadow_budget: skipped, the device does not import watched host memory for unit shadows
agc_driver_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
agc_host_import_sparse: skipped, host imports are unavailable: /dev/udmabuf is not accessible
agc_idle_publish_wait: skipped, the device reports 4 of 4 host-imported pages written after a GPU read, so a forced watch of the import reads its submissions as CPU stores
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_shadowed_key_stores: skipped, the device imports no watched host memory under a unit shadow
agc_small_tiled_shadow_label: skipped, host imports are unavailable: the test block is not imported and watched
agc_storage_clear_hand_over: skipped, the device imports no watched host memory for the clear-key hand-over
agc_unit_shadow: skipped, the device does not import watched host memory for unit shadows
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 SD
Reproduce
git fetch origin be736b2f0a22750a38807bf9aa91943169de8f3b 1c8c0efc8c41314402e6966da5bef6ea3d639d10
git checkout 1c8c0efc8c41314402e6966da5bef6ea3d639d10 && git merge --no-ff be736b2f0a22750a38807bf9aa91943169de8f3b
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 12 --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 16 --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 AMD machine; it does not replace upstream CI. A new comment is posted for each new push. Full logs.

@JJenkx

JJenkx commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor Author

Combined native smoke on Linux/RADV, 2026-11-06: private main 7513ca5e585 + #14794 + this PR, integration 3bb879a69761aa5a9cb30ecc56f17ccc8a2ca1ff. This qualifies their combination, not each PR independently.

  • Full SDK/relinker and replay tools built; 10 focused capture/cache/timing cases passed with no skips, failures or VUID- errors. The suite used ANYPS5_REQUIRE_VULKAN=1, cache disabled and the Khronos validation layer; host-only cases are included in that count.
  • The Pathless (PPSA01826) fixed title-menu diagnostic ran on AMD RX 6650 XT with GPU draw/stage profiling and graphics request capture enabled. Ordinary close after 362.3 s; native and harness exits both 0. Frozen SDK and protected inputs unchanged, kernel setting restored, no private native process left.
  • Captured 125 request files (2,288,356 bytes), 120 variant mappings and 74 complete draw-stage groups. Timing output contains drawset keys. The hottest sampled group includes mesh + fragment stages, which avoids interpreting a fragment key as isolated fragment cost.
  • Six shaders selected from the three hottest sampled groups pass both preparation/materialization and full CPU recompilation (12 mode runs). All six generated SPIR-V modules pass standalone spirv-val --target-env vulkan1.3.

Limits: profiling/capture changes timing; the range cap drops samples and the top-list truncates groups. No FPS gain, isolated-stage cost, gameplay or audio claim. Requests deduplicate by code address, so exact specialization equality with every timed variant is not established. Format 53 also omits some target fields (including robustness settings; tracked by existing #15458 and #9508). Thus these offline counts/validation results are not proof of the native variant’s exact generated SPIR-V. A fidelity-preserving private capture is needed for that comparison.

Compact settings and result receipt, SHA-256 c6110637e8a8974d3edc3fc562209d194cb9e4b238adbad296511b601ca2ca71 (download verified). Contains only report metadata and commands; no game requests, memory, code or assets.

Follow-up fidelity check: a fresh private integration c057923bf6217332b6f71431375ea7db574f6b38 adds the existing all-eight-field diagnostic codec to the same base/features (private format 54; not wire-compatible with the two-field format 54 proposed by #15458). Both control and change pass the same five serializer/shader-memory/prepared-graphics/replay checks, zero skips and no VUID errors. A new 362.3 s native menu capture exits with code 0 and yields 128 requests / 76 stage groups; cleanup and frozen inputs verified. Six selected shaders again materialize/recompile and pass standalone SPIR-V validation.

The captured native target has robustBufferAccess2=true, fixedPushSlots=true, maxImageArrayLayers=8192. A controlled CPU projection of each same request back to format 53 changes all six outputs: for example, the largest sampled group's fragment is 32,856 words with retained settings versus 35,462 with restored version 53 defaults. These are diagnostic code-size differences, not an FPS improvement or proof of exact timed specialization equality. Raw requests/code remain private.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants