Skip to content

feat(libc): implement asctime_r - #12841

Merged
oneandonlydean merged 7 commits into
boykopovar:mainfrom
heditrigui:feat/libc-asctime-r
Nov 4, 2026
Merged

oneandonlydean merged 7 commits into
boykopovar:mainfrom
heditrigui:feat/libc-asctime-r

Conversation

@heditrigui

@heditrigui heditrigui commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

What

Implement POSIX / FreeBSD \�sctime_r\ (NID \488p6whx47U) in \libc, formatting broken-down time into a caller-supplied buffer with identical formatting to \�sctime. Refactor \�sctime\ to delegate to \�sctime_r\ via a thread-local buffer, throw \std::invalid_argument\ when given a null buffer, and verify formatting and error handling in \GuestStrftime\ and \GuestTimeConversion.

Tested

  • Ran \python tools/check_conventions.py --base upstream/main\ cleanly (0 errors).
  • Validated test targets \GuestStrftime\ and \GuestTimeConversion\ on Windows 11 x64 (hosted Windows CI passed 100% green) and macOS Apple Clang arm64 harness.

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

@heditrigui The implementation is correct and small: asctime_r takes over the body of asctime unchanged, asctime now calls it with its thread-local buffer, and every field is reduced to at most 2 digits (%3d for the day, years below 10000), so the output never exceeds 25 characters plus the terminator and snprintf(buffer, 26, ...) cannot truncate or overflow. I checked that asctime_r gives NID 488p6whx47U with the repository's NID tool and that nothing else on main defines it, and the new cases in GuestStrftime and GuestTimeConversion compare it with asctime for every existing case. One change, in docs/dev/debt/libc.md:

The entry for strftime and asctime says these "follow a payload process on a PS5 (firmware 13.60) in the C locale" and you added asctime_r to its heading, so it now claims a console measurement for asctime_r. Only asctime was measured there. asctime_r is the same formatting moved to a caller buffer, and two behaviours are yours: a null buffer returns nullptr without touching errno (the test pins this), and a null timeptr fills the buffer with the ??? text and sets EINVAL, as asctime does. Please keep asctime_r out of the measured list and add a sentence that its formatting is shared with asctime, that the console's asctime_r was not measured, and that the null-buffer result is assumed.

@heditrigui

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Thanks! Kept \�sctime_r\ out of the measured list in \libc.md, added the note that its formatting is shared with \�sctime\ without console measurement and that returning
ullptr\ for a null buffer is assumed, and filled in the PR template headings.

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Progress report (0278ca9 → f2363b9)

📈 System libraries: 26.18% (+0.01%, +1 implemented functions)

✅ 1 implemented
Library Name
libc asctime_r_nid_postfix

Changed libraries (implemented exports)

Library Before After Change
libc 1530/1548 (98.84%) 1531/1549 (98.84%) +0.0008%

@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 5021 core/libs/prx/libc/src/Time.cpp
docs/dev/debt/libc.md
PR 5303 docs/dev/debt/libc.md
PR 6819 docs/dev/debt/libc.md
PR 7081 docs/dev/debt/libc.md
PR 7386 docs/dev/debt/libc.md
PR 7447 docs/dev/debt/libc.md
PR 7715 docs/dev/debt/libc.md
PR 8150 docs/dev/debt/libc.md
PR 8965 docs/dev/debt/libc.md
PR 9087 docs/dev/debt/libc.md
PR 9340 docs/dev/debt/libc.md
PR 9371 docs/dev/debt/libc.md
PR 9447 core/libs/prx/libc/src/Time.cpp
docs/dev/debt/libc.md
PR 9526 docs/dev/debt/libc.md
PR 9929 docs/dev/debt/libc.md
PR 10113 docs/dev/debt/libc.md
PR 10158 docs/dev/debt/libc.md
PR 10165 docs/dev/debt/libc.md
PR 10200 docs/dev/debt/libc.md
PR 10226 docs/dev/debt/libc.md
PR 10405 docs/dev/debt/libc.md
PR 10780 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 10987 core/libs/prx/libc/src/Time.cpp
core/libs/tests/GuestTimeConversion.cpp
docs/dev/debt/libc.md
PR 11332 docs/dev/debt/libc.md
PR 11621 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 11625 docs/dev/debt/libc.md
PR 11664 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 11724 docs/dev/debt/libc.md
PR 11831 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 12053 docs/dev/debt/libc.md
PR 12397 docs/dev/debt/libc.md
PR 12510 docs/dev/debt/libc.md
PR 12511 docs/dev/debt/libc.md
PR 12514 docs/dev/debt/libc.md
PR 12518 docs/dev/debt/libc.md
PR 12574 docs/dev/debt/libc.md
PR 12594 docs/dev/debt/libc.md
PR 12598 docs/dev/debt/libc.md
PR 12605 docs/dev/debt/libc.md
PR 12622 docs/dev/debt/libc.md
PR 12627 docs/dev/debt/libc.md
PR 12704 docs/dev/debt/libc.md
PR 13449 docs/dev/debt/libc.md
PR 13486 core/libs/prx/libc/include/Api.hpp
docs/dev/debt/libc.md
PR 13793 docs/dev/debt/libc.md
PR 13794 docs/dev/debt/libc.md
PR 13804 docs/dev/debt/libc.md
PR 13809 docs/dev/debt/libc.md
PR 14085 docs/dev/debt/libc.md
PR 14212 docs/dev/debt/libc.md
PR 14235 docs/dev/debt/libc.md
PR 14588 docs/dev/debt/libc.md
PR 15095 docs/dev/debt/libc.md

@oneandonlydean oneandonlydean self-assigned this Oct 29, 2026

@rooklz rooklz 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 head d690c78347 against main 157b02c4f1. I ran this on macOS arm64 with Apple clang. No console was used.

What I checked

  • The NID is right: python3 tools/nid_names.py --name asctime_r gives 488p6whx47U. main has no other asctime_r.
  • git merge-tree --write-tree upstream/main <head> merges cleanly, and git diff --check is clean.
  • check_conventions.py --base upstream/main reports 0 errors but 1 warning: docs/dev/debt/libc.md:202: [debt-length] ... 1047 characters. The line was 909 characters on main, so this PR pushes it over the 1000 limit.
  • pr_overlap.py --branch <head> (1400 PRs): there are no same-export conflicts. Three PRs (#10895, #11843, #12593) touch the neighbouring debt lines 201-203. #10409 (CONFLICTING with main) touches Time.cpp and both tests, but it doesn't change asctime.
  • I built a standalone ASan+UBSan harness from the verbatim asctime_r/asctime from Time.cpp, clampedField/tableName, and the PR's CheckAsctime rows from GuestStrftime, plus the null-tm and null-buffer rows. It passes. The fixed 26 is safe, because every field is clamped (Fri Oct 99 99:99:99 9999\n is 25 characters plus the NUL).

Mutants (single edits to the new function):

Mutant Result
Drop the null-buffer check killed (ASan)
snprintf size 25 killed
snprintf size 64 survives, but it's equivalent (output never exceeds 26)
Drop errno = EINVAL killed
Null tm returns nullptr killed
Success returns nullptr killed

Requested change: a null buffer should throw instead of returning nullptr. The debt line says "the null-buffer result is assumed". CONTRIBUTING asks for unknown behaviour to throw and be recorded, not for an assumed result. FreeBSD's asctime_r doesn't check the buffer at all, so nullptr isn't attested anywhere. Suggested change:

-    if (buffer == nullptr) return nullptr;
+    if (buffer == nullptr) throw std::invalid_argument("asctime_r: null buffer");

<stdexcept> is already included in Time.cpp. The test in GuestTimeConversion.cpp would become:

-    Require(asctime_r_nid_postfix(&roundTrip, nullptr) == nullptr, "asctime_r accepted a null buffer");
+    bool nullBufferThrew = false;
+    try {
+        asctime_r_nid_postfix(&roundTrip, nullptr);
+    } catch (const std::invalid_argument&) {
+        nullBufferThrew = true;
+    }
+    Require(nullBufferThrew, "asctime_r accepted a null buffer");

The debt sentence then shrinks below the limit (1047 → 987 characters):

`asctime_r` shares the `asctime` formatting, unmeasured; a null buffer throws

I checked this variant in the same harness: it passes, and the current head fails the new row.

Minor point: the "Tested" section lists only check_conventions. Please add which ctest targets (GuestStrftime, GuestTimeConversion) you ran and on which OS.

@oneandonlydean oneandonlydean mentioned this pull request Oct 29, 2026
12 tasks done
@heditrigui

Copy link
Copy Markdown
Contributor Author

@rooklz Thanks for the thorough review! Updated �sctime_r to throw std::invalid_argument("asctime_r: null buffer") when given a null buffer per CONTRIBUTING conventions, updated the unit test in GuestTimeConversion.cpp to assert that it throws, shortened the debt note in docs/dev/debt/libc.md to 987 characters, and updated the PR body with the test targets and platform details.

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

Re-reviewed head e908061e32 against main 3adb909203 on macOS arm64 with Apple clang. I didn't use a console.

The change since my last review matches what I asked for. A null buffer now throws std::invalid_argument before anything is written. There's a test row for it, and the debt sentence is short again: line 202 is 987 characters, and check_conventions passes with no warnings.

  • Standalone ASan+UBSan harness. It takes asctime_r/asctime verbatim from Time.cpp with clampedField/tableName/the name tables, plus every CheckAsctime row from GuestStrftime, the null-tm and null-buffer rows from GuestTimeConversion, and one extra widest-output row (Fri Oct 99 99:99:99 9999\n, 25 characters plus the NUL, which fits the fixed 26). It passes.
  • Mutants: 7 of 7 killed. They were: the null-buffer throw dropped, snprintf size 25, errno = EINVAL dropped, null-tm returning nullptr, the success path returning nullptr, the seconds field swapped for minutes, and the year modulus 100000.
  • git diff --check, merge-tree against 3adb909203 and check_conventions --base upstream/main are all clean. pr_overlap probed 1407 PRs and found no conflicting files and no same exports. The only ones listed are PRs that already conflict with main and share Api.hpp/libc.md.

LGTM.

AI-assisted: yes

@JJenkx

JJenkx commented Oct 29, 2026

Copy link
Copy Markdown
Contributor

Windows run of this head (e908061e32), merged onto main be2242b8c8 (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_strftime, guest_time_conversion pass 3 of 3 (ctest --repeat until-fail:3).
  • Negative control: not possible. With this PR's source files (core/libs/prx/libc/include/Api.hpp, core/libs/prx/libc/src/Time.cpp) put back to main's version, the build fails against the rest of the PR, so there is no source-only control.

AI-assisted: yes (Claude Code).

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

Withdrawn. This review applied a title-ID/log requirement that is not in CONTRIBUTING (Unblocks: none is allowed), and it contained no code review.

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Nov 1, 2026
@oneandonlydean

Copy link
Copy Markdown
Collaborator

Reviewed at c80f63e17c777a00d32dcf52a1b9de953431699e.

The latest main merge resolved the conflict in docs/dev/debt/libc.md by rewriting lines 226 and 227 with their formatting stripped:

  • all inline code lost its backticks (%G, %g, %V, %U, %W, libc.prx, strftime, SIZE_MAX / _Getmbcurmax(), EINVAL);
  • a few words were dropped ("follow the SDK 7.00" became "follow SDK 7.00", "from its disassembly" became "from disassembly", "on a console" became "on console");
  • in the wcsftime entry, "A null format or tm throws" became "A null format or" followed by a tab character and "m throws".

Line 227 (the wcsftime entry) is main's text, which this PR didn't change before. Could you take both lines from main as they are and then re-apply only this PR's own change to the strftime and asctime entry? Against main the PR should again change one line in that file.

@heditrigui

Copy link
Copy Markdown
Contributor Author

@oneandonlydean Thank you for catching that! The conflict resolution inadvertently stripped the backticks and evaluated the escape sequences.

Updated in head 3eb1642424:

  1. Restored the exact upstream/main formatting for both line 226 and line 227 (wcsftime is completely untouched).
  2. Appended . asctime_rshares theasctime formatting, unmeasured; a null buffer throws to line 226 with all inline code backticks preserved (987 characters, within the 1,000-character line length limit).
  3. Verified clean with check_conventions.py (0 errors) and test_public_headers.py (26,744 exports; 0 errors).

@github-actions github-actions Bot removed the needs rebase Conflicts with main, rebase needed label Nov 1, 2026
@oneandonlydean
oneandonlydean merged commit c7d32c2 into boykopovar:main Nov 4, 2026
18 checks passed
@TechLevelZero

Copy link
Copy Markdown
Contributor

✅ AMD GPU test: passed

PR head f2363b9 merged onto main 1c8c0ef · tested 2026-11-04 06:48 UTC · 37 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,712 passed · 19 failed (0 new, 11 also fail on main, 8 unstable on main) · 62 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,793 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 (1351 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 121.6 s, ⚠️ agc_driver_graphics 120.3 s, ⚠️ agc_driver_graphics_maps_fallback 120.2 s, ⚠️ agc_driver_image_sample_unnormalized 86.9 s, ⚠️ public_headers 83.2 s
Unstable on main (8, these also failed in recent main runs on this machine; not counted against this PR)
agc_driver_alpha_to_coverage_sample_mask_export: failed in 3 of the last 10 main runs
agc_driver_array_layer_target_cpu: failed in 2 of the last 10 main runs
agc_driver_dithered_alpha_to_coverage: failed in 1 of the last 10 main runs
agc_driver_graphics: failed in 2 of the last 10 main runs
agc_driver_graphics_maps_fallback: failed in 1 of the last 10 main runs
agc_driver_pipeline_journal: failed in 8 of the last 10 main runs
agc_driver_submit_progress: failed in 8 of the last 10 main runs
agc_driver_two_sample_alpha_to_coverage_sample_mask_export: failed in 2 of the last 10 main runs
Failing on main too (11, not counted against this PR)
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_submit_progress
agc_submit_progress_no_timeline
guest_mmap_executable
guest_socket_options_multicast
Passed on retry (3, failed in the parallel run, passed when re-run with a 360 s timeout; not counted against this PR)
agc_driver_emulated_color_compare_srgb_decode: Timeout in the parallel run; also passed only on retry in 14 other runs in the last 7 days
agc_driver_recorder: Timeout in the parallel run; also passed only on retry in 15 other runs in the last 7 days
guest_pthread_start: Timeout in the parallel run; also passed only on retry in 24 other runs in the last 7 days
Validation IDs already present on main (8 IDs in 777 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (777 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 769 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 (62)
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_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_storage_pending_key_refresh: skipped, refreshes over a pending key store are not testable here
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_aftergp
Reproduce
git fetch origin f2363b991f40dec3a0c5f5791531f12d868a7198 1c8c0efc8c41314402e6966da5bef6ea3d639d10
git checkout 1c8c0efc8c41314402e6966da5bef6ea3d639d10 && git merge --no-ff f2363b991f40dec3a0c5f5791531f12d868a7198
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.

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.

6 participants