Skip to content

feat(libSceSystemService): open sceSystemServiceLaunchWebBrowser URLs in the host browser, opt-in with ANYPS5_OPEN_URLS - #12895

Open
MarcZX10 wants to merge 37 commits into
boykopovar:mainfrom
MarcZX10:feat/host-open-url
Open

MarcZX10 wants to merge 37 commits into
boykopovar:mainfrom
MarcZX10:feat/host-open-url

Conversation

@MarcZX10

Copy link
Copy Markdown
Contributor

What

sceSystemServiceLaunchWebBrowser (one URI argument; the null, 6015-byte and http:/https:/psno: checks already on main come from a measured library reading) returned EOPNOTSUPP for every valid address, so a title that asks for its browser (PPSA76677 falls back to a QR code) got nothing. It can now open the address in the host's default browser, opt-in through ANYPS5_OPEN_URLS=never|ask|always. Unset, empty and never keep today's result exactly.

Scope note: the requested target was libSceWebBrowserDialog, but no public source gives the layout of the sceWebBrowserDialogOpen parameter or the offset of its URL field (OpenOrbis-PS4-Toolchain @ 0a1aaf9dd4a92695538bdeb09fb056d06dd11725 include/orbis/WebBrowserDialog.h declares every function with no parameters; shadPS4 @ f68923fe807f657348e6719ce658bcbd0a2b1c72 webbrowserdialog.cpp takes none). The dialog is unchanged except for one debt line saying so. The store and profile dialogs carry ids, not URLs.

Design (all host-side, injected behind interfaces):

  • ValidateHostUrl: only http:// and https://, at most 2048 bytes, RFC 3986 characters only (so no control characters, spaces, non-ASCII or look-alike Unicode hosts), percent escapes well formed and not decoding to a control character, no credentials (user@, good.com@evil.com), non-empty host (DNS names or IPv6 literals), port 1 to 65535.
  • IUrlLauncher and IUrlConfirmation; OpenUrlOnHost applies the mode. An address that fails the validator reaches neither backend in any mode.
  • Backends: posix_spawnp of xdg-open (Linux) or /usr/bin/open (macOS) with the address as a single argv element and stdio on /dev/null, never a shell; ShellExecuteW on Windows after revalidating the address. Each backend refuses anything that is not a valid URL by itself.
  • Confirmation: SDL_ShowMessageBox (SDL2-static is now linked into libSceSystemService) showing the whole address, Cancel as the default for Return/Escape; no display means no. It does not use or stack on the overlay dialogs of feat(overlay): show PS5 system dialogs as real PC dialogs #12379 (no shared files; the conceptual overlap is "a host dialog"). A mutex serialises launches so two guest threads never stack boxes.
  • Results: launched returns 0 (the native success value is not measured, recorded as debt); declined, rejected, failed or disabled return the existing EOPNOTSUPP. An invalid ANYPS5_OPEN_URLS throws naming the variable at the first call past the argument checks.

Commits (22): validator + test; mode parsing + test; interfaces/policy + test; POSIX backend + test; Windows backend; POSIX launcher revalidation + test; SDL confirmation + test; wiring + test; env reference; usage; five debt statements (one per commit).

Overlap with open PRs: none edit the same lines. #12848 and #12752 also add rows/paragraphs to docs/dev/ENVIRONMENT.md and docs/user/USAGE.md and touch libSceSystemService (language and date format variables); #12285 touches libSceSystemService Export.cpp elsewhere. #12379 touches libSceMsgDialog and other CMake files, not these.

Tested

Linux x86_64, g++ 12, archive build with the host CPU gate patched (run_tests.sh).

  • Branch (built before the last two rebases, which only brought in unrelated upstream files; checks below re-run after): guest_system_service_open_url (new), guest_system_service, guest_system_service_language, guest_system_service_time_zone, guest_system_service_usb_storage, guest_system_service_app_title_id_{known,long,missing}, loadexec_arguments, guest_system_exit, guest_system_exit_parameters: 11/11 passed.
  • Baseline (upstream/main 5454cd2, second tree): the same ten existing tests, 10/10 passed, identical per test, so the default behaviour is unchanged (the existing test pins EOPNOTSUPP for http:, https:, psno: and the sourced error codes).
  • Negative controls (new test, mutation in the built tree, rebuild, ctest): 24 mutations, all aborted the test: credentials check removed, control-escape check removed, port upper bound, port zero, scheme prefix loosened, length limit raised, non-ASCII allowed, space allowed, empty host allowed, IPv6 characters unchecked, unknown mode returning never, variable name dropped from the message, policy without validation, ask skipping the question, always asking, never launching, launcher failure ignored, POSIX launcher without revalidation, POSIX launcher spawning sh, POSIX launcher reporting failure after spawn, confirmation wrap off, confirmation truncating, confirmation answering yes on SDL failure, wiring ignoring the mode, wiring always returning 0, wiring ignoring the environment, null-argument code changed. The failing line inside the test was not extracted (assertions use abort), so "intended case" is by construction of each mutation, not by line.
  • Checks: tools/check_conventions.py --base upstream/main, git diff --check, test_public_headers.py --audit-only, env_reference.py --check all clean on the final rebased head.
  • MinGW x86_64-w64-mingw32-g++ -fsyntax-only on the Windows backend.

NOT RUN: Windows (ShellExecuteW backend and SDL box), macOS (open backend, main-queue dispatch of the box), any real launch of a browser or a real message box (tests use a recording script and fakes; the Linux no-display test only proves the box answers no without a display), a Wayland-only session, a console, a title (PPSA76677). No test rebuild after the final two rebases (my files and the tests are unchanged). The unfixed code was not run against the new tests beyond the baseline list above.

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
  • AI-assisted: yes

@oneandonlydean

Copy link
Copy Markdown
Collaborator

@MarcZX10 thanks, reviewed at 7ae84d2. The validator, the shell-free launch on each OS (posix_spawnp argv / ShellExecuteW), the backend revalidation and the default-off behaviour read well, and the tests cover the rejections thoroughly. One point before merge, plus a small documentation one:

  1. Repeated calls. Nothing limits how often a title can trigger this. Export.cpp:47-52 serializes calls with a mutex, but HostUrlPolicy.hpp:48-53 keeps no shared state, so in ask mode a title that retries sceSystemServiceLaunchWebBrowser after the user presses Cancel shows the box again straight away, and in always mode a call in a loop opens a new browser tab each time. With counting fakes over the exact validator and policy headers (no real browser or dialog), 1,000 ask calls answered "no" all reached the confirmation, and 1,000 always calls all reached the launcher. On POSIX each accepted launch also starts a child and a detached wait thread, so the mutex doesn't bound outstanding host work either.

    Could you add a shared limit across URLs and guest threads? For example: after a decline, return the existing unavailable result without asking again for the rest of the session (or a cooldown), cap prompts and launches to a few per minute, and don't queue up further dialogs from callers waiting behind the active one. Deterministic tests with fake time and backends would cover it: repeated same and distinct URLs, repeated Cancel, concurrent callers, recovery after the interval, and never making no backend calls.

  2. Docs. always opens any http/https host, including localhost and private-network addresses such as a router's page. Could docs/user/USAGE.md say that, so users know what always allows compared with ask?

There is also a small conflict with #12848 in Export.cpp and the environment/usage docs; whichever lands second rebases.

@MarcZX10

MarcZX10 commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor Author

Re-checked — new head bce7cb8, both requests addressed

Both points were fair: nothing bounded repeated calls, and always was under-described.

What I ran

Changes (15 new commits, each with its test)

  • One shared OpenUrlGate for every address and guest thread, with an injected clock:
    • a caller that arrives while a box or launch is active gets EOPNOTSUPP at once (try-lock, no queued dialog; the old queuing mutex is gone);
    • at most 3 prompts or launches in a sliding 60 s;
    • after a Cancel, no prompt or launch for 600 s. I chose a bounded cooldown over "rest of the session" so a user who cancelled once can still open a later link without restarting; suppressed calls do not use the per-minute attempts;
    • never makes no backend call (1000 calls counted);
    • POSIX: at most 2 openers (child plus wait thread) outstanding; a third is refused until one exits.
  • docs/user/USAGE.md: always opens any http/https host including localhost and private-network addresses such as a router page, unlike ask; the limits are described. New debt entry: the limits are host policy, not console measurements.

Results

  • 12/12 passed: guest_system_service_open_url, guest_system_service_open_url_limits (new) and the ten existing tests (system service, language, time zone, usb storage, three app title id, loadexec_arguments, two exit). The existing tests are the same set that passed on upstream/main earlier, so defaults are unchanged.
  • Counting fakes over the real validator and policy cover repeated same and distinct URLs (1000 calls each), repeated Cancel, 16 concurrent callers through the exported call while a box is open (one box, 16 refusals), recovery at exactly 60 s and 600 s, never, and the opener bound with a blocking script.

Negative control

  • 20 mutations in the built tree, each rebuilt: blocking lock instead of try-lock (hang, 20 s timeout), cap off by one, window boundary, attempts not recorded, cap checked after recording, suppression removed, suppression boundary, decline not recorded, suppressed calls counted as attempts, never reaching the gate state, state kept across reset, validation removed from the gate, gate not shared in Export.cpp, injected clock ignored, opener cap raised, opener count never released, opener check disabled; and the three constants (cooldown 60 s, window 3600 s, max 4). Every one made at least one of the two new tests fail, except that the cooldown constant first passed because the test derived values from it, so I added literal assertions for 3, 60 s and 600 s and re-ran it: now caught.
  • Not mutation-tested: the posix_spawn_file_actions_init failure path of the opener counter.

Not verified

  • Windows, macOS, a real browser or message box, Wayland-only, a title, a console. The ShellExecuteW backend has no opener bound (it starts no child or thread here) and is only MinGW syntax-checked.
  • upstream/main moved again after my last build (unrelated files); I did not rebuild on it.

I will re-run the checks on any new head and say so here.

@github-actions

github-actions Bot commented Oct 29, 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 1896 docs/dev/ENVIRONMENT.md
PR 4472 docs/dev/ENVIRONMENT.md
PR 5021 docs/user/USAGE.md
PR 5925 docs/user/USAGE.md
PR 6186 docs/dev/ENVIRONMENT.md
PR 6924 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 7449 docs/dev/ENVIRONMENT.md
PR 7457 docs/dev/ENVIRONMENT.md
PR 7514 docs/dev/ENVIRONMENT.md
PR 7604 docs/dev/ENVIRONMENT.md
PR 7642 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 7643 docs/dev/ENVIRONMENT.md
PR 8004 docs/dev/ENVIRONMENT.md
PR 8484 docs/dev/ENVIRONMENT.md
PR 8651 core/libs/prx/libSceSystemService/Export.cpp
docs/dev/debt/libSceSystemService.md
PR 9012 docs/dev/ENVIRONMENT.md
PR 9289 docs/dev/ENVIRONMENT.md
PR 9345 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 9356 docs/dev/ENVIRONMENT.md
PR 9387 docs/dev/ENVIRONMENT.md
PR 9852 docs/dev/ENVIRONMENT.md
PR 10193 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 10442 docs/dev/ENVIRONMENT.md
PR 10678 docs/dev/ENVIRONMENT.md
PR 10757 docs/dev/ENVIRONMENT.md
PR 10894 docs/dev/ENVIRONMENT.md
PR 11435 docs/dev/ENVIRONMENT.md
PR 11436 docs/dev/ENVIRONMENT.md
PR 12324 docs/dev/ENVIRONMENT.md
PR 12544 docs/dev/ENVIRONMENT.md
PR 12746 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 12849 docs/dev/ENVIRONMENT.md
PR 13486 core/libs/prx/libSceSystemService/Export.cpp
docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 13793 docs/dev/ENVIRONMENT.md
PR 13809 docs/dev/ENVIRONMENT.md
PR 13863 docs/dev/ENVIRONMENT.md
PR 13920 docs/dev/ENVIRONMENT.md
PR 13928 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 13929 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 14051 docs/dev/ENVIRONMENT.md
PR 14212 docs/dev/debt/libSceSystemService.md
docs/dev/debt/libSceWebBrowserDialog.md
PR 14344 docs/dev/ENVIRONMENT.md
PR 15032 docs/user/USAGE.md
PR 15059 docs/dev/ENVIRONMENT.md
PR 15136 docs/dev/ENVIRONMENT.md
PR 15169 docs/dev/ENVIRONMENT.md
docs/user/USAGE.md
PR 15529 docs/dev/ENVIRONMENT.md
PR 15548 docs/dev/ENVIRONMENT.md
PR 15570 docs/dev/ENVIRONMENT.md
PR 15947 docs/dev/debt/libSceSystemService.md

@oneandonlydean oneandonlydean self-assigned this Oct 29, 2026
@JJenkx

JJenkx commented Oct 29, 2026

Copy link
Copy Markdown
Contributor

Windows run of this head (bce7cb8451), merged onto main bb04a4f1ea (clean merge, local only). Windows 11 Enterprise 10.0.22621, Ryzen 9 5950X, WinLibs GCC 15.2.0 UCRT r7, Ninja, Release, BUILD_TESTING=ON, no Vulkan driver visible.

  • This PR: guest_system_service_open_url, guest_system_service_open_url_limits pass 3 of 3 (ctest --repeat until-fail:3).
  • Negative control: not possible. With this PR's source files (core/libs/prx/libSceSystemService/Export.cpp, core/libs/prx/libSceSystemService/HostUrl.hpp, core/libs/prx/libSceSystemService/HostUrlBackends.hpp, core/libs/prx/libSceSystemService/HostUrlConfirmation.cpp, core/libs/prx/libSceSystemService/HostUrlLauncherPosix.cpp, core/libs/prx/libSceSystemService/HostUrlLauncherWindows.cpp and 1 more) put back to main's version, and the ones it adds removed, the build fails against the rest of the PR, so there is no source-only control.

AI-assisted: yes (Claude Code).

@github-actions github-actions Bot added build docs prx needs rebase Conflicts with main, rebase needed labels Oct 30, 2026
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 31, 2026
@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 31, 2026
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Oct 31, 2026
@github-actions github-actions Bot added needs rebase Conflicts with main, rebase needed and removed needs rebase Conflicts with main, rebase needed labels Nov 2, 2026
oneandonlydean added a commit to MarcZX10/AnyPS5 that referenced this pull request Nov 2, 2026
libSceSystemService/CMakeLists.txt: keep main's system_service_host_locale
interface library and add it to this branch's link line next to SDL2-static.
docs/dev/ENVIRONMENT.md: keep main's ANYPS5_LANGUAGE row and this branch's
ANYPS5_OPEN_URLS row.
…and credentials

A file URL, an address with credentials and one with a space start nothing.
HostMessageBoxConfirmation shows the whole address (wrapped every 96 characters
for display only) in a warning box with Cancel as the default for Return and
Escape. SDL_ShowMessageBox needs no initialised video subsystem and no
particular thread on Windows and X11, and the macOS implementation dispatches
to the main queue. When SDL cannot show a box, for example with no display, the
answer is no. libSceSystemService now links SDL2-static for this.
…answer

The wrapped text keeps the whole address and no line over 96 characters. On
Linux, with DISPLAY and WAYLAND_DISPLAY removed, the message box cannot be
shown and the confirmation answers no without opening anything.
…r on the host

After the sourced argument checks (null, 6015 bytes, http:, https: or psno:),
the call now consults ANYPS5_OPEN_URLS. Unset, empty or never keep today's
EOPNOTSUPP result. With ask or always, a URL that passes the host validator is
confirmed and launched through the injectable backends and the call returns 0;
a declined, rejected or failed launch still returns EOPNOTSUPP. The launch is
serialised so two guest threads never stack confirmation boxes. An invalid
ANYPS5_OPEN_URLS value throws an error naming the variable at the first call
that gets past the argument checks.
With injected backends: unset, empty and never keep EOPNOTSUPP and touch
neither backend; ask confirms before launching and a declined or failed launch
returns EOPNOTSUPP; always launches without asking; invalid addresses and the
sourced 0x80a10003, 0x80a10007 and 0x80a10008 results reach neither backend in
any mode; a bogus variable throws naming it after the argument checks.
Adds the variable to the environment reference: never, ask or always, with
unset and empty keeping the current failing result.
Lists the three modes, why always is discouraged, what a missing display does,
the accepted address forms and the refusals, and how each host starts the
browser.
The silent-stub entry for sceSystemServiceLaunchWebBrowser now states the
failure applies when ANYPS5_OPEN_URLS is unset, empty or never.
…bBrowser

The result is the default one; ANYPS5_OPEN_URLS=ask or always changes it for
addresses the host opens.
…e browser launch

The native result for a launched browser is unknown, and the host accepts fewer
addresses than the console's own checks.
Only the Linux opener is exercised; the Windows and macOS backends, the macOS
main-queue dispatch and Wayland without Xwayland are reasoned from the SDL and
platform documentation.
sceWebBrowserDialogOpen does not open anything on the host because no public
source gives the parameter layout or the URL offset.
OpenUrlGate runs OpenUrlOnHost behind a try-lock: a caller that arrives while a
confirmation box or a launch is in progress gets Busy at once instead of
queuing another dialog behind it. never still makes no backend call and an
invalid address is rejected before the lock is touched. The gate takes an
injectable clock for the limits that follow. Nothing calls it yet.
While a confirmation is blocked, other callers for the same and distinct
addresses, in ask and always, get Busy without a second dialog or launch; a
never call and an invalid address are answered without touching the lock; 1000
never calls make no backend call.
…nute

Every confirmation shown in ask and every launch in always counts as an attempt
in a sliding 60 second window kept by the shared gate. A fourth attempt inside
the window returns Limited without a dialog or a launch, whatever the address,
and the window empties as attempts age out of it by the injected clock.
…unts

Three attempts pass in ask and in always, then 1000 same and distinct addresses
are limited with no further dialog or launch; the window opens again exactly 60
seconds after its oldest attempt. Rejected addresses do not count, failed
launches do.
A declined confirmation suppresses every further prompt and launch, for any
address, until 600 seconds later by the injected clock; those calls return
Suppressed at once and do not count against the per-minute cap. The pause is
bounded, not for the whole session, so a user who cancelled once can still open
a link they ask for later without restarting the game.
After a decline every same or distinct address is suppressed in ask and always
with no dialog or launch, until exactly 600 seconds later; repeated Cancel
shows one box per interval; suppressed calls do not use up the per-minute
attempts.
The fake clock, launcher and confirmation move out of the limits test so the
exported-call tests can reuse them. No assertion changes.
…the shared gate

All guest threads and all addresses now share one OpenUrlGate: callers that
arrive during a dialog or launch, repeats after a Cancel and more than three
attempts a minute return the existing EOPNOTSUPP without touching a backend.
The mutex that queued callers is gone. The test hook takes the clock too and
resets the gate; the existing exported-call test advances a fake clock between
calls so its sequence is unaffected by the limits.
With counting fakes and a fake clock: repeated Cancel on the same and distinct
addresses shows one box until the cooldown ends; more than three launches a
minute are refused and resume after the window; 1000 never calls reach no
backend; sixteen concurrent callers during an open confirmation get EOPNOTSUPP
and add no second box.
Each accepted launch left a child and a detached wait thread for as long as the
opener lived. The launcher now counts running openers, shared with the wait
threads so it survives the launcher, and refuses a third until one exits. The
gate's three a minute still apply on top.
A blocking opener script holds two launches open: a third and twenty more are
refused and start nothing; once the first two exit a launch succeeds again.
…esses

ask shows the address before anything opens; always opens whatever http or
https host the game names, including localhost and a router's page.
Busy callers are refused, three attempts a minute, and ten minutes of silence
after Cancel; refused requests fail like the default.
The busy refusal, the attempt cap, the cooldown after Cancel and the opener bound
are not measured on the console.
The usage text promises three attempts, 60 seconds and 10 minutes; the limits
test derived its sequences from the constants, so changing a constant moved
test and code together. The values are now asserted literally.
@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 4, 2026
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head 737ac71 merged onto main b11c7bf · tested 2026-11-04 15:38 UTC · 20 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,165 passed · 9 failed (0 new, 6 also fail on main, 3 unstable on main) · 10 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,184 of 3,894 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 (967 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 120.3 s, ⚠️ agc_driver_graphics 107.0 s, ⚠️ agc_driver_graphics_maps_fallback 101.0 s, ⚠️ agc_driver_bda_device 58.9 s, ⚠️ agc_driver_image_sample_unnormalized 53.3 s
Unstable on main (3, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_array_layer_target_cpu: failed in 3 of the last 10 main runs
agc_driver_pipeline_journal: failed in 8 of the last 10 main runs
agc_driver_two_sample_alpha_to_coverage_sample_mask_export: failed in 3 of the last 10 main runs
Failing on main too (6, 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_native_depth_bda_clear
agc_driver_native_multisample_depth
agc_driver_submit_progress
Validated but not compared (64, not in the main baseline's validation pass)
public_headers
public_headers_compile_0
public_headers_compile_1
public_headers_compile_10
public_headers_compile_11
public_headers_compile_12
public_headers_compile_13
public_headers_compile_14
public_headers_compile_15
public_headers_compile_16
public_headers_compile_17
public_headers_compile_18
public_headers_compile_2
public_headers_compile_20
public_headers_compile_21
public_headers_compile_22
public_headers_compile_23
public_headers_compile_24
public_headers_compile_25
public_headers_compile_26
public_headers_compile_27
public_headers_compile_28
public_headers_compile_29
public_headers_compile_3
public_headers_compile_30
public_headers_compile_31
public_headers_compile_32
public_headers_compile_33
public_headers_compile_34
public_headers_compile_35
public_headers_compile_36
public_headers_compile_37
public_headers_compile_38
public_headers_compile_39
public_headers_compile_4
public_headers_compile_40
public_headers_compile_41
public_headers_compile_42
public_headers_compile_43
public_headers_compile_44
public_headers_compile_45
public_headers_compile_46
public_headers_compile_47
public_headers_compile_48
public_headers_compile_49
public_headers_compile_5
public_headers_compile_50
public_headers_compile_51
public_headers_compile_52
public_headers_compile_53
public_headers_compile_54
public_headers_compile_55
public_headers_compile_56
public_headers_compile_57
public_headers_compile_58
public_headers_compile_59
public_headers_compile_6
public_headers_compile_60
public_headers_compile_61
public_headers_compile_62
public_headers_compile_63
public_headers_compile_7
public_headers_compile_8
public_headers_compile_9
Validation IDs already present on main (8 IDs in 677 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (677 tests): agc_compute_pipeline_replay, agc_driver_address_draw_space_reuse, agc_driver_address_draw_space_reuse_held, agc_driver_address_draw_space_reuse_off, agc_driver_address_draw_space_reuse_transitions, agc_driver_address_draw_space_reuse_verify, agc_driver_address_passes, agc_driver_address_passes_draw_transitions, and 669 more
VUID-vkCmdCopyImage-srcImage-01548 (11 tests): agc_driver_depth_clear_hle, 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_image_copy, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_plane_partially_unmapped_plane, agc_driver_depth_plane_unmapped_plane, and 3 more
VUID-vkCmdCopyImage-srcImage-01551 (11 tests): agc_driver_depth_clear_hle, 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_image_copy, agc_driver_depth_plane_partial_store_unimported, agc_driver_depth_plane_partially_unmapped_plane, agc_driver_depth_plane_unmapped_plane, and 3 more
VUID-VkPipelineColorBlendStateCreateInfo-pAttachments-00605 (2 tests): agc_driver_prepared_exports, 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 (10)
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_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_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_vertex_elected_atomic_max: skipped, the device runs vertex programs in subgroups, so they keep their cross-lane reductions
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
Reproduce
git fetch origin 737ac7199d6fa4048d32016835442d5f421cd434 b11c7bf84f5d2f636ff60166cc3371bd071e24d5
git checkout b11c7bf84f5d2f636ff60166cc3371bd071e24d5 && git merge --no-ff 737ac7199d6fa4048d32016835442d5f421cd434
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.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants