Skip to content

feat(libSceIcu): implement property and case exports from ICU tables - #13578

Open
KernelPanicNT wants to merge 5 commits into
boykopovar:mainfrom
KernelPanicNT:feat/icu-submodule-properties
Open

KernelPanicNT wants to merge 5 commits into
boykopovar:mainfrom
KernelPanicNT:feat/icu-submodule-properties

Conversation

@KernelPanicNT

@KernelPanicNT KernelPanicNT commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

What

Source of the behaviour

ICU 78.1, tag release-78.1, commit 049e0d6a4206. The library already follows this release (see the version and escape entries in libSceIcu.md); its Unicode version is 17.0 (uchar.h#L64), the value #13457 returns from u_getUnicodeVersion.

AnyPS5 lines that change (at b11c7bf84f5d):

What this adds

ICU becomes a submodule at 3rdparty/icu, pinned to the commit above (shallow = true, since the repository history is large). cmake/Icu.cmake builds icu_common, a static library made of the 53 icu4c/source/common files these exports reach plus stubdata/stubdata.cpp, with UCONFIG_NO_FILE_IO=1. The property, case, bidi, name and NFC tables are compiled-in *_data.h headers, so no .dat file, data directory or host ICU is involved, and nothing is read from the host file system. ICU keeps its versioned symbol names (u_charType_78), is built with hidden visibility and is linked with --exclude-libs like Opus, so libSceIcu.prx exports none of it (nm -D shows 0 ICU symbols). Windows adds 19 files (wintz.cpp and the locale and resource-bundle code it and putil.cpp reach only on Win32).

49 exports call ICU and keep the guest ABI the library already uses: UChar32 is int32_t, UBool one byte, enums int32_t, UErrorCode* an int32_t*, UChar char16_t:

  • u_charType, u_enumCharTypes, u_islower, u_isupper, u_istitle, u_isdigit, u_isxdigit, u_isalpha, u_isalnum, u_isdefined, u_isbase, u_iscntrl, u_ispunct, u_isgraph, u_isprint, u_isIDStart, u_isIDPart, u_isIDIgnorable, u_isJavaIDStart, u_isJavaIDPart, u_isUAlphabetic, u_isULowercase, u_isUUppercase
  • u_charDigitValue, u_digit, u_getNumericValue, u_charAge, u_getCombiningClass, u_charDirection, u_isMirrored, u_charMirror, u_getBidiPairedBracket, u_foldCase
  • u_getPropertyEnum, u_getPropertyName, u_getPropertyValueEnum, u_getPropertyValueName, u_getIntPropertyMinValue, u_getIntPropertyMaxValue, u_hasBinaryProperty, u_getIntPropertyValue
  • u_strFoldCase, u_strToLower, u_strToUpper, u_strCaseCompare, u_strcasecmp, u_strncasecmp, u_memcasecmp, u_caseInsensitivePrefixMatch

Behaviour is ICU's for every input, with these exceptions:

  • u_hasBinaryProperty and u_getIntPropertyValue throw NotImplemented_nid_no_patch for properties whose source is a data file (emoji properties, NFKD/NFKC_Inert, NFKD/NFKC_Quick_Check, Changes_When_NFKC_Casefolded, Indic_Positional_Category, Indic_Syllabic_Category, Vertical_Orientation), and u_getIntPropertyMaxValue for the last three. Without the file ICU would answer 0 or false, which would be made up.
  • u_strToLower and u_strToUpper throw NotImplemented_nid_no_patch for a null locale when ICU would map the string, because the result then depends on the device's default locale. An empty locale is root, as in ICU, and failed input codes and invalid arguments return as in ICU. A named locale goes through ucase_getCaseLocale and ustrcase_mapWithOverlap, which is what u_strToLower does for a non-null locale; calling them directly keeps uloc_getDefault and the locale and resource-bundle code out of the Linux build.
  • Where ICU dereferences a null pointer (a null UErrorCode* in the string mappers and the prefix match, a null string with a nonzero length in the comparisons, a null second match length) or receives a length below -1, which ICU turns into pointer arithmetic before the string, the export throws std::invalid_argument.
  • u_enumCharTypes forwards ICU's callback to the guest function through a System V ABI trampoline, so a guest callback works on Windows.

These five exports therefore still count as stubs; the other 44 no longer reach NotImplemented_nid_no_patch.

Why ICU's tables instead of hand-written sets

#12630 implemented u_isspace and four similar classifiers with fixed ranges, and those stay as they are. That works for a few short sets, but these exports need the General_Category, numeric value, age, case mappings and folding, bidi class, mirroring and paired brackets, combining class and the property and value names for all 1,114,112 code points, about 100 properties in all. Hand-transcribing them would mean several hundred kilobytes of tables that nobody can review against the Unicode Character Database, and they would drift from the 17.0 data that ICU 78.1 ships. The submodule uses the tables ICU generates from that data, at the release the library already follows, compiled from source as AGENTS.md asks for third-party code.

Excluded exports

Overlap (tools/pr_overlap.py --branch feat/icu-submodule-properties)

Tested

Linux (GitHub Codespace, AMD EPYC 7763, 4 cores, Ubuntu 24.04, g++ 14, Ninja, Release), on main at b11c7bf84f5d with the submodule checked out by git submodule update --init --depth 1 3rdparty/icu (commit 049e0d6a4206):

  • ctest -R "^guest_icu_": 18/18 passed, the 15 ICU tests on main and the new guest_icu_properties, guest_icu_case_mapping and guest_icu_unicode_data.
  • guest_icu_unicode_data uses icu4c/source/data/unidata/UnicodeData.txt from the submodule as the oracle. CMake passes the path in, and the test reads the file when it runs and fails if the file is missing or malformed. For all 1,114,112 code points (299,382 listed, with First/Last ranges expanded) it compares u_charType, u_getCombiningClass, u_charDigitValue and u_charDirection with the file, and the u_enumCharTypes ranges with the same table. Unlisted code points must be Cn, class 0 and no digit. Bidi is not compared for them, because the submodule has no DerivedBidiClass.txt. INT32_MIN, -1, 0x110000 and INT32_MAX must return Cn, 0, -1 and L, which is what ICU returns outside its tries.
  • guest_icu_properties and guest_icu_case_mapping check values from the Unicode Character Database (for example U+20C1 SAUDI RIYAL SIGN, new in 17.0: category Sc and age 17.0), locale mappings (tr, az, lt, el, final sigma), preflighting, in-place mapping, error codes and the cases that throw.
  • Negative controls for guest_icu_unicode_data: changing a single code point in the middle of a range (U+7A00 for u_charType, U+0F72 for u_getCombiningClass, U+0AE9 for u_charDigitValue, U+05D3 for u_charDirection, the surrogate U+DB80 for u_charType) gives exactly one mismatch each, while guest_icu_properties and guest_icu_case_mapping still pass with it. Shifting one block for each export (U+8000 for u_charType, U+1DC0 for u_getCombiningClass, U+1D7CE for u_charDigitValue, U+10900 for u_charDirection) gives 182, 19, 50 and 204 mismatches. Mapping out-of-range input to U+0041 gives 4. The 49 bodies replaced by NotImplemented_nid_no_patch(__func__) fail with u_charType_nid_postfix not implemented; on the earlier head the same control failed guest_icu_properties and guest_icu_case_mapping (u_strToUpper_nid_postfix not implemented). With UnicodeData.txt moved away the test fails with cannot open, and with the file truncated it fails on the cut line. With the change restored all pass.
  • icu_common cold build without ccache: 19 s on 4 cores (54 files). The depth-1 checkout is 329 MB of working tree plus 95 MB under .git/modules.
  • tools/check_conventions.py --base origin/main and tools/check_test_registration.py pass.
  • tools/progress.py --compare: libSceIcu 75/2661 → 119/2661, +44 implemented, 5 still counted as stubs (u_hasBinaryProperty, u_getIntPropertyValue, u_getIntPropertyMaxValue, u_strToLower, u_strToUpper).
  • Windows: CodingBreadd built the earlier head d8ee336 with WinLibs GCC 15.2.0 (MinGW, UCRT); the 8 ICU tests of that head passed (comment).

Not tested: this head on Windows (MinGW), including guest_icu_unicode_data, and macOS. The 19 Windows-only sources were first found by forcing every ICU symbol that putil.cpp, wintz.cpp, locmap.cpp, udata.cpp and umapfile.cpp reference to be undefined in a Linux link and reading the linker map, not by building with MinGW. Not compared with a console.

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

Add ICU 78.1 (release-78.1, 049e0d6a4206) as the 3rdparty/icu submodule
and build the icu4c common sources these exports reach as a static
library with the compiled-in property, case, bidi, property-name and NFC
tables, stub data and file I/O disabled.

Implement 49 libSceIcu exports on top of it: character categories and
classifiers, numeric, age, combining class, bidi and mirroring queries,
property and value names, binary and enumerated property values, simple
case folding, string case mapping and case-insensitive comparison.
Properties whose ICU data lives in data files (emoji, NFKC,
NFKC_Casefold, Indic categories, vertical orientation) and string case
mapping in the default locale throw NotImplemented_nid_no_patch.
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Progress report (0263899 → 5d01281)

📈 System libraries: 26.81% (+0.12%, +44 implemented functions)

✅ 44 implemented
Library Name
libSceIcu u_caseInsensitivePrefixMatch_nid_postfix
libSceIcu u_charAge_nid_postfix
libSceIcu u_charDigitValue_nid_postfix
libSceIcu u_charDirection_nid_postfix
libSceIcu u_charMirror_nid_postfix
libSceIcu u_charType_nid_postfix
libSceIcu u_digit_nid_postfix
libSceIcu u_enumCharTypes_nid_postfix
libSceIcu u_foldCase_nid_postfix
libSceIcu u_getBidiPairedBracket_nid_postfix
libSceIcu u_getCombiningClass_nid_postfix
libSceIcu u_getIntPropertyMinValue_nid_postfix
libSceIcu u_getNumericValue_nid_postfix
libSceIcu u_getPropertyEnum_nid_postfix
libSceIcu u_getPropertyName_nid_postfix
libSceIcu u_getPropertyValueEnum_nid_postfix
libSceIcu u_getPropertyValueName_nid_postfix
libSceIcu u_isIDIgnorable_nid_postfix
libSceIcu u_isIDPart_nid_postfix
libSceIcu u_isIDStart_nid_postfix
libSceIcu u_isJavaIDPart_nid_postfix
libSceIcu u_isJavaIDStart_nid_postfix
libSceIcu u_isMirrored_nid_postfix
libSceIcu u_isUAlphabetic_nid_postfix
libSceIcu u_isULowercase_nid_postfix
libSceIcu u_isUUppercase_nid_postfix
libSceIcu u_isalnum_nid_postfix
libSceIcu u_isalpha_nid_postfix
libSceIcu u_isbase_nid_postfix
libSceIcu u_iscntrl_nid_postfix
libSceIcu u_isdefined_nid_postfix
libSceIcu u_isdigit_nid_postfix
libSceIcu u_isgraph_nid_postfix
libSceIcu u_islower_nid_postfix
libSceIcu u_isprint_nid_postfix
libSceIcu u_ispunct_nid_postfix
libSceIcu u_istitle_nid_postfix
libSceIcu u_isupper_nid_postfix
libSceIcu u_isxdigit_nid_postfix
libSceIcu u_memcasecmp_nid_postfix
libSceIcu u_strCaseCompare_nid_postfix
libSceIcu u_strFoldCase_nid_postfix
libSceIcu u_strcasecmp_nid_postfix
libSceIcu u_strncasecmp_nid_postfix

Changed libraries (implemented exports)

Library Before After Change
libSceIcu 75/2661 (2.82%) 119/2661 (4.47%) +1.65%

@github-actions

github-actions Bot commented Oct 30, 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 .gitmodules
CMakeLists.txt
PR 5021 .gitmodules
CMakeLists.txt
PR 7264 CMakeLists.txt
PR 7642 CMakeLists.txt
PR 7645 CMakeLists.txt
PR 8043 CMakeLists.txt
PR 8588 CMakeLists.txt
PR 9508 CMakeLists.txt
PR 9539 CMakeLists.txt
PR 9547 CMakeLists.txt
PR 9776 .gitmodules
CMakeLists.txt
PR 9855 .gitmodules
PR 10193 CMakeLists.txt
PR 10897 CMakeLists.txt
PR 10963 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10964 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10965 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10966 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 10967 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11088 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11104 CMakeLists.txt
PR 11115 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11118 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11122 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11132 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 11136 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 12038 CMakeLists.txt
PR 12320 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 12406 CMakeLists.txt
PR 12497 CMakeLists.txt
PR 12738 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 12766 CMakeLists.txt
PR 12767 CMakeLists.txt
PR 12770 CMakeLists.txt
PR 12771 CMakeLists.txt
PR 12873 CMakeLists.txt
PR 12874 CMakeLists.txt
PR 12875 CMakeLists.txt
PR 12876 CMakeLists.txt
PR 12877 CMakeLists.txt
PR 12878 CMakeLists.txt
PR 12879 CMakeLists.txt
PR 12880 CMakeLists.txt
PR 12881 CMakeLists.txt
PR 13128 core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 13274 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 13331 .gitmodules
PR 13801 CMakeLists.txt
PR 13928 CMakeLists.txt
PR 13929 CMakeLists.txt
PR 13983 CMakeLists.txt
PR 14016 core/libs/prx/libSceIcu/Export.cpp
docs/dev/debt/libSceIcu.md
PR 14044 CMakeLists.txt
PR 14050 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
docs/dev/debt/libSceIcu.md
PR 14123 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 14144 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 14187 CMakeLists.txt
PR 14191 CMakeLists.txt
PR 14212 CMakeLists.txt
docs/dev/debt/libSceIcu.md
PR 14235 CMakeLists.txt
PR 14264 CMakeLists.txt
PR 14285 core/libs/prx/libSceIcu/CMakeLists.txt
PR 14305 CMakeLists.txt
PR 14306 CMakeLists.txt
PR 14307 CMakeLists.txt
PR 14314 CMakeLists.txt
PR 14340 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 14388 CMakeLists.txt
PR 14412 CMakeLists.txt
PR 14421 .gitmodules
PR 14435 .gitmodules
PR 14441 .gitmodules
PR 14443 core/libs/prx/libSceIcu/CMakeLists.txt
core/libs/prx/libSceIcu/Export.cpp
core/libs/prx/libSceIcu/libSceIcu.hpp
docs/dev/debt/libSceIcu.md
PR 14446 CMakeLists.txt
PR 14448 .gitmodules
PR 14449 CMakeLists.txt
PR 14451 CMakeLists.txt
PR 14452 CMakeLists.txt
PR 14453 CMakeLists.txt
PR 14455 CMakeLists.txt
PR 14558 CMakeLists.txt
PR 15085 CMakeLists.txt

@CodingBreadd

Copy link
Copy Markdown
Contributor

Tested on Windows, since the description lists MinGW as untested. Head d8ee336, Windows 11, WinLibs GCC 15.2.0 (UCRT, POSIX, SEH), Ninja Release with BUILD_TESTING=ON.

  • Build: libSceIcu, the eight guest_icu_* tests and the patched libSceIcu.prx build with no errors or warnings. icu_common compiled 73 ICU sources, which matches 53 + stubdata + the 19 Windows-only files (including wintz, locmap, putil, udata, umapfile). The NID patcher reports OK.
  • Tests: ctest -R "^guest_icu_" passes 8/8, including guest_icu_properties and guest_icu_case_mapping.
  • Exports: objdump -p shows 178 named exports and no ICU versioned symbols.
  • Imports: KERNEL32, the UCRT api-ms-win-crt-* DLLs, libc.prx, the MinGW runtime and ADVAPI32. The ADVAPI32 import is presumably the registry time-zone lookup in wintz.cpp. I didn't check whether any of these exports can reach it.

Not tested: macOS, or with a title.

🤖 Addressed by Claude Code

@github-actions github-actions Bot added the needs rebase Conflicts with main, rebase needed label Oct 30, 2026
@adriadam10 adriadam10 self-assigned this Oct 31, 2026

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

Correction (2026-11-01): the title-ID/log demand below is not a CONTRIBUTING requirement; Unblocks: none is allowed. The technical points below are unaffected.

The source pinning to ICU 78.1 and the Unicode 17.0 consistency with #13457 is good. Two requests.

  1. There is no title ID and no log line showing a title reaching any of the property/case exports on main ("Unblocks: none"). 14 files and +843 lines of ICU table-driven behaviour need a consumer named; which title calls these, and with which arguments?

  2. Table-derived exports are only as good as their coverage of the full code point range. Does the test sweep every code point 0..0x10FFFF against an independent oracle (ICU itself), including surrogates and out-of-range inputs, or only spot values? A boundary-only test would not catch a table offset error in the middle of the range. Please state what the oracle is.

KernelPanicNT added 3 commits November 4, 2026 14:06
Main's Iterator.hpp declares the guest-ABI UCharIterator and
UCharIteratorOrigin in the global namespace, and the umbrella
libSceIcu.hpp pulls it in. CaseMapping.cpp also includes ICU's
ustring.h, which defines ICU's own UCharIterator, so the merged tree
failed to compile. Properties.cpp and CaseMapping.cpp now include only
their own export headers.
guest_icu_unicode_data reads UnicodeData.txt from the pinned ICU
submodule at test time (path passed by CMake) and fails if it is
missing or malformed. For every code point 0..10FFFF it compares
u_charType, u_getCombiningClass, u_charDigitValue and u_charDirection
with the file, expanding First/Last ranges and treating unlisted code
points as Cn, class 0 and no digit. u_charDirection is skipped for
unlisted code points because the submodule has no DerivedBidiClass.txt.
u_enumCharTypes ranges are checked against the same table, and
INT32_MIN, -1, 0x110000 and INT32_MAX against ICU's trie error values.
@KernelPanicNT

Copy link
Copy Markdown
Contributor Author

Thanks a lot @CnRJay, the point about coverage is a good one: the old tests only checked spot values, so a table offset in the middle of the range would have slipped through. And thanks for the correction on point 1.

What changed:

  • 004279d adds guest_icu_unicode_data. Its oracle is icu4c/source/data/unidata/UnicodeData.txt from the pinned submodule, the Unicode 17.0 source text, not ICU's compiled tables. CMake passes the path as a compile definition, and the test reads the file when it runs and fails if the file is missing or malformed. For every code point 0..0x10FFFF it checks u_charType (general category), u_charDirection (bidi class), u_getCombiningClass and u_charDigitValue (decimal digit field). First/Last ranges are expanded, so surrogates, private use, Hangul and the CJK blocks are all covered. Code points the file does not list are expected to be Cn, class 0 and no digit. Bidi is skipped for them, because the submodule has no DerivedBidiClass.txt to give their default class. The ranges from u_enumCharTypes are checked against the same table. INT32_MIN, -1, 0x110000 and INT32_MAX must return Cn, class 0, -1 and L, which is what ICU returns outside its tries. The PR has no simple u_toupper/u_tolower/u_totitle exports, so the case mapping fields are not compared.
  • Negative controls: changing one code point in the middle of a range (U+7A00 category, U+0F72 combining class, U+0AE9 digit, U+05D3 bidi, the surrogate U+DB80) fails this test with exactly one mismatch, while the older tests still pass with each change. Shifting a block for one export (U+8000, U+1DC0, U+1D7CE, U+10900) gives 182, 19, 50 and 204 mismatches, and mapping out-of-range input to U+0041 gives 4. Stubbed exports and a missing or truncated file also fail. With the change it passes for all 1,114,112 code points (299,382 listed).
  • The conflict with main is resolved. Main now names these 49 exports as stubs in Identified.hpp, and the branch drops those stubs. 491163f fixes a clash between main's guest UCharIterator and ICU's own type. All 18 guest_icu_ tests pass.

@CodingBreadd, thank you for the MinGW run. About ADVAPI32: the registry calls are in wintz.cpp's uprv_detectWindowsTimeZone. The only caller is uprv_tzname in putil.cpp, and nothing in the ICU common sources built here calls uprv_tzname. So the import comes in with putil's object file, but none of these exports can reach it. I checked that by reading the sources, not by tracing on Windows.

@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 004279d merged onto main b11c7bf · tested 2026-11-04 17:40 UTC · 27 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,818 passed · 17 failed (0 new, 13 also fail on main, 4 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
Vulkan validation ✅ no new validation IDs vs main (1398 tests run on the GPU)
Slow tests (>30 s, GPU tests timed with validation layers) ⚠️ agc_driver_pipeline_journal 124.1 s, ⚠️ agc_driver_graphics 120.1 s, ⚠️ agc_driver_graphics_maps_fallback 118.9 s, ⚠️ agc_driver_bda_device 60.3 s, ⚠️ public_headers 54.9 s
Unstable on main (4, 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_graphics: 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 (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
Validation IDs already present on main (8 IDs in 809 tests)
VUID-VkDeviceCreateInfo-pNext-pNext (809 tests): agc_compute_pipeline_replay, agc_driver, 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, and 801 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 004279dd53f1489267120f26a15961d9b386b6c0 b11c7bf84f5d2f636ff60166cc3371bd071e24d5
git checkout b11c7bf84f5d2f636ff60166cc3371bd071e24d5 && git merge --no-ff 004279dd53f1489267120f26a15961d9b386b6c0
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.

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

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

build docs needs rebase Conflicts with main, rebase needed prx

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants