Skip to content

feat(tools): run the Vulkan validation gate on Windows - #12038

Merged
adriadam10 merged 3 commits into
boykopovar:mainfrom
Inevitable-Design:feat/validation-gate-windows
Nov 6, 2026
Merged

adriadam10 merged 3 commits into
boykopovar:mainfrom
Inevitable-Design:feat/validation-gate-windows

Conversation

@Inevitable-Design

@Inevitable-Design Inevitable-Design commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

What

tools/vulkan_validation_gate.py refused to run on Windows because it had no way to contain a command's process tree. On Windows, each configure, build and CTest command now starts suspended (CREATE_SUSPENDED), joins a new job object, and only then has its thread resumed, so none of its descendants can start outside the job. When the command exits or times out, the job is terminated, as killpg does for the process group on POSIX. The POSIX path is unchanged.

CTest runs also get VK_LOADER_DEBUG=layer, and a selected test now passes only if its output contains the loader's Insert instance layer "VK_LAYER_KHRONOS_validation" line. Before, a run without the layer could report clean: the loader ignores VK_LAYER_PATH in an elevated process (exception for elevated privileges) and then prints no missing-layer message. report.json records layer_inserted for each test.

The synthetic fixture tests were skipped on Windows; they now run there as well. Two Windows fixes in the tests:

  • The fixture CMakeLists.txt takes the Python path with forward slashes, because backslashes are escapes in CMake strings.
  • The test that pinned the Windows refusal is removed.

The fixture program prints the loader's insertion line unless a test turns it off. New tests in ReportTests and LayerTests cover output with and without the line.

Each fixture test builds two CMake fixtures and takes about 2.5 s on Windows. To keep every CTest group under 30 s on the Windows runners, the two fixture groups are split into eight: new TimeoutTests, ValidationTests, LayerTests, OutputTests, SetupTests and CommandTests classes, registered in CMakeLists.txt. No existing test body changes.

docs/dev/BUILD.md now describes the containment on both platforms instead of the Windows refusal, and the insertion-line requirement.

Basis: Job Objects, AssignProcessToJobObject, Thread32First.

Tested

Windows 11 Home (26300), Python 3.13.9, WinLibs GCC 15.2.0, CMake 4.3.1, Ninja.

Current head b516ccdc03: main 096c45570f merged in (only conflict: the removed Windows refusal test next to the new relative-executable test), then the #11809 timeout tests moved into TimeoutTests.

  • tools/tests/test_vulkan_validation_gate.py, all nine classes: 32 tests pass, none skipped. With a relinker-only configure (-DANYPS5_RELINKER_ONLY=ON -DBUILD_TESTING=ON), ctest -R '^vulkan_validation_gate_' --parallel 4 passes 9 of 9 groups; the slowest takes 9.9 s.
  • CI timing estimate: check_main_sync, configure_seed, configure_seed_round_trips and debt_split run 1.25 to 2.5 times faster on this machine than in the latest Windows CI job. At 2.5 times, the slowest group takes about 25 s there.
  • The Windows relinker job, reproduced locally on c893d2c747 (before the split) merged into main 4f41f4c375: relinker-only build, ctest --output-on-failure --timeout 120 --parallel 4, 689 of 689 pass. vulkan_validation_gate_integration took 13.6 s there with the timeout tests in it, so they now run as their own group.
  • tools/check_conventions.py --base 4f41f4c375 passed.

Earlier, on d992ee4c6e (main d13b3d7c55). The containment code is unchanged since 9f4735ddd8, where the containment negative control and the Linux run() check were run.

  • Negative control for the layer check: with not inserted removed from the failure condition, both new tests fail.
  • Negative control for containment: I replaced run() with a plain Popen that kills only the direct child. test_command_cleanup_removes_descendant_after_parent_exit_and_timeout then fails in both subtests, because the grandchild outlives the command.
  • Linux (WSL Ubuntu 24.04, Python 3.12.3): ReportTests pass. run(), called directly, kills a grandchild after both a timeout and a normal exit. The fixture tests were skipped there because CMake and Ninja are not installed.
  • End to end on hardware, RTX 5080 (NVIDIA 617.42), Vulkan SDK 1.4.363.0, Windows:
    • --baseline is main 801d5b9bc1; --candidate is fix(shader): load and store 16-bit data of converted packed images #11580 merged onto that main (a16d5cc761).
    • Options: --target agc_driver_image_converted_unorm_tests --target agc_driver_image_packed16_load_tests --tests '^agc_driver_image_(converted_unorm|packed16)' --gpu NVIDIA --repeat 4 --runtime core/libs/libs/unpatched, plus --cmake-arg for gcc, g++ and the Python path.
    • Result: status complete, exit 0, 5 tests with 4 iterations per build, and no new diagnostics. layer_inserted is true for every test in all 8 iterations. Every test log selected the RTX 5080, and no process was left running. The run took 8.6 min, including both builds.
  • tools/pr_overlap.py --branch feat/validation-gate-windows reported no overlap with other open PRs; the seven conflicting PRs it could not compare don't touch the gate.

Not run: the fixture tests on Linux or macOS (left to CI), the hosted Build workflow, an elevated process (the loader behaviour is from the report in this PR's comments and the loader documentation), and the end-to-end hardware run on the current head.

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: n/a (host tool); the end-to-end run above used an NVIDIA RTX 5080, driver 617.42, Windows 11
  • AI-assisted: yes

@github-actions

github-actions Bot commented Oct 27, 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 1835 CMakeLists.txt
docs/dev/BUILD.md
PR 5021 CMakeLists.txt
docs/dev/BUILD.md
PR 10193 CMakeLists.txt
PR 11435 docs/dev/BUILD.md
PR 11436 docs/dev/BUILD.md
PR 13486 CMakeLists.txt
PR 13578 CMakeLists.txt
PR 13928 CMakeLists.txt
PR 13929 CMakeLists.txt
PR 14137 docs/dev/BUILD.md
PR 14212 CMakeLists.txt
PR 15136 docs/dev/BUILD.md
PR 15953 CMakeLists.txt

@ycbuzi

ycbuzi commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

One Windows case the gate can't see yet: an elevated process. The loader documents that "VK_LAYER_PATH, VK_ADD_LAYER_PATH, VK_IMPLICIT_LAYER_PATH, and VK_ADD_IMPLICIT_LAYER_PATH are ignored if running with elevated privileges" (LoaderLayerInterface.md, Windows Layer Discovery). When the Khronos layer is found only through VK_LAYER_PATH (a copy-only SDK, as PUBLIC_ENV passes through), it then doesn't load, and with no VK_LOADER_DEBUG the loader doesn't print was not found but was requested by env var VK_INSTANCE_LAYERS either. parse_report gets no VUID- lines and no MISSING_LAYER line, so the run reads as clean.

Measured with a build of 406bf3fdc2 (#11483 on main 48c160c58b; the loader behaviour doesn't depend on the tree), Windows 11 Home 26200, Vulkan SDK 1.4.363.0 layer through VK_LAYER_PATH only, VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation, RTX 4070 SUPER, ctest -R ^agc_driver_f64_fma_subnormals$ -V:

process VK_LOADER_DEBUG was not found but was requested Insert instance layer "VK_LAYER_KHRONOS_validation"
Administrator unset 0 (not printed)
Administrator layer 2 0
not elevated (started via explorer.exe) layer 0 1

The test passes in all three, so only the loader lines tell them apart. Two ways to close it, either enough: refuse to run on Windows when elevated (ctypes.windll.shell32.IsUserAnAdmin()), or set VK_LOADER_DEBUG=layer for the CTest runs and require an Insert instance layer "VK_LAYER_KHRONOS_validation" line in each test's output. The second also catches a layer that's missing for other reasons. I haven't checked whether the hosted Windows runners execute elevated.

AI-assisted: yes (Claude Code)

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed exact head 69eae14b73c9d10dd30a884adf5eea7f20feadfa and the new Windows elevated-process report. That report identifies a real false-clean path in the tool's primary guarantee.

parse_report currently rejects VUID/SYNC diagnostics and the loader's “was not found but was requested” message, but it never verifies that VK_LAYER_KHRONOS_validation was actually inserted. The official Vulkan Loader documentation says all four VK_*_LAYER_PATH discovery variables are ignored when the application runs with elevated privileges: https://github.com/KhronosGroup/Vulkan-Loader/blob/main/docs/LoaderLayerInterface.md#exception-for-elevated-privileges . The reported Windows run shows that, when the validation layer is available only through VK_LAYER_PATH, it can therefore be absent without the warning this parser relies on. The gate may then report a clean run with no validation layer active.

Please make layer activation observable and required for every selected test, for example by forcing VK_LOADER_DEBUG=layer and having parse_report require the loader's insertion message for VK_LAYER_KHRONOS_validation (with regression tests for both present and absent messages). Refusing elevated Windows runs is another safe option, but must also be covered by tests. Until this is fixed, the gate can claim validation coverage it did not execute, so I am requesting changes.

@Inevitable-Design
Inevitable-Design force-pushed the feat/validation-gate-windows branch from 69eae14 to d992ee4 Compare October 27, 2026 19:32
@Inevitable-Design

Copy link
Copy Markdown
Contributor Author

Thanks, both. Fixed in d992ee4c6e (also rebased onto main d13b3d7c55):

  • CTest runs now get VK_LOADER_DEBUG=layer. It is forced like the other required variables, so a test property can't override it.
  • parse_report fails any selected test whose output lacks Insert instance layer "VK_LAYER_KHRONOS_validation", and report.json records layer_inserted per test.
  • Regression tests: ReportTests.test_a_test_without_the_layer_insertion_line_is_not_a_success (the line, another layer's line, no line) and LayerTests.test_ctest_success_without_layer_insertion_is_a_gate_failure (CTest passes, the gate exits 1). Both fail with the check removed.
  • End to end on the RTX 5080, every test in all 8 iterations had the line, and the run completed with exit 0.

I haven't reproduced the elevated case myself. The PR description is updated.

@THEMANnt THEMANnt left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed d992ee4c6e26cd1512a62ce8a42736a44860cb74 — comment; validation remains incomplete. Windows containment and validation-layer attribution pass the focused suite, but current-head hosted Build still awaits authorization.

Windows/Python 3.11: 25/25 tests passed, including real child-process exit/timeout cleanup, source/artifact guards, and rejection of a CTest success without the insertion line or with validation diagnostics. The author base runs 24 cases with 18 POSIX-only skips. Old-production API errors are not behavioral regression proof. These integration fixtures simulate Vulkan output; I did not run a physical-GPU comparison. Complete the authorized hosted check before final approval.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewing exact head d992ee4c6e26cd1512a62ce8a42736a44860cb74 against current main 319621ba2e578bd053b0baba2877fe70520e0737.

What I ran

  • git diff --check against current main: passed.
  • git merge-tree --write-tree against current main: clean merge tree (f2376e0c60664cf5fef23081f222ea49e3af0476).
  • Extracted this exact head's tools/vulkan_validation_gate.py and tools/tests/test_vulkan_validation_gate.py into a temporary directory and ran the full focused Python suite on Linux: 25/25 passed.
  • Inspected the Windows Job Object/process-launch code, test changes, and hosted checks. Windows, relinker platform matrix, ASan, register-context, write-watch, conventions, labels, report, and eligibility passed; hosted Linux was skipped.
  • I did not run the Windows-specific path locally. The Windows job result is from hosted CI.

Results

Check Result Evidence
Patch whitespace Pass Local git diff --check against current main
Mergeability Pass Local merge-tree against current main
Focused Python tool tests Pass 25/25 on Linux, from the exact PR head
Hosted Windows / relinker / sanitizer / conventions Pass GitHub Actions for this head
Hosted Linux build Skipped GitHub Actions
Windows Job Object runtime behavior Not independently reproduced Windows hosted check passed; my local suite ran on Linux

Findings

Blocking

  • The branch is no longer based on current main. Its merge base is d13b3d7c55a433c7a5040076d849dbe59fad4b53; current main is 319621ba2e578bd053b0baba2877fe70520e0737 (1,135 commits ahead of this branch). CONTRIBUTING.md requires one branch per topic based on current main. The merge preview is clean and the new layer-insertion check addresses the prior false-clean finding. Please update/rebase onto current main and rerun the focused Python suite and Windows validation on the resulting head before merge.

Sources

Not verified

  • I did not execute the Windows Job Object code locally.
  • The end-to-end RTX 5080 result is author-reported; I did not reproduce the elevated Windows case.
  • The branch's hosted Windows result predates rebasing onto current main.

To get this to a good state

Rebase/update onto current main 319621ba2e578bd053b0baba2877fe70520e0737. Then rerun the focused Python tests and the Windows validation-gate path on that head, confirming that each selected test logs actual insertion of VK_LAYER_KHRONOS_validation and that process descendants are terminated on normal completion and timeout.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewing exact head d992ee4c6e26cd1512a62ce8a42736a44860cb74 against main.

What I ran

  • git diff --check against current main: passed.
  • git merge-tree --write-tree against current main: clean merge tree (f2376e0c60664cf5fef23081f222ea49e3af0476).
  • Extracted the exact PR-head tool and test files to a temporary directory and ran the focused Python test file on Linux: 25/25 passed.
  • Reviewed the Windows process containment and validation-layer reporting changes. The author reports all 25 tests passing on Windows, all eight CTest groups passing, plus an end-to-end hardware run; the GitHub Build workflow was not run for this PR, while conventions and labels pass.

Results

Check Result Evidence
Patch whitespace Pass Local git diff --check
Mergeability Pass Local merge-tree
Focused Python tool tests Pass 25/25 on Linux, exact PR-head files
Windows Python tests and CTest groups Pass, author-reported 25 tests and 8/8 CTest groups on Windows, exact head
End-to-end Vulkan gate Pass, author-reported RTX 5080; all eight iterations logged actual layer insertion, no new diagnostics, no surviving processes
Hosted Build workflow Not run Only conventions and labels ran in GitHub Actions

Findings

Blocking

None.

Non-blocking

None. The earlier false-clean case is covered by requiring the loader's instance-layer insertion message per selected test. The Windows path assigns a suspended process to a Job Object before resuming it; the reported Windows descendant-cleanup negative control and end-to-end run provide useful coverage.

Sources

Not verified

  • I did not execute the Windows Job Object code locally.
  • The Windows suite and hardware run are author-reported; only the 25-test Linux run was independently reproduced here.
  • GitHub's Build workflow did not run on this PR.

To get this to a good state

No blocking issue remains in the reviewed change. The Windows-specific behavior has direct author-run coverage and the complete Python suite passes locally on Linux.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head b516ccd merged onto main 4f41f4c · tested 2026-11-03 16:29 UTC · 16 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 ✅ 3,741 passed · 16 failed (0 new, 13 also fail on main, 3 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
Vulkan validation ✅ no new validation IDs vs main (1350 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.5 s, ⚠️ agc_driver_graphics 103.7 s, ⚠️ agc_driver_graphics_maps_fallback 102.4 s, ⚠️ agc_driver_bda_device 44.7 s, ⚠️ agc_driver_lazy_resolved_abi_switch_set 44.4 s
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_pipeline_journal: failed in 7 of the last 9 main runs
agc_driver_store_over_untracked: failed in 1 of the last 9 main runs
agc_driver_two_sample_alpha_to_coverage_sample_mask_export: failed in 1 of the last 9 main runs
Failing on main too (13, not counted against this PR)
agc_driver_alpha_to_coverage_sample_mask_export
agc_driver_guest_memory_lifetime_direct
agc_driver_image_table
agc_driver_job_manager_compute_capacity
agc_driver_native_depth_bda_clear
agc_driver_native_depth_buffer_clear
agc_driver_native_depth_clears
agc_driver_native_multisample_depth
agc_driver_submit_progress
agc_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Validated but not compared (6, not in the main baseline's validation pass)
vulkan_validation_gate_commands
vulkan_validation_gate_layers
vulkan_validation_gate_output
vulkan_validation_gate_setup
vulkan_validation_gate_timeouts
vulkan_validation_gate_validation
Validation IDs already present on main (4 IDs in 769 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (769 tests): agc_compute_pipeline_replay, agc_driver, agc_driver_address_passes, agc_driver_address_passes_draw_transitions, agc_driver_address_passes_targets_split, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_alpha_to_coverage_sample_mask_export, and 761 more
VUID-vkCmdCopyImage-srcImage-01548 (12 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 4 more
VUID-vkCmdCopyImage-srcImage-01551 (12 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 4 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, agc_driver_srgb8_color_target
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_copied_writer_label_order_drain: 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_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 i
Reproduce
git fetch origin b516ccdc035d34ebe2e26e95c4928fd5f71c1b8f 4f41f4c375f5abb487dbd184fbc150f31994d762
git checkout 4f41f4c375f5abb487dbd184fbc150f31994d762 && git merge --no-ff b516ccdc035d34ebe2e26e95c4928fd5f71c1b8f
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.

@Inevitable-Design

Copy link
Copy Markdown
Contributor Author

Could a collaborator start the Build workflow for this PR when there's a slot? The change only touches tools/, CMakeLists.txt and docs/, so the relinker matrix covers it:

gh workflow run build.yml --repo boykopovar/AnyPS5 --ref main --field pr=12038 --field full=false

Head b516ccdc03 still merges cleanly into main e772fb25cc, and the 32 gate tests pass on that merge on Windows.

@DonRyuzaki

Copy link
Copy Markdown
Contributor

I ran the current head b516ccdc Windows validation gate end to end on an RX 7800 XT, merged locally with main d23df92b as a44d5ea. This fills the current-head hardware gap left in the description; the earlier RTX 5080 gate run was on another head. With two clean pinned Release builds and agc_driver_image_packed16_storage_133 selected twice per side, report.json ended complete, exit 0, with no new diagnostics. All four CTest executions passed, and every log shows both Selected GPU name=AMD Radeon RX 7800 XT and the loader inserting VK_LAYER_KHRONOS_validation (layer_inserted=true). The older layer emitted six VUID-VkDeviceCreateInfo-pNext-pNext messages on each side in each iteration (12 baseline, 12 candidate); this is matching existing validation noise, not zero VUIDs. The nine gate-fixture CTest groups also passed locally. The run is pinned to main d23df92b; main advanced afterward to 4180951e with separate CesCs/libkernel_sys merges. Scope is one AGC test, not the full GPU suite, a game, or an elevated-process check. AI-assisted: yes.

@adriadam10
adriadam10 merged commit 75a1ced into boykopovar:main Nov 6, 2026
12 checks passed
@adriadam10

Copy link
Copy Markdown
Collaborator

Re-checked after the red Build: the linux job failed in actions/checkout (git exit 128), not in the diff; rerun. Job-object containment, forced VK_LOADER_DEBUG=layer with the required insertion line per test, and the nine CTest groups (each test class registered once) are unchanged from the earlier review; merged.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants