Skip to content

fix(agc): leave the uncompressed key store out when the guest replaced the keys by another clear code - #16411

Open
SleglJan wants to merge 3 commits into
boykopovar:mainfrom
SleglJan:fix/agc-dcc-keys-replaced-by-clear
Open

SleglJan wants to merge 3 commits into
boykopovar:mainfrom
SleglJan:fix/agc-dcc-keys-replaced-by-clear

Conversation

@SleglJan

@SleglJan SleglJan commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

What

A storage image uploaded under fast-clear DCC keys stores uncompressed keys (0xff) at its first GPU write and at its write-backs. Whether the keys still are that clear kind is decided earlier, by the lookup, which can answer in three ways without seeing a guest write that landed after the thread's earlier collect of the key range in the same collect epoch: from the memoized collect behind the key proof, from the refresh's own proof, and, with APS5_DRAW_PIPELINE, inside the epoch of the last proof with no collect at all.

When the guest replaced the keys by another clear code in that window, the lookup keeps the image as uploaded under the old code, and the first write's store then puts uncompressed keys over texels taken under the replaced code. Where main sees such a write it honours the guest's code in either order. A lookup that sees it before the first write takes the image under the new code (as stored for the register clear code, whose keys stay): the order "clear before the draw". Once an image holds results, a fixed clear code written over them wins ("new keys that are a clear code make every result dead on hardware too", the comment over droppable in StorageTexture::refresh, for images tracked in 64 KiB units), and the register clear code stays in memory once the first write has stored its keys: the order "clear after the draw". Here the store covers the guest's code, which neither order gives outside the two cases below. This PR gives the second.

For a fixed clear code main's result is still the first order in two cases: the first write covers every texel of the surface, or the two codes decode to the same texels for the surface's format. There this PR gives the other order, the guest's clear after the draw.

  • test(agc): six modes of the agc_driver_dcc_keys_first_write_tests executable. Each uploads an image under 0000 keys in a watched block, collects the keys, lets the guest write in the same collect epoch, looks the image up again (the step requires that the lookup kept the clear keys) and marks it written. Each step also requires the path that answers that lookup, read through the driver library (StorageTexture::RefreshesProved() and the thread's RefreshProved lookup outcome): neither moves for a refresh under the memoized collect, both rise by one for the refresh's own proof, and RefreshesProved() alone rises for an answer inside the epoch of the last proof.
    • agc_driver_dcc_keys_rewrite_after_memo: every key replaced by another clear code (1111); the lookup is answered by the memoized proof.
    • agc_driver_dcc_keys_rewrite_after_refresh_proof: the same, the lookup answered by the refresh's own proof (required by the step).
    • agc_driver_dcc_keys_rewrite_after_epoch_proof: the same, the lookup answered inside the epoch of the last proof (required by the step; APS5_DRAW_PIPELINE=1).
      On main these three fail with AGC graphics: a storage image's first write stored uncompressed keys over keys the guest had replaced by another clear code after a memoized collect: 0 of 256 key bytes are 0xc0 (key 0 is 0xff).
    • agc_driver_dcc_keys_rewrite_to_register_clear: every key replaced by the register clear code. On main it fails with AGC graphics: a storage image's first write stored uncompressed keys over keys the guest had replaced by the register clear code after a memoized collect: 0 of 256 key bytes are 0x20 (key 0 is 0xff).
    • agc_driver_dcc_keys_partial_rewrite_keeps_store: half of the keys replaced. The half the guest did not touch must read uncompressed after the first write. The rewritten half is not checked (see Limits).
    • agc_driver_dcc_keys_write_beside_keys_keeps_store: a guest write beside the keys, in their page. Every key must read uncompressed after the first write.
      These two pass on main and with the fix.
      The steps run with APS5_NO_HOST_IMPORT=1, because an upload's host import ends the write watch over the test's block; every skip prints its reason.
  • fix(agc): the check is made at the store. StorageTexture::keysReplacedByClear runs in MarkDirty and at the three write-back stores. It answers yes only when the proved key count is the stored key count, a key proof for the uploaded kind exists, the caller holds the device lock, no recorded work writes the keys, the guest wrote the key range since the proof (GuestMemory::CpuWroteSince, new: the uncached collect and CPU-stamp compare of UnchangedSinceCollected, answering "no" where it cannot tell), and the keys read again as another clear code (0000, 0001, 1110, 1111 or the register clear). Then the store is left out and the guest's clear stands.

Limits:

  • A partial rewrite keeps the store, as main does when its lookup misses the write. When main sees a partial rewrite it reads the mixed keys as uncompressed and stores nothing, so the guest's keys stay; for a given image, texture reads take its stored texels whether the keys are uncompressed or mixed. The store is kept here so that a later CB metadata pass does not meet mixed keys, which it refuses ("per-block metadata is not modeled"). Neither result is the per-key one of the order "clear after the draw", the guest's code on the keys it wrote and uncompressed keys on the rest; a store per key is not attempted here.
  • Keys replaced by the single-colour kind keep the store, and so do surfaces whose stored key count exceeds guestBytes / 256 (single-level pipe-aligned R64KBX with 4-byte elements). For element sizes that do not divide 256 main reads single-colour keys as uncompressed and leaves them in place where it sees them; here the store covers them.
  • Register clear keys left in memory are read as on main: texture reads take the stored texels, and only the colour-target path applies the guest's clear.
  • The check needs a write-watched key range. Keys in host-imported memory that is compared, not watched, have no proof generation and keep the store.
  • The three write-back stores share the check and have no step of their own: in the steps MarkDirty has already taken the image out of its clear kind when the write-back runs.
  • ProvedCurrentDccKeys (the register clear's proof) has the same window and is not changed here.

Cost: one uncached collect of the key range per first write, and per write-back store that finds the image still under its clear kind, of an image that has a proof for its uploaded kind and no key tail; a read of the keys only when that collect finds a CPU write.

Related: #6209 (open) changes ProvedCurrentDccKeys and ProvedClearKeys, which this PR does not touch. #6186 (open) keeps CPU stores made after a deferred key store was recorded, the window after this one.

Tested

Head 5287cda is this PR's three commits on upstream/main 3bd88ca (the third, test only, came after review: see the thread). The runs below are clean merges onto main 9f2b939: main + the two test commits, main + the head, and main + the head + the head of #15456.

  • Linux (CachyOS, kernel 7.2.10), Release, GCC 16.2.1, write watch available. ctest -V -R '^agc_driver_dcc_key' with VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation ANYPS5_NO_SHADER_CACHE=1 ANYPS5_REQUIRE_VULKAN=1, on an AMD Radeon RX 9070 XT (RADV GFX1201, Mesa 26.2.4) and on lavapipe (llvmpipe, LLVM 23.1.1, Mesa 26.2.4). The pattern matches the six new steps and the two existing key tests, agc_driver_dcc_keys_first_write and agc_driver_dcc_key_presync.
    • main + the two test commits: on both drivers the four rewrite steps fail with the lines above, and they are failures, not skips; no step stops at a path check; the two keep-store steps and the two existing tests pass. No VUID-.
    • main + the head: all eight pass on both drivers, none skipped. No VUID-.
    • main + the head + the head of perf(agc): run the draw finisher by default #15456 (6330546, where the draw pipeline is on unless APS5_NO_DRAW_PIPELINE is set): all eight pass on both drivers, none skipped. No VUID-.
    • On both drivers and all three trees the loader's debug log shows VK_LAYER_KHRONOS_validation inserted; no log reports was not found but was requested by env var VK_INSTANCE_LAYERS.
  • ctest -R '^agc' on the RX 9070 XT, without the validation layer, main + the head: 1 of 1352 fails, agc_driver_tessellation (segmentation fault), and 23 tests skip. On the earlier head b04dc41 over main 3bd88ca: 5 of 1349 failed with the test commit alone and 1 of 1349 with the fix; the four rewrite steps were the only difference in the failed list, with the same failing test and the same 23 skipped names as now.
  • Windows: not run by me. On b04dc41 the epoch step failed there (JJenkx's run in this thread), by the code because the test read a header-defined counter across the library boundary; 5287cda reads through the library instead.
  • python3 tools/check_conventions.py --base upstream/main: passes.

No title effect 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 9070 XT (RADV GFX1201), Mesa 26.2.4, Linux (CachyOS, kernel 7.2.10); lavapipe (llvmpipe, LLVM 23.1.1), Mesa 26.2.4, same host
  • AI-assisted: yes (Claude Code)

🤖 Generated with Claude Code

SleglJan and others added 2 commits November 6, 2026 15:40
…oss a storage image's first write

Six modes of agc_driver_dcc_keys_first_write_tests. Each uploads a storage image under 0000 keys in
a watched block, collects the keys, lets the guest write in the same collect epoch, looks the image
up again (the lookup must keep it under its clear keys) and marks it written, which stores
uncompressed keys:
- agc_driver_dcc_keys_rewrite_after_memo: every key replaced by another clear code; the lookup is
  answered by the memoized key proof;
- agc_driver_dcc_keys_rewrite_after_refresh_proof: the same, the lookup answered by the refresh's own
  proof (required by the step);
- agc_driver_dcc_keys_rewrite_after_epoch_proof: the same, the lookup answered inside the epoch of the
  last proof (required by the step; APS5_DRAW_PIPELINE=1);
- agc_driver_dcc_keys_rewrite_to_register_clear: every key replaced by the register clear code;
  in these four the guest's keys must still be in memory after the first write;
- agc_driver_dcc_keys_partial_rewrite_keeps_store: half of the keys replaced; the half the guest
  did not touch must read uncompressed after the first write;
- agc_driver_dcc_keys_write_beside_keys_keeps_store: a guest write beside the keys in their page;
  every key must read uncompressed after the first write.

The steps run with APS5_NO_HOST_IMPORT=1: an upload's host import ends the write watch over the test's
block. Every skip names its reason. An unknown mode on the command line is an error.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d the keys by another clear code

A storage image uploaded under fast-clear keys stores uncompressed keys at its first GPU write and at
its write-backs. Whether the keys are still that clear kind is decided earlier, by a lookup that can
answer from a memoized collect, from the refresh's own proof, or inside the epoch of its last proof
without collecting at all. When the guest replaced the keys by another clear code in between, the
image stays the one uploaded under the old code, and its store then puts uncompressed keys over
texels taken under the replaced code. Where the driver sees such a write it honours the guest's
code in either order. Seen before the first write, the image is taken under the new code (as stored
for the register clear code, whose keys stay). Seen once the image holds results, a fixed clear code
written over them wins ("new keys that are a clear code make every result dead on hardware too", for
images tracked in 64 KiB units), and the register clear code stays in memory once the first write has
stored its keys. Here the store covers the guest's code, which neither order gives outside the two
cases named below; this change gives the second.

The check is made at the store. When the proved key count is the stored key count, a key proof for
the uploaded kind exists, the caller holds the device lock and no recorded work writes the keys, the
key range is collected uncached; if the guest wrote it since the proof and the keys now read as
another clear code (0000, 0001, 1110, 1111 or the register clear), the store is left out and the
guest's clear stands. Any other reading of the keys (mixed, uncompressed, single) keeps the store,
and so does a write to other data in the keys' page.

For a fixed clear code, where the first write covers every texel or the two codes decode to the same
texels, the result without this change is still the first order, and the result with it is the
second.

GuestMemory::CpuWroteSince is the uncached collect and CPU-stamp compare of UnchangedSinceCollected
with the answer "no" where it cannot tell (no write watch, a failed collect, a generation of 0).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@github-actions github-actions Bot added build agc libSceAgc* labels Nov 6, 2026

@milescoviello milescoviello 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.

One interaction with #15456 (the draw finisher by default), which edits neither file, so nothing will flag it as an overlap. On #15456's head ShaderResources::EpochProofs() returns DrawPipelineEnabled(), and that is true unless APS5_NO_DRAW_PIPELINE is set. Once it lands, every mode here runs with epoch proofs. --rewrite-after-memo and --rewrite-after-refresh-proof can then be answered by the epoch proof instead of the memoized collect or the refresh's own proof. Their names and the description would no longer match the path they test, while --rewrite-after-epoch-proof still passes. Setting APS5_NO_DRAW_PIPELINE=1 on the five non-epoch modes (and dropping APS5_DRAW_PIPELINE=1 from the epoch mode) would keep each mode on its own path, whichever of the two lands second.

The rest reads right to me: keysReplacedByClear only keeps the store off when the guest wrote the keys since the key proof's generation, nothing recorded is pending over them, and what they hold now is a different clear code.

AI-assisted: yes (Claude Code)

@JJenkx

JJenkx commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Windows check of head b04dc41f0a, merged onto main (8fa2f2f888 and again on d78531d356; clean merges).

Setup: Windows 11 Enterprise 22621, WinLibs GCC 15.2 UCRT, Release, Radeon RX 6700 XT, AMD driver 26.10.1. Run through the Windows test queue with ANYPS5_REQUIRE_VULKAN=1 and Vulkan validation layers 1.4.363. The hosted Windows check does not run these GPU tests on pull requests.

agc_driver_dcc_keys_rewrite_after_epoch_proof, one of the tests this PR adds, fails on Windows in 3 of 3 runs on each merge, with agc_driver_dcc_keys_first_write_tests rebuilt from the merge each time:

AGC graphics: keys written after a memoized collect: the lookup after the key write was not answered inside the epoch of the last proof

The other six tests in the group pass in 3 of 3 runs: agc_driver_dcc_keys_first_write, _rewrite_after_memo, _rewrite_after_refresh_proof, _partial_rewrite_keeps_store, _write_beside_keys_keeps_store and _rewrite_to_register_clear. There were no VUID- errors.

The Vulkan device was created in each run. Write watching differs on Windows: guest memory uses MEM_WRITE_WATCH/GetWriteWatch, and host-imported surface memory isn't write-watched. So the "answered inside the epoch of the last proof" expectation may depend on how quickly a write is observed here. I haven't traced that further; logs are kept if you want them.

AI-assisted: yes.

…brary and pin each mode to it

The epoch mode read StorageTexture::epochRefreshes from the test executable. The counter is an inline
static of a header and libSceAgcDriver is a shared library, so on Windows the executable and the
library each hold their own copy: the test's copy never moved and the mode stopped at its premise
check. The modes now read only through functions of the library: StorageTexture::RefreshesProved()
and the thread's RefreshProved lookup outcome, which only the refresh's own proof raises.

Each mode now requires the path its name says for the lookup after the key write: a refresh under
the memoized collect raises neither count, the refresh's own proof raises both by one, and an answer
inside the epoch of the last proof raises RefreshesProved alone. A mode whose lookup is answered on
another path fails. A mode requires that the driver counts lookup outcomes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@SleglJan

SleglJan commented Nov 6, 2026

Copy link
Copy Markdown
Contributor Author

Thanks to both of you. The head is now 5287cda761: one test commit on top of b04dc41f0a, no driver change.

Windows failure of agc_driver_dcc_keys_rewrite_after_epoch_proof (@JJenkx). By the code it was the test, not the write watch. The step read StorageTexture::epochRefreshes from the test executable. That counter is an inline static in Texture.hpp and libSceAgcDriver is a shared library, so on Windows the executable and the library each hold their own copy. Only the library's is raised (Texture.cpp); the step compared its own, which never moves. The other steps read it but did not check it. It is the same kind of fault as 1db99ec and 5c3d210. The steps now read only through functions of the library: StorageTexture::RefreshesProved() and the thread's RefreshProved lookup outcome, which only the refresh's own proof raises. I have no Windows machine, so a re-run on your side would be the check.

#15456 (@milescoviello). Confirmed on its head 6330546a47: DrawPipelineEnabled() is getenv("APS5_NO_DRAW_PIPELINE") == nullptr there, so every step runs with epoch proofs once it lands.

  • Each step now requires the path of its lookup after the key write: a refresh under the memoized collect raises neither count, the refresh's own proof raises both by one, an answer inside the epoch raises RefreshesProved() alone. A step answered on another path fails, so a drift like the one you describe shows as a red test.
  • By the code the steps keep their paths on perf(agc): run the draw finisher by default #15456 without a new variable. Creation takes no refresh proof, so the lookup of --rewrite-after-memo is a full refresh either way. The epoch shortcut answers only after an earlier lookup was answered by the refresh's own proof, and in --rewrite-after-refresh-proof that is the lookup after the key write itself. So I did not add APS5_NO_DRAW_PIPELINE=1, which main does not know today.
  • I kept APS5_DRAW_PIPELINE=1 on the epoch step: main needs it today (by the code, without it the step's premise fails on current main), and perf(agc): run the draw finisher by default #15456 ignores it.

Checked on Linux (CachyOS, kernel 7.2.10), GCC 16.2.1, AMD Radeon RX 9070 XT (RADV GFX1201, Mesa 26.2.4) and lavapipe (llvmpipe, LLVM 23.1.1), ctest -R '^agc_driver_dcc_key' under the validation layer, each tree a clean merge onto main 9f2b939606:

  • main + the two test commits: on both drivers the four rewrite steps fail with their key lines (the lines in the description), the other four tests pass, none skipped. No step stops at a path check.
  • main + this head: 8 of 8 pass on both drivers, none skipped.
  • main + this head + perf(agc): run the draw finisher by default #15456's head 6330546a47: 8 of 8 pass on both drivers, none skipped; no registration sets APS5_NO_DRAW_PIPELINE.
  • No VUID- in any of these runs.
  • ctest -R '^agc' on the RX 9070 XT with main + this head, without the layer: 1 of 1352 fails (agc_driver_tessellation, segmentation fault, as before) and 23 skip, the same 23 names as before.

AI-assisted: yes (Claude Code)

@JJenkx

JJenkx commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Follow-up Windows/AMD check of the new head 5287cda761, merged onto main 578dd09c42 (c567422035, clean merge).

Setup: Windows 11 Enterprise 22621, WinLibs GCC 15.2 UCRT, Release, Radeon RX 6700 XT, AMD driver 26.10.1. Run through the Windows test queue with ANYPS5_REQUIRE_VULKAN=1 and Vulkan validation layers 1.4.363.

  • All 7 agc_driver_dcc_keys_* tests, built with agc_driver_dcc_keys_first_write_tests rebuilt from the merge, pass in 3 of 3 runs, none skipped. That includes agc_driver_dcc_keys_rewrite_after_epoch_proof, which failed here before. There were no VUID- errors.

AI-assisted: yes.

@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ NVIDIA GPU test: passed

PR head 5287cda merged onto main 9fb6149 · tested 2026-11-06 20:13 UTC · 27 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 ✅ 3,027 passed · 4 failed (0 new, 3 also fail on main, 1 unstable on main) · 55 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 3,086 of 4,235 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 (1003 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.1 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 1 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
Validation IDs already present on main (9 IDs in 600 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (600 tests): agc_driver, agc_driver_address_draw_space_reuse, agc_driver_address_draw_space_reuse_verify, agc_driver_address_passes, agc_driver_alias_copy_label, agc_driver_alpha_to_coverage, agc_driver_array_layer_target, agc_driver_bc_block_copy, and 592 more
VUID-VkShaderModuleCreateInfo-pCode-08737 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08739 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 more
VUID-VkShaderModuleCreateInfo-pCode-08741 (14 tests): agc_driver_dpp16_operands, agc_driver_dpp8_pk_fmac, agc_driver_dx10_clamp, agc_driver_f16_fma_denormal_modes, agc_driver_f16_fma_invalid_nan, agc_driver_float16_fma_rounding, agc_driver_float16_modifiers, agc_driver_float16_native, and 6 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-VkPipelineShaderStageCreateInfo-module-parameter (1 test): agc_driver_float16_unused_nan_payloads
VUID-VkPipelineShaderStageCreateInfo-pSpecializationInfo-06849 (1 test): agc_driver_float16_unused_nan_payloads
Skipped (55)
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_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_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_net_ctl_disconnected: 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_device_capability: 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_host_resolution_disabled: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_four_k: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_height_only: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_limit: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_malformed: skipped, no display or Vulkan device: SDL_InitSubSystem(VIDEO | GAMECONTROLLER) failed: wayland,x11 not available
guest_video_out_host_resolution_width_only: 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 curre
Reproduce
git fetch origin 5287cda761c1991f8758a33fcbe94f72b17a4400 9fb6149d12d51e8dc769943c828f2f23635acb4d
git checkout 9fb6149d12d51e8dc769943c828f2f23635acb4d && git merge --no-ff 5287cda761c1991f8758a33fcbe94f72b17a4400
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.

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* build

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants