Raw dependency graph data (JSON)
Skia
Author: Ludovic HENRY ludovic.henry@qti.qualcomm.com
Date: 2026-09-30
Readiness: yellow (clean-distro-build)
Scope: RISC-V (riscv64/linux) support status for Skia
Audience: Technical leadership, resource allocation strategy
Verification policy: Every claim is cross-referenced to a primary upstream source. Items that could not be verified against a second source are marked [NEEDS VERIFICATION].
1. Project Overview
Skia is a 2D graphics library that serves as the rendering engine for Google Chrome, ChromeOS, Android, Flutter, and several other products. It handles rasterization, image decoding, text rendering, path operations, and GPU-accelerated compositing. The library is written in C++ (C++20 minimum, Clang 21 preferred) and exposes a stable C++ API with additional bindings in Python (skia-python), Rust (rust-skia, tiny-skia), and C# (SkiaSharp).
Governance: Skia is sponsored and managed by Google, per skia.org. There is no independent foundation or multi-stakeholder governance body. Reviews happen on Gerrit at skia-review.googlesource.com, gated by a root OWNERS file (wildcard *, broadly open) combined with per-directory OWNERS files, a CQ_COMMITTERS list, AUTHORS, and a CONTRIBUTING guide. Core engineering is performed by the Google Skia team; outside patches must clear OWNERS review and a CLA. There is no publicly documented platform-tier system (unlike LLVM, Rust, or Zig’s Tier 1/2/3 model) and no MAINTAINERS file naming an architecture owner.
License: BSD 3-Clause (copyright 2011 Google Inc.).
Corporate sponsors / contributors with riscv64-adjacent activity: Google (primary; owns all riscv64-relevant reviews), StarFive Technology (Chang Rebecca Swee Fun, build-system CL), ISCAS - Institute of Software, Chinese Academy of Sciences (ANGLE riscv support via dependency roll). Historical wildcard author entries in the broader codebase also include ARM, Intel, Microsoft, Samsung, NVIDIA, Adobe, Meta, Amazon, Collabora, Igalia, LG Electronics, Linaro, JetBrains, Sony Mobile, and Loongson (LoongArch SIMD contributor).
Culture on new ports: The project’s explicit, on-record policy is reactive and CI-gated. On Gerrit CL 668916, maintainer Heather Miller (Google, OWNERS of gn/BUILDCONFIG.gn) gave a Code-Review -1 to a riscv64 GN-detection patch, stating: “Let’s not add this to our build until it is being supported and used. Happy to discuss priority use cases if/when they are there.” Reviewer Ben Wagner (Google) reinforced this on the same CL: “Skia cannot really claim support for an architecture for which it doesn’t have test bots… You may wish to communicate with hcm about possibly supporting riscv.” This establishes CI-bot presence as a precondition for architecture recognition, not a follow-on deliverable. A 2020 skia-discuss thread (“Compiling Skia for RISC-V and POWER,” groups.google.com) shows maintainer Mike Klein never committing to support (“Probably!”, “Gumption, I imagine” when asked how); the requester hit unresolved header-compatibility issues and the thread ended inconclusively.
RISE membership: Google LLC is a RISE Premier Member (one of 8, alongside Alibaba Damo, MediaTek, NVIDIA, Qualcomm, Red Hat, SiFive, Tenstorrent); the RISE member roster lists 20 organizations total, not individual projects, and Skia is not itself a listed RISE project. No RISE blog post (the full 2024-2026 index was checked directly) mentions Skia. The only concrete RISE-adjacent artifact is community (unfunded) work in riseproject-dev/python-wheels building riscv64 wheels for skia-python and skia-pathops, run on RISE’s native riscv64 CI runner fleet (RISE RISC-V Runners, 13,000+ jobs / 197 repos / 87 orgs / 99.78% completion as of May 2026) but authored outside any RISE RFP.
2. Port History and Upstreaming Timeline
| Date | Event | Source |
|---|---|---|
| 2020-07-07 | skia-discuss thread: user asks if RV64GC/POWER compilation is feasible; maintainer Mike Klein replies “Probably!” / “Gumption, I imagine”; requester hits header-compatibility issues, thread ends unresolved | skia-discuss thread |
| 2022-04-05 | SwiftShader dependency roll includes riscv64 marl/LLVM/subzero additions (StarFive-authored upstream, 2022-04-04) | Skia commit 6d59d396 (dependency roll) |
| 2022-12-15 | ANGLE dependency roll includes “Add riscv64 support” | Skia commit f50fe872 (dependency roll) |
| 2023-01-23 | “Disable thinLTO in skia for riscv” - first riscv64-specific commit in Skia’s own gn/gn_to_bp.py, by Aditya Kumar (Google), tied to Android-internal bug b/254713216 |
Gerrit CL 631163, merged 2023-01-31, first shipped in Chrome M112 |
| 2023-02-27 | Premature revert of the thinLTO disable | Gerrit CL 649756, merged, shipped Chrome M113 |
| 2023-02-27/28 | Reland of the thinLTO disable | Gerrit CL 650276, merged, shipped Chrome M113 (same milestone as its own revert) |
| 2023-04-11 | “gn: BUILDCONFIG.gn: add riscv64 architecture detection in gn phase” submitted by Chang Rebecca Swee Fun (StarFive Technology), evidencing a working StarFive VisionFive 2 browser bring-up; blocked by Heather Miller’s Code-Review -1 | Gerrit CL 668916, still open, stalled since 2023-04-27 |
| 2023-05-17 | ANGLE roll includes “[riscv64][android] support 64-bit builds on riscv64” (tao.wang.2261@gmail.com) | Skia commit c4cff376 (dependency roll) |
| 2023-05-22 | Final revert of the thinLTO workaround by Noelle Scobie (Google): “b/254713216 is marked fixed” - thinLTO stays enabled for riscv64 from this point on | Gerrit CL 701418, merged, first shipped Chrome M115 (2023-07-18) |
| 2023-05-29 | ANGLE roll: “[riscv64][android] skip 2nd abi support for pure 64-bit android” | Skia commit 19af8f05 (dependency roll) |
| 2023-11-27 | ANGLE roll: “[riscv] Add riscv support” from yahan@iscas.ac.cn (ISCAS) | Skia commit 9fa62cce (dependency roll) |
| 2025-03-31 | “Add gn and ninja tool download support for riscv64 architecture” submitted by yx g; got Code-Review +1 and briefly Commit-Queue +2 from Eric Boren, then the SkCQ bot revoked the vote: “Author not found in AUTHORS file” | Gerrit CL 972256, still open, stalled since 2025-03-31 |
| 2025-09-16 | “Disable must_tail on GCC when compiling for RISC-V” merged same-day in the skcms sub-repo (Daniel Dilan: Code-Review +1, Commit-Queue +2); internal bug b/444048022, inspired by a patch from Heinrich Schuchardt | skcms Gerrit CL 1056198, merged 2025-09-16; not yet in any Skia release (skcms has no version tags, ships only via a future DEPS roll into a chrome/mNNN branch) |
| 2025-12-08 | SwiftShader roll fixes “riscv64 build problem with LLVM 16” (Levi Zim, rsworktech@outlook.com) | Skia commit 895fa741 (dependency roll) |
Key contributors: Aditya Kumar (Google) authored the initial Android thinLTO workaround; Noelle (Nolan) Scobie (Google) relanded and finally removed it. Chang Rebecca Swee Fun (StarFive Technology) submitted the GN build-system recognition CL that remains blocked 2.5+ years later. yahan@iscas.ac.cn (ISCAS) contributed ANGLE riscv64 support that reached Skia via dependency rolls. Kaylee Lubick (Google) authored the 2025 skcms tail-call fix. yx g submitted the stalled gn/ninja fetch-tooling CL.
Upstreaming status: No single tracking issue for a Skia riscv64 port exists on issues.skia.org, bugs.chromium.org/p/skia, or skia-discuss. RISC-V support in Skia’s own repository is thin and reactive: the net riscv64-specific code change to the Skia source tree (excluding the fully-reverted thinLTO saga and the single-line skcms guard) is effectively zero. Both CLs that would make the GN/Bazel build system and host-tooling fetch scripts formally aware of riscv64 remain open and blocked - 972256 on a procedural AUTHORS-file bot rejection (stalled since 2025-03-31), 668916 on an explicit policy objection (stalled since 2023-04-27). Confirmed directly: gn/BUILDCONFIG.gn, infra/bots/jobs.json, infra/bots/tasks.json, and infra/bots/gen_tasks_logic/gen_tasks_logic.go were read in full and contain zero riscv/riscv64 references. The more active, successfully merged riscv64 enablement work is happening one layer downstream - in SkiaSharp, conda-forge’s skia-feedstock/skia-pathops-feedstock, and the RISE python-wheels project - not in Skia’s own repository (see Sections 9 and 10).
3. Upstream Support Tier
Formal tier policy: None. Skia publishes no tier document. The skia.org About page lists supported platforms as Windows, macOS, iOS, Android, and Linux (x86/ARM); RISC-V is not listed. The de facto policy, stated explicitly on Gerrit CL 668916, is that CI test-bot presence is a precondition for architecture recognition, not a goal to work toward after acceptance.
| Dimension | amd64 | arm64 | riscv64 |
|---|---|---|---|
| Listed as supported | Yes | Yes | No |
| CI bots | Yes (Linux, Mac, Win) | Yes (Android, iOS) | None (confirmed: zero matches in infra/bots/jobs.json, 2,487 lines, and infra/bots/tasks.json, 73,185 lines) |
| Release-blocking | Yes | Yes | Not applicable |
| Official upstream binaries | None (library only) | None (library only) | None (library only) |
| Build system (GN) target_cpu recognition | Full | Full | Absent - falls through BUILDCONFIG.gn without triggering arch-specific logic; CL 668916 to add it is blocked |
| Bazel platform target | linux_x64 defined |
linux_arm64 defined |
Not defined in bazel/platform/BUILD.bazel or bazel/common_config_settings/BUILD.bazel |
| Distro packaging | Debian sid/forky, Ubuntu 26.04 | Debian sid/forky, Ubuntu 26.04 | Debian sid/forky, Ubuntu 26.04 “resolute” (confirmed, see Section 8) |
| SIMD optimizations | Full (SSE through AVX-512) | NEON | None (scalar fallback only) |
4. Technical Architecture and RISC-V-Specific Subsystems
Skia’s architecture-specific performance work lives in src/opts/. src/core/SkOpts.cpp dispatches at runtime between SIMD backends based on SK_CPU_X86 and SK_CPU_LOONGARCH branches only; there is no #elif branch for RISC-V, so Init() falls through and simply returns, leaving whatever generic/portable C++ function pointers were set at compile time in place. This is not a RISC-V-specific scalar implementation - it is the same unspecialized default any unrecognized CPU receives by omission.
include/private/SkFeatures.h / src/core/SkCpu.h define SK_CPU_* macros and runtime feature-detection for x86 (via cpuid), LoongArch (via getauxval), and ARM64/ARM32/PPC. No SK_CPU_RISCV macro and no __riscv or RVV-related guard exists anywhere in the CPU-detection headers. The hand-tuned src/opts/ directory contains dedicated files for LoongArch (e.g. SkOpts_lasx.cpp, 4 files) but zero riscv/RVV files. Skia’s SkVM JIT (used for SkSL runtime-effect code generation) emits native code only for x86-64 and ARM64 register files; riscv64 therefore has no JIT code-generation target and can only ever run the portable bytecode interpreter, not a RISC-V-specific limitation but the absence of any backend at all.
| Component | amd64 (files) | arm64 (approach) | LoongArch (files) | riscv64 |
|---|---|---|---|---|
| Raster pipeline ops | SkOpts_ml3.cpp, SkOpts_ml4.cpp (9 files total) |
Inline NEON guards in shared headers | SkOpts_lasx.cpp (4 files) |
Missing - scalar fallback by omission |
| Blitter/swizzler | SkBlitRow_opts_ml3.cpp, SkSwizzler_opts_ml3.cpp, 5 others |
Inline NEON in headers | SkBlitRow_opts_lasx.cpp, SkSwizzler_opts_lasx.cpp |
Missing |
| Memory ops | SkMemset_opts_avx.cpp, SkMemset_opts_erms.cpp |
Scalar fallback | Scalar fallback | Missing |
| CPU feature detection | SK_CPU_X86, SSE/AVX macros |
SK_CPU_ARM64, SK_ARM_HAS_NEON |
SK_CPU_LOONGARCH, LSX/LASX macros |
No SK_CPU_RISCV, no __riscv detection anywhere |
| Runtime dispatch | SkCpu.cpp reads cpuid |
No runtime dispatch (static NEON) | getauxval check |
Not present; SkOpts::Init() falls through |
| Tail-call pipeline (skcms) | Enabled | Enabled | Data not available: not verified | Disabled via !defined(__riscv) guard in modules/skcms/src/skcms_internals.h (GCC musttail not supported on RV) |
| GPU backends (Graphite/Ganesh, Vulkan/Dawn) | Full | Full | Data not available | Builds via the portable Vulkan path; GPU driver availability on actual riscv64 SoCs (SpacemiT, ESWIN), not the Skia code, is the constraint |
| SkVM JIT | None (x86-64/ARM64 backends exist for SkSL) | Native codegen | None | No RISC-V backend; interpreter-only |
| Hand-written assembly | None in current tree | None in current tree | None | None |
SIMD quality summary: amd64 and arm64 receive hand-tuned intrinsics across raster pipeline, blitting, and memory operations; riscv64 is scalar (width-1) across every one of these components, confirmed by directory listing of src/opts/ and by reading src/core/SkCpu.h and SkOpts.cpp directly - no SK_CPU_RISCV/RVV path is being suppressed or stubbed, it simply does not exist.
5. Build System, Cross-Compilation, and Toolchain
Build system: GN (Generate Ninja) is Skia’s primary and only fully supported build system; there is no configure script and no project CMakeLists.txt for the library itself (a 5-line unrelated test project exists at experimental/lowp-basic/CMakeLists.txt, and infra/docker/cmake-release/ wraps GN to emit a CMake IDE project with no architecture parameter). A migration to Bazel is in progress but incomplete.
riscv64 GN status (confirmed by direct file read): gn/BUILDCONFIG.gn enumerates known target_cpu values as arm64, arm, x64, x86, wasm (plus loong64 branches in gn/BUILD.gn/gn/skia/BUILD.gn for LoongArch-specific cflags). Unrecognized values, including riscv64, pass through without triggering any architecture-specific logic. Gerrit CL 668916 would add an explicit riscv64 detection block but has sat with a Code-Review -1 since 2023-04-27.
Bazel status: bazel/platform/BUILD.bazel defines platforms for linux_x64, mac_x64, mac_arm64, windows_x64, linux_arm64, android_arm32, android_arm64, ios - no riscv64 constraint. bazel/common_config_settings/BUILD.bazel enumerates CPU config settings as x86_64, arm64, wasm only.
Working build path (the Debian/Ubuntu packaging approach, the only one verified to work on riscv64):
bin/gn gen debbuild --args='
is_official_build=true
skia_use_system_expat=true
skia_use_system_harfbuzz=true
skia_use_system_icu=true
skia_use_system_libjpeg_turbo=true
skia_use_system_libpng=true
skia_use_system_libwebp=true
skia_use_system_zlib=true
skia_use_dng_sdk=false
skia_use_wuffs=false
skia_enable_spirv_validation=false
is_component_build=true
skia_so_version=146
'
ninja -C debbuild
No target_cpu is set; GN infers the CPU from the native build host. This works on a native riscv64 machine because GN’s CPU inference does not require the target_cpu string to be a recognized constant for a native (non-cross) build. Cross-compilation to riscv64 is not supported upstream: no riscv64 toolchain stanza exists in gn/toolchain/BUILD.gn (which defines toolchains only for MSVC, gcc_like covering GCC/Clang on Linux/macOS/iOS/tvOS, Android NDK, and Emscripten/WebAssembly), and infra/cross-compile/docker/ contains only a cross-linux-arm64/Dockerfile (built from launcher.gcr.io/google/clang-debian9, using binutils-aarch64-linux-gnu/libc6-dev-arm64-cross); no riscv64 counterpart exists among the repository’s 25 Dockerfiles.
Compiler requirement: C++20 is the general minimum documented at skia.org/docs/user/build (“Clang 21 implements most of the features of the C++20 standard; older compilers that lack C++20 support may produce non-obvious compilation errors”), with Clang preferred for codec/rasterization performance. Debian’s packaging pins GCC 14 minimum. Neither requirement is riscv64-specific; no riscv64 ISA-extension minimum (e.g. RVV, rv64gc profile) is documented anywhere, because riscv64 is not a build system citizen.
Known build issues:
- GCC does not support Clang’s
[[clang::musttail]]/must_tailcodegen on RISC-V. Fixed in the skcms sub-repo via!defined(__riscv)guard, CL 1056198 (merged 2025-09-16). The same failure mode was independently hit and patched downstream: WebKitGTK (which bundles Skia’s skcms module) failed withcannot tail-call: tail call production failedatmodules/skcms/src/Transform_inl.h:810; a meta-oe/OpenEmbedded patch (webkitgtk3 2.50.6, 2026-04-28, author Yi Zhao) setsCXXFLAGS:append:riscv64 = " -DSKCMS_HAS_MUSTTAIL=0"for the same reason. - The thinLTO/riscv64 interaction tracked as Android-internal bug b/254713216 was fully resolved by May 2023; no remaining issue affects GN/Ninja builds.
- The two tool-fetch scripts,
bin/fetch-gnandbin/fetch-ninja, do not recognize riscv64 as a download target - CL 972256, stalled since March 2025, would add it; until it lands, a riscv64 host must build its own GN and Ninja from source. This exact gap was independently hit and worked around by the RISE python-wheels build (PR #2378): “gn compiler built from source (CIPD has no riscv64 gn).” - SwiftShader (Skia’s software rasterizer dependency): a riscv64 build problem with LLVM 16 was fixed by Levi Zim and rolled into Skia on 2025-12-08 (missing forward-declaration includes in
RISCVELFStreamer.hhandling).
QEMU: No QEMU usage is documented anywhere in Skia’s build system; a repository-wide search for the string qemu returned zero matches. The Debian package is built natively on buildd host rv-manda-04. Conda-forge’s skia-feedstock instead cross-compiles riscv64 from a linux-64 host without QEMU, mapping conda platform IDs to GN CPU targets directly.
6. Feature Coverage and Gap Analysis vs arm64 and amd64
| Feature | amd64 | arm64 | riscv64 |
|---|---|---|---|
| Raster pipeline (SkRasterPipeline) | Full SIMD (AVX2/AVX-512) | NEON | Scalar fallback only |
| Image blitting (SkBlitRow, SkSwizzler) | Full SIMD | NEON | Scalar fallback only |
| Color management (skcms) | Intrinsics + tail-call | Intrinsics + tail-call | Scalar; tail-call disabled on GCC via !defined(__riscv) guard |
| Text shaping (HarfBuzz) | Full | Full | Full (no arch-specific code in HarfBuzz) |
| Font rasterization (FreeType) | Full | Full | Full (pure C, no arch-specific code) |
| Image decode - JPEG (libjpeg-turbo) | SIMD (SSE2/AVX2) | SIMD (NEON) | Scalar in the distro-shipped binary; the Ubuntu 26.04 libjpeg-turbo8 package predates the upstream RVV SIMD merge by roughly 3.5 years |
| Image decode - WebP (libwebp) | SIMD (SSE2/NEON) | SIMD (NEON) | An RVV SIMD path exists upstream, gated by compiler version; no riscv64 CI means a Dec-2025 silent-correctness RVV-intrinsic regression (issue #769/PR #771) shipped undetected and was caught only by downstream OpenCV hardware testing |
| Image decode - JPEG XL (libjxl) | SIMD via Highway | SIMD via Highway | RVV dispatch exists in Highway but is gated off at libjxl’s pinned Highway version (open google/highway#2854) |
| GPU - Vulkan (Graphite/Ganesh) | Full | Full | Builds via the portable path; GPU driver availability on real riscv64 SoCs is the gating constraint, not Skia’s Vulkan integration code |
| GPU - Dawn/WebGPU | Full | Full | Builds (CPU/SwiftShader Vulkan fallback path); same GPU-driver-availability constraint |
| Build system recognition | Full | Full | Absent (CL 668916 blocked) |
| CI coverage | Full | Full | None |
Functional gaps: No documented functional gaps. Skia compiles and produces correct output on riscv64 via the scalar fallback; no known NaN or floating-point correctness bug is filed against Skia itself for riscv64. A distinct silent-correctness regression was caught in dependency libwebp (see above) precisely because riscv64 lacks CI - this is a process risk rather than a current known defect.
Performance gaps: All SkRasterPipeline operations, image blitting, swizzling, and memory operations run at scalar (width-1) throughput on riscv64; typical SIMD-vs-scalar deltas for raster pipeline operations of this kind run in the 4x-16x range depending on operation width. Data not available: no published riscv64-vs-arm64 or riscv64-vs-amd64 quantitative Skia benchmark (fps, ms/frame, nanobench/GM deltas) was found in any source searched, including the Skia issue tracker, skia-discuss, the RISE blog (27 posts reviewed across 2024-2026, none Skia-specific), or AOSP. The closest available data point is qualitative: Canonical’s Flutter/Skia RISC-V port (Valentin Haudiquet), tested on StarFive JH7110 hardware under the RVA23 profile, reports “viable frame rates” with GPU acceleration explicitly noted as lagging behind x86/Arm, with no numeric figures published (OMG! Ubuntu, 2025-11-22).
Security hardening gaps: Skia’s PartitionAlloc allocator disables ARM MTE and x86 PKU on architectures that do not support them; both are simply absent on riscv64 with no functional regression. No other riscv64-specific security hardening gap is documented.
7. CI/CD Infrastructure
Skia’s own CI: Skia uses Google’s internal Gerrit Commit Queue plus a bespoke task scheduler defined in infra/bots/. The authoritative job list infra/bots/jobs.json (2,487 lines) and the full generated task graph infra/bots/tasks.json (73,185 lines) were both fetched and decoded directly (not summarized from search) and grepped for “riscv”: zero matches in either file. infra/bots/gen_tasks_logic/gen_tasks_logic.go enumerates architectures as amd64, x86, x86_64, arm, arm64, and wasm only. Sample job names confirm these are the real production files (BazelBuild-core-release-linux_x64, Build-Mac-Clang-arm64-Debug, Test-Android-Clang-Pixel5-GPU-Adreno620-arm64-Release-All-Android). The checkout_riscv64 variable added to depot_tools (rolled into Skia around 2025-05-29) indicates infrastructure awareness but is not wired to any active CI bot in the public repository. [NEEDS VERIFICATION: whether checkout_riscv64 backs any Google-internal Skia CI not visible publicly.]
GitHub: google/skia’s GitHub presence is a source mirror only; it carries no project-authored .github/workflows/ directory. The CodeQL, Dependabot, and Dependency Graph workflows visible there are GitHub-managed dynamic workflows, not Skia-authored CI.
On the “CI-adjacent” riscv64 evidence: None of the riscv64-touching CLs add a CI job. CL 972256 patches only bin/fetch-gn/bin/fetch-ninja (local tooling, not CI config) and is unmerged. CL 668916 patches only BUILDCONFIG.gn and is unmerged. CL 1056198 is a source-code portability fix, not a CI change. The thinLTO CL chain touches gn_to_bp.py (an Android.bp generator), not Skia’s CI job list, and nets to no change (thinLTO re-enabled, same as other architectures). Downstream CI (SkiaSharp, Avalonia, conda-forge feedstocks, skia-python/skia-pathops via RISE) all runs in those projects’ own pipelines, not Skia’s.
| CI dimension | amd64 | arm64 | riscv64 |
|---|---|---|---|
| Build CI | Yes | Yes | No |
| Test CI | Yes | Yes | No |
| GPU CI | Yes | Yes (Android) | No |
| QEMU emulation CI | N/A | N/A | No (zero qemu matches repo-wide) |
| RISE runners used by Skia itself | No | No | No (RISE runners are used only by the downstream python-wheels project, not by Skia’s own CI) |
| Native hardware available | Yes | Yes | No upstream bots; Debian packaging builds natively on buildd host rv-manda-04 |
8. Distribution and Release Status
Upstream binary releases: google/skia publishes no binary releases of any kind, for any architecture; the GitHub mirror is source-only.
Debian: libskia146 / libskia-dev (source package libskia, version 146.20260311+dfsg-4ubuntu1 in the Ubuntu line, and a comparable 146.20260414~git.ef5f213+dfsg-5-series build in Debian sid/forky) builds and ships for riscv64 natively on Debian buildd host rv-manda-04. Confirmed on packages.debian.org (libskia146) and, independently, via the Launchpad archive API: libskia146 in resolute riscv64 has publishing status “Published,” component universe, with an underlying build record showing buildstate: "Successfully built", arch_tag: "riscv64", datebuilt: 2026-04-14, and a real build log. Not available in Debian bookworm (stable).
Ubuntu: Confirmed via packages.ubuntu.com (search for suite resolute, cross-checked via curl after repeated WebFetch 503s) and the Launchpad publishing ledger (an independent source from the HTML scraper): Ubuntu 26.04 “resolute” ships libskia-dev and libskia146 (146.20260311+dfsg-4ubuntu1) for riscv64 alongside amd64, arm64, armhf, ppc64el - all in the universe component. No libskia package exists in Ubuntu Noble, Jammy, or Focal; the only riscv64-available “skia” hits on those older releases are librust-tiny-skia-dev/librust-tiny-skia-path-dev, a separate Rust crate unrelated to Google’s Skia.
PyPI (skia-python): Current version 144.0.post2, 45 release files. Confirmed via direct PyPI JSON API query: platforms covered are macosx_arm64/x86_64, manylinux_2_28_{aarch64,x86_64}, win_amd64/arm64 - zero riscv64 wheels, in this release or any prior one. A plain package literally named skia does not exist on PyPI (404). skia-pathops (current version 0.9.2, 12 files) likewise ships no riscv64 wheel on PyPI; its riscv64 build lives only in the RISE project’s separate wheel index (see Section 10), not on PyPI itself.
Arch Linux RISC-V port: Confirmed via direct query of archriscv.felixc.at: the string “skia” does not appear anywhere on the page. No Skia package exists in the Arch Linux RISC-V unofficial repository.
To get a working riscv64 binary today: Install libskia146/libskia-dev from Ubuntu 26.04 “resolute” or Debian sid/forky on a riscv64 system (the simplest path, and the only one backed by a clean, unpatched upstream-source build - see Section 13), or build from source on a native riscv64 machine using GCC 14+/Clang with the GN args in Section 5 (self-built GN/Ninja required, since CIPD/fetch-gn has no riscv64 binaries). For skia-python or skia-pathops specifically, a user must either build from source or consume the RISE project’s own wheel index, since no riscv64 wheel exists on PyPI.
9. Dependencies
| Dependency | Role / Criticality | riscv64 Build | riscv64 Test | riscv64 Release | Open Issues |
|---|---|---|---|---|---|
| FreeType | Font rasterization (runtime, critical) | Builds cleanly, pure C, no riscv64-specific code | No upstream riscv64 CI | Ubuntu 26.04 resolute (libfreetype6/-dev), Debian sid |
None open |
| HarfBuzz | Text shaping (runtime, critical) | Builds cleanly, zero arch-specific code | No dedicated riscv64 CI; no known failures | Ubuntu 26.04 resolute (12/15 packages, 12.3.2-2), Debian | None found |
| ICU | Unicode/i18n, bidi (runtime, optional) | Builds; no riscv64-specific code | Not CI-gated for riscv64 (23 upstream workflows checked, none riscv64) | Ubuntu 26.04 resolute (libicu78 78.2-2ubuntu1), Debian sid, Arch RISC-V |
None open; CI gap only |
| libpng | PNG codec (runtime, optional) | Builds; an RVV filter path exists upstream, off by default and gated to a libpng16 branch not shipped as the default libpng18 | No dedicated riscv64 CI | Ubuntu 26.04 resolute (libpng16-16t64/-dev 1.6.57-1) |
Issue #705 (configure.ac arch override), closed 2025-07-05 |
| libjpeg-turbo | JPEG codec (runtime, optional) | Builds; Ubuntu 26.04 package predates the upstream RVV SIMD merge by ~3.5 years, so riscv64 users get scalar-only performance | Partial; no dedicated riscv64 CI | Ubuntu 26.04 resolute (2.1.5-4ubuntu4, scalar-only) | RVV SIMD merge delayed 3.5 years on funding/hardware/review; package lag is the open risk, not a build blocker |
| libwebp | WebP codec (runtime, optional) | Builds; an RVV SIMD path exists, gated by compiler version | No riscv64 CI; a Dec-2025 silent-correctness regression (bad RVV intrinsic, issue #769/PR #771) shipped undetected, caught only via downstream OpenCV hardware testing | Ubuntu 26.04 resolute (libwebp7 etc., 1.5.0-0.1build1) |
No open blockers; CI gap is the top flagged risk |
| libavif | AVIF codec (runtime, optional) | Builds; depends on dav1d (RVV, partial checklist coverage) and SVT-AV1 (no RVV) | QEMU-only CI for dav1d, no native riscv64 hardware | Ubuntu 26.04 resolute (libavif16 1.3.0-1ubuntu4, 8 archs) |
Open dav1d GitLab #463 (static cross-link), MR !1825 stalled |
| libjxl | JPEG XL codec (runtime, optional) | Builds cleanly; depends on Highway for SIMD | No riscv64 CI upstream | Ubuntu 26.04 resolute (libjxl0.11/-dev 0.11.1-6ubuntu4, lags primary archs on security patch level) |
Depends on Highway; RVV dispatch gated off at libjxl’s pinned Highway version (open google/highway#2854) |
| libyuv | YUV/RGB color conversion, image scaling (runtime, optional) | Not independently researched this cycle | Not researched | Not researched | Data not available: no dedicated status check performed |
| brotli | Compression, WOFF2 font paths (runtime, optional) | riscv64 support (BROTLI_TARGET_RISCV64) has been upstream since 2018 |
No upstream riscv64 CI/binaries | Contradictory Ubuntu 26.04 resolute data: one check found riscv64 present (1.2.0-3build1), an adversarial re-check via Debian’s madison tool found it absent for Ubuntu specifically; satisfied regardless via Debian sid/Alpine edge | RVV perf PR #1410 stalled on CLA; not a correctness blocker |
| expat | XML parsing (runtime, optional) | Builds; riscv64 has build+test CI parity with amd64 via an emulated qemu.yml workflow |
Yes (QEMU) | Ubuntu 26.04 resolute (libexpat1/-dev 2.7.4-1, ports component) |
None open; the strongest-rated dependency in this set |
| zlib | Compression (runtime, optional) | Builds, pure C, no arch-specific fast path | CI only via an OpenBSD/riscv64 vm-action, not native Linux | Ubuntu (zlib1g/-dev 1:1.3.dfsg-3.1ubuntu2, confirmed on 24.04 noble; near-certain on 26.04 given package universality) |
None |
| Abseil | C++ base/utility library, used by Skia and Dawn (runtime, critical) | Builds; riscv64 stack unwinder upstream | No dedicated riscv64 test gate | Ubuntu 26.04 resolute (libabsl-dev/libabsl20260107 20260107.0-4) |
#1986 CRC32C HW-accel PR blocked on Google obtaining RISC-V hardware (“internal champion required” governance bottleneck, not a technical objection); #2002 hashtablez/cordz test SEGFAULT on Debian riscv64, open, no upstream response |
| PartitionAlloc | Memory allocator used in Clang builds (runtime, critical) | Builds; ARM MTE and x86 PKU hardening gracefully disabled (both absent on riscv64 by design, not a regression) | No dedicated riscv64 CI known | Bundled in Chromium/Skia | None |
| Vulkan | GPU backend for Graphite/Ganesh (runtime, critical) | Builds (headers/loader are portable C) | Requires Vulkan-capable riscv64 hardware for meaningful testing | Bundled | Real risk is GPU-driver availability on actual riscv64 SoCs (SpacemiT, ESWIN), not the Vulkan SDK components themselves |
| VulkanMemoryAllocator | Vulkan allocator helper (runtime, optional) | Portable C++; a vendored-version snprintf header gap surfaced during SkiaSharp’s riscv64 bring-up (clang-19/Alpine cross-compile), fixed via SkiaSharp follow-up PR #3194 |
No dedicated riscv64 CI | Bundled | None open against VMA upstream itself |
| dawn | WebGPU implementation (runtime, optional) | docs/building.md lists only x86-64/arm64 as supported Linux archs; isolated riscv64 macros added in 2022; a CIPD riscv64-detection PR (#78) closed unmerged |
No riscv64 CI | Not released independently of Chromium | SwiftShader (critical path for headless/no-GPU riscv64) is the concrete named blocker |
| SPIRV-Tools | SPIR-V validation/optimization (runtime, optional) | Portable C++, no arch-specific code expected | Not independently researched | Not researched | None flagged; characterized as a non-concern by the Khronos/Vulkan-stack review done for dawn |
| SPIRV-Cross | SPIR-V to GLSL/HLSL/MSL cross-compiler (runtime, optional) | Portable C++ | Not researched | Not researched | None flagged |
| wuffs | Fast image decoding (PNG, GIF) (runtime, optional) | Builds; no riscv64 SIMD intrinsics | No riscv64 CI | Bundled | None |
| angle | GLES-over-native-GPU-API translation layer (runtime, optional) | 4 merged riscv64-enabling CLs (narrow scope: TLS handling, Android GN build fix) via ISCAS/StarFive/Google contributors | No riscv64 CI; zero riscv64 LUCI builders or GitHub releases found | No formal releases for any arch (rolled via Chromium) | Transitively depends on SwiftShader, which carries the real open riscv64 history |
| SwiftShader | CPU-based Vulkan/GL software renderer, used by Dawn/ANGLE/Skia’s GPU fallback (runtime, optional) | LLVM-based JIT (Reactor) has explicit riscv64 code-model guards; functional since 2023; a 2025-12-08 LLVM-16 build fix (Levi Zim) rolled into Skia | Not release-blocking, commit-queue gated only | No standalone releases (vendored) | Most actively maintained riscv64 path in this dependency group (StarFive + Google + independent commits through 2026); remains the named blocker for Dawn’s/ANGLE’s software-rendering fallback until fully mature |
| Highway | SIMD abstraction library used by libjxl and optionally Skia’s own raster pipeline (runtime, critical) | Builds; RVV backend upstream since 2021 | No dedicated riscv64 test gate; QEMU CI discussed but not confirmed merged [NEEDS VERIFICATION] | No upstream binary; Debian sid packages libhwy |
#2554 Clang 20 reports undeclared RVV intrinsics, open since April 2025, no fix (GCC and Clang <20 unaffected); #2854 mold linker .riscv.attributes issue (workaround: use ld.bfd/ld.lld); #2738 -march mismatch on RVA23 |
| GN | Build-dependency, critical | No precompiled riscv64 binary exists in CIPD; bin/fetch-gn lacks a riscv64 dictionary entry (stalled CL 972256) |
N/A (tooling, not a library) | Must be built from source on riscv64 hosts; this exact gap was hit and worked around independently by both the RISE python-wheels build and conda-forge’s skia-feedstock | Core blocker for frictionless riscv64 developer onboarding |
| Ninja | Build-dependency, critical | Same bin/fetch-ninja gap as GN, same stalled CL 972256 |
N/A | Must be built from source or obtained from distro packages | Same CL 972256 blocker |
| GCC | Build-dependency, critical | Debian packaging pins GCC 14 minimum; does not support Clang’s musttail attribute on RISC-V, requiring the skcms guard (CL 1056198) |
N/A | Ships natively via Debian/Ubuntu riscv64 archives | musttail-support gap is the one named GCC-specific riscv64 build issue |
| LLVM | Build-dependency, optional (Clang path) | Clang 21 preferred per skia.org build docs for C++20 feature completeness and codec/rasterization performance; no riscv64-specific minimum documented | No riscv64-specific CI noted | Ships via distro packages | None specific to Skia’s use; general RISC-V backend maturity tracked separately in LLVM itself |
| glslang | GLSL to SPIR-V shader compiler (build-dependency, optional) | Portable C++, no arch-specific code expected | Not independently researched | Not researched | None flagged |
Additional indirect dependencies identified via research (transitive, Vulkan/SPIR-V stack): SPIRV-Headers (header-only, architecture-neutral), Vulkan-Headers, Vulkan-Loader, and Vulkan-ValidationLayers - all characterized, in the research done for dawn and VulkanMemoryAllocator, as pure portable C/C++ with no architecture-specific code; the real riscv64 risk in this stack is GPU-driver availability on actual riscv64 hardware (SpacemiT, ESWIN SoCs), not these libraries.
Highway deep-dive (critical path): Highway’s RVV backend has been upstream since 2021, with runtime dispatch re-enabled in April 2026 (PR #2968, per the prior report’s tracking). The blocking issue for production use with modern toolchains is #2554: Clang 20 reports undeclared RVV intrinsics, open since April 2025 with no fix; GCC and Clang versions below 20 are unaffected. This directly affects libjxl’s RVV path within Skia’s dependency chain.
Abseil-cpp deep-dive: #2002 documents test SEGFAULTs for absl_hashtablez_sampler_test and absl_cordz_sample_token_test specifically on Debian riscv64, open with no upstream response. These are test-only failures to date; library correctness under normal use is not confirmed to be affected but cannot be ruled out given the lack of riscv64 CI or upstream response.
10. Ecosystem Status
Skia itself is a C++ library with no package-manager-native plugin ecosystem, but it has a substantial dependent-binding ecosystem that must independently add riscv64 support on top of Skia’s own (begrudging, ad-hoc) buildability - and in practice this downstream layer is where almost all of the real, successfully-merged riscv64 enablement work has happened.
SkiaSharp (.NET bindings): mono/SkiaSharp#3191 requested riscv64 flavors of libSkiaSharp/libHarfBuzzSharp (opened 2025-03-08); PR #3192 added linux-riscv64/linux-musl-riscv64 build targets, merged 2025-03-12 (3 days), baselined on Debian 12 + Clang 19. A follow-up fix (PR #3194) addressed a missing snprintf header surfaced by a stale vendored VulkanMemoryAllocator during the riscv64 bring-up. This was then consumed by AvaloniaUI/Avalonia#18571 (merged 2025-05-19), which bumped Avalonia’s SkiaSharp/HarfBuzzSharp dependency to pull in the new riscv64 (and LoongArch64) native libraries.
conda-forge: skia-feedstock PR #2 (merged) added riscv64 to the libskia conda build matrix, cross-compiled from linux-64 since no CIPD riscv64 gn exists. skia-pathops-feedstock PR #38 (merged 2026-09-25) mirrored this for skia-pathops, built in-container; a notable constraint is that python_min resolves to 3.14 on riscv64 (3.11 is unavailable there), giving the abi3 extension a cpython>=3.14 floor rather than the usual 3.11 baseline.
RISE python-wheels (skia-python, skia-pathops): riseproject-dev/python-wheels#1895 (opened 2026-09-13, status open/unassigned) tracks the request for a published riscv64 skia-python wheel. PR #1697 (merged 2026-09-12) built skia-python 144.0.post2 for riscv64 cp312/cp313/cp314/cp314t, bootstrapping GN from source, dropping musllinux, and patching GPU-context tests to skip on riscv64 since the Rocky 10 build image has no virtual X server. PR #2378 (merged 2026-09-28) built skia-pathops 0.9.2 for riscv64 as a Cython extension statically linked against a slimmed-down Skia (no GPU/codecs/fonts), with libskia itself built in-container via skia-builder’s build_skia.py since no riscv64 upstream binary exists. Both are unfunded/community-contributed (author luhenry) under the RISE Project’s Python Wheels initiative, run on the RISE RISC-V Runners native CI fleet (riseproject-dev/riscv-runner). This work is not reflected on PyPI - the riscv64 wheels are published only to RISE’s own package index, confirmed by the fact that pypi.org/pypi/skia-python/json and pypi.org/pypi/skia-pathops/json list no riscv64 files as of this check.
Flutter (consumes Skia as its rendering engine): No official Google-built Flutter engine exists for riscv64. Canonical’s own port (Valentin Haudiquet; flutter/flutter#178711 and #178712) cross-compiles the Flutter engine for RISC-V and targets Ubuntu 25.10 for a “fully functional desktop session,” tested on StarFive JH7110 hardware with GPU acceleration explicitly lagging x86/Arm. Downstream tooling has not caught up: leoafarias/fvm#969 (closed 2025-11-12) documents the Flutter Version Manager fetching the wrong (arm64) Dart SDK/engine binary on riscv64 hosts, causing Exec format error, because no prebuilt riscv64 engine binary exists upstream.
Ecosystem coverage summary: Of the major consumer bindings, SkiaSharp (and its consumer Avalonia) has shipped riscv64 support in production since March-May 2025; conda-forge’s two feedstocks shipped in September 2026; RISE’s python-wheels builds exist but are not on PyPI and remain an open tracking issue; and Flutter’s riscv64 engine remains an unofficial, community-driven port with no numeric performance data published. None of this ecosystem work depends on, or is blocked by, the two stalled Gerrit CLs in Skia’s own repository - each downstream project works around the gap independently with hand-rolled GN/toolchain overrides.
11. Known Bugs and Active Issues
| ID | Title | Project | Status | Severity | Notes |
|---|---|---|---|---|---|
| Gerrit CL 668916 | gn: BUILDCONFIG.gn: add riscv64 architecture detection | Skia | Open, blocked since 2023-04-27 | Blocker for build-system formalization | Heather Miller (Google) Code-Review -1: “not until there are test bots” |
| Gerrit CL 972256 | Add gn and ninja tool download support for riscv64 | Skia | Open, stalled since 2025-03-31 | Blocker for frictionless developer tooling | Had Code-Review +1 and briefly Commit-Queue +2; SkCQ bot revoked it, “Author not found in AUTHORS file” |
| skcms CL 1056198 | Disable must_tail on GCC when compiling for RISC-V | skcms | Merged 2025-09-16 | Fixed correctness/build issue | GCC musttail/tail-call unsupported on RV; independently also hit and patched by WebKitGTK’s meta-oe recipe |
| mono/SkiaSharp#3191 / #3192 | riscv64 build support | SkiaSharp | Closed / merged 2025-03-12 | Resolved | Fast turnaround (3 days); follow-up VMA snprintf fix in PR #3194 |
| riseproject-dev/python-wheels#1895 | skia-python riscv64 support | RISE python-wheels | Open, unassigned | Medium - blocks PyPI availability | Build exists (PR #1697); not yet published to a riscv64-visible index on PyPI |
| Highway #2554 | Clang 20 RVV intrinsics undeclared | Google Highway | Open since 2025-04, no fix | Medium (Clang 20 only) | Breaks the Highway-accelerated path used by libjxl within Skia’s dependency chain; GCC and Clang <20 unaffected |
| Highway #2854 | mold linker .riscv.attributes issue |
Google Highway | Open | Low (workaround known) | Use ld.bfd or ld.lld instead of mold |
| Abseil-cpp #2002 | hashtablez/cordz test SEGFAULT on Debian riscv64 |
Abseil-cpp | Open, no upstream response | Low (test-only confirmed) | Possible library-correctness implication not ruled out given no upstream response and no riscv64 CI |
| Abseil-cpp #1986 | CRC32C hardware-acceleration PR | Abseil-cpp | Open since Dec 2025 | Low | Blocked on Google obtaining riscv64 hardware; a governance/resourcing bottleneck, not a technical objection |
| libwebp issue #769 / PR #771 | Bad RVV intrinsic, silent correctness regression | libwebp | Fixed, but shipped undetected for a period | Medium (illustrates the CI-gap risk) | Caught only via downstream OpenCV hardware testing, not libwebp’s own CI |
| b/254713216 | thinLTO failure on riscv64 in Android build | Android internal | Closed/Fixed 2023-05 | Historical | Resolved via a Soong-side global emulated-TLS fix; the Skia-side workaround was fully reverted once this closed |
No known correctness bugs in Skia’s own core rendering code on riscv64 are publicly documented. The scalar fallback produces correct output; the one correctness-adjacent regression found in this research cycle (libwebp’s RVV intrinsic bug) occurred in a dependency, not in Skia itself, and underscores the risk created by the absence of riscv64 CI across the whole dependency chain rather than a defect in Skia’s own code.
12. Objections and Upstream Blockers
Stated policy blocker (primary): Heather Miller (Google, OWNERS of gn/BUILDCONFIG.gn), Code-Review -1 on CL 668916: “Let’s not add this to our build until it is being supported and used. Happy to discuss priority use cases if/when they are there.” Ben Wagner (Google) on the same CL: “Skia cannot really claim support for an architecture for which it doesn’t have test bots.” This is an explicit, unambiguous precondition: riscv64 CI must exist before Skia will formally recognize the architecture in its build system, not the other way around.
Procedural blocker: CL 972256 shows that even a narrowly-scoped, policy-uncontroversial patch (adding riscv64 to tool-fetch scripts) can stall indefinitely on process friction alone - it had a reviewer’s Code-Review +1 and a brief Commit-Queue +2, but the commit-queue bot revoked the vote because the author’s email was not in the AUTHORS file, and no one has since re-submitted or fixed the AUTHORS entry.
Resource blocker: No Google-funded riscv64 CI infrastructure exists for Skia. Google is a RISE Premier Member but has not directed RISE funding specifically toward Skia riscv64 enablement; the only RISE-adjacent riscv64 work on Skia-derived packages (skia-python, skia-pathops) is unfunded, community-contributed work by a single author (luhenry) under the Python Wheels initiative.
No public roadmap item: No master tracking issue exists on issues.skia.org, bugs.chromium.org/p/skia, or skia-discuss for a riscv64 port. No AOSP external/skia branch addresses riscv64 specifically.
Technical blockers for performance work (should the policy blocker be cleared):
- No
SK_CPU_RISCVmacro and no__riscvdetection inSkFeatures.h/SkCpu.h- required before any RVV SIMD work can begin. SkRasterPipeline_opts.hhas no RVV dispatch path - requires a parallel implementation alongside the existing NEON/AVX2/LASX paths.src/core/SkCpu.cpphas nogetauxval(AT_HWCAP)RISC-V runtime detection for RVV - required for dynamic dispatch.gn/opts.gniandsrc/opts/BUILD.bazelwould need riscv64-specific entries to compile any newSkOpts_rvv.cpp.- Highway #2554 (Clang 20 RVV intrinsics undeclared) must be resolved before Highway-accelerated dependency paths (libjxl) work reliably with modern Clang on riscv64.
Acceptance probability: Low in the near term without an external organization providing durable CI infrastructure and sustained engineering. The LoongArch precedent (4 dedicated files in src/opts/, full LASX raster-pipeline support) demonstrates that Google does accept third-party architecture contributions when CI coverage is provided and the port is actively maintained - but StarFive’s 2023 attempt (CL 668916) stalled specifically because it arrived without CI infrastructure attached. A contribution package including CI bots (or an accepted QEMU-based alternative), CPU detection, and at least a stub SkOpts_rvv.cpp would be necessary, though per Heather Miller’s -1, not automatically sufficient, to clear the stated bar.
13. Readiness Assessment
- Color: yellow (clean-distro-build)
- Release provider: distro
Justification: Skia has zero riscv64 CI of any kind in its own infrastructure, confirmed by directly reading infra/bots/jobs.json, infra/bots/tasks.json, and infra/bots/gen_tasks_logic/gen_tasks_logic.go, which enumerate amd64/x86/arm/arm64/wasm only, plus a repository-wide search finding no “riscv” string in any CI task-generation file. On Gerrit CL 668916, maintainer Heather Miller explicitly declines to add riscv64 build-system recognition: “Let’s not add this to our build until it is being supported and used.” With no upstream CI, the project falls to the distribution floor: Debian sid/forky and Ubuntu 26.04 “resolute” both build and ship libskia146/libskia-dev for riscv64 natively (Debian buildd host rv-manda-04; packages.debian.org/sid/libskia146), and no riscv64-specific packaging patches were found in this research - the one riscv64 build fix identified (the skcms must_tail guard in CL 1056198) was merged into upstream source itself, not applied as a downstream distro patch. This is therefore a clean, unpatched distro build, which sets the color to yellow rather than orange. Skia is a general-purpose 2D rendering/graphics library, not a SIMD/compression/crypto speed-optimization library, so the optimization-purpose modifier does not apply even though its raster pipeline currently falls back to scalar code on riscv64 - the “Optimization level” field is therefore omitted from this report’s header.
Pending work that could change the grade: Two stalled Gerrit CLs could change the CI picture if they land: 972256 (gn/ninja riscv64 tool-fetch support, blocked on an AUTHORS-file bot rejection since 2025-03-31) and 668916 (GN BUILDCONFIG.gn riscv64 target_cpu detection, blocked by a Code-Review -1 since 2023-04-27, pending upstream CI bots). No RISE funding or RISE blog coverage targets Skia itself, though RISE-adjacent community work (riseproject-dev/python-wheels PR #1697/#2378) builds riscv64 wheels for skia-python and skia-pathops downstream of upstream Skia source. Open issues in transitively-critical dependencies - Google Highway #2554 (Clang 20 RVV intrinsics undeclared) and Abseil-cpp #2002 (riscv64 test SEGFAULTs) - could also affect the grade if they regress the clean build.
14. Investment Analysis
RISE has directed no funded work at Skia itself; the only RISE-adjacent activity is unfunded community work on downstream wheel packaging (skia-python, skia-pathops). The full scope below is therefore open, and none of it should be treated as already covered by RISE.
14.1 Functional Enablement
- Add
SK_CPU_RISCVdetection and__riscvguards toinclude/private/SkFeatures.h. - Add riscv64
target_cpuhandling togn/BUILDCONFIG.gnand a corresponding platform tobazel/platform/BUILD.bazel- effectively a rework of the stalled CL 668916 with CI evidence attached, since that is the maintainers’ stated precondition. - Add
getauxval(AT_HWCAP)RISC-V vector detection tosrc/core/SkCpu.cpp. - Create a stub
src/opts/SkOpts_rvv.cpp(even if initially empty) and wire it intogn/opts.gniandsrc/opts/BUILD.bazel. - Re-submit or fix CL 972256 (AUTHORS-file issue) so
bin/fetch-gn/bin/fetch-ninjasupport riscv64 hosts.
14.2 Performance Optimization
In order of estimated impact:
- SkRasterPipeline RVV backend (
src/opts/SkRasterPipeline_opts.h): implements the core fill, compositing, and color-conversion operations using RISC-V Vector intrinsics - the single largest performance lever, covering the entire raster path. - SkBlitRow / SkSwizzler RVV: bitmap blit and pixel-format conversion; high throughput impact for image compositing.
- SkBitmapProcState RVV: bilinear and nearest-neighbor sampling in image shaders.
- skcms RVV color conversion + tail-call re-enable: re-enable the tail-call transform pipeline on riscv64 (contingent on a GCC fix or a Clang-based build) and add RVV color-conversion intrinsics.
- Dependency-level RVV work: libjpeg-turbo’s RVV SIMD exists upstream but the distro package is ~3.5 years stale; validating and refreshing packaging would unlock it for Skia’s JPEG decode path without any Skia-side code change. libwebp has no RVV SIMD at all for YUV conversion/IDCT; implementing it would benefit all WebP-heavy workloads.
14.3 CI/CD Infrastructure
This is the gating investment - per the maintainers’ own stated policy, no upstream patch touching architecture recognition will be accepted without it.
- Provision riscv64 CI bots on Google’s Swarming infrastructure, or negotiate acceptance of QEMU-based runners (or RISE’s native riscv64 runner fleet, already proven at scale on the downstream python-wheels project) as a precondition for accepting patches.
- Wire the existing
checkout_riscv64depot_tools variable (present since May 2025) to at least a build-only CI task ininfra/bots/gen_tasks_logic/. - Add a riscv64 cross-compile Dockerfile to
infra/cross-compile/docker/, parallel to the existingcross-linux-arm64/.
14.4 Ecosystem Enablement
- skia-python riscv64 wheel to PyPI: The RISE python-wheels project has already built riscv64 wheels for skia-python (PR #1697) and skia-pathops (PR #2378); the remaining gap, tracked in open issue #1895, is getting those wheels onto PyPI itself rather than only RISE’s own index. Low-to-moderate effort, since the build recipe already exists.
- rust-skia / tiny-skia riscv64:
fetch-gn’s lack of a riscv64 binary (same root cause as CL 972256) blocks Rust-ecosystem builds that rely on precompiled GN; resolving CL 972256 upstream would unblock this with no additional Rust-specific work required. - Flutter engine riscv64: Canonical’s community port (flutter/flutter #178711/#178712) is the only path today; it is unofficial and has no published performance data. Engaging with or upstreaming this effort would close a real gap for Flutter/riscv64 desktop use cases, though this is Flutter-project work, not Skia-project work, and should be scoped and owned separately.
14.5 Summary Table
| Area | Work Item | Effort (person-weeks) | Owner | Priority |
|---|---|---|---|---|
| Functional | CPU detection macros + GN/Bazel build recognition (rework of CL 668916 with CI evidence) | 1 | Qualcomm / external contributor | Critical |
| Functional | Fix/resubmit CL 972256 (gn/ninja riscv64 tool fetch, AUTHORS-file issue) | 1 | External contributor | High |
| CI/CD | riscv64 build CI on Skia’s own infrastructure (Swarming or accepted QEMU/RISE-runner alternative) | 3 | Qualcomm + Google negotiation | Critical (gates all upstream acceptance per stated policy) |
| CI/CD | Cross-compile Docker image for riscv64 | 1 | External contributor | High |
| Performance | SkRasterPipeline RVV backend (SkRasterPipeline_opts.h) |
8 | Qualcomm | High |
| Performance | SkBlitRow + SkSwizzler RVV | 4 | Qualcomm | High |
| Performance | SkBitmapProcState RVV (image sampling) | 3 | Qualcomm | Medium |
| Performance | skcms RVV color conversion + tail-call re-enable | 3 | Qualcomm | Medium |
| Performance | libwebp RVV SIMD (YUV + IDCT) | 6 | External / RISE RFP | Medium |
| Ecosystem | Publish skia-python / skia-pathops riscv64 wheels to PyPI (close issue #1895) | 1 | RISE python-wheels contributor | Medium |
| Ecosystem | libjpeg-turbo riscv64 packaging refresh (validate existing RVV SIMD in distro) | 1 | External / RISE | Low |
15. References
- Skia source repository (Gerrit-hosted)
- Skia homepage
- Skia About page (supported platforms)
- Skia build documentation
- Gerrit CL 668916 - riscv64 BUILDCONFIG.gn detection (stalled)
- Gerrit CL 972256 - gn/ninja riscv64 tool fetch support (stalled)
- Gerrit CL 631163 - Disable thinLTO for riscv
- Gerrit CL 649756 - Revert thinLTO disable
- Gerrit CL 650276 - Reland thinLTO disable
- Gerrit CL 701418 - Final revert of thinLTO disable
- skcms Gerrit CL 1056198 - Disable must_tail on GCC for RISC-V
- skia-discuss thread - Compiling Skia for RISC-V and POWER (2020)
- Debian libskia146 package (sid, riscv64)
- mono/SkiaSharp issue #3191 - riscv64 flavor request
- mono/SkiaSharp PR #3192 - Add riscv64 build support
- AvaloniaUI/Avalonia PR #18571 - SkiaSharp/HarfBuzzSharp version bump for riscv64
- conda-forge/skia-feedstock PR #2 - Add linux-riscv64 build
- conda-forge/skia-pathops-feedstock PR #38 - Add linux-riscv64 build
- riseproject-dev/python-wheels issue #1895 - skia-python riscv64 support
- riseproject-dev/python-wheels PR #1697 - skia-python riscv64 wheel build
- riseproject-dev/python-wheels PR #2378 - skia-pathops 0.9.2 riscv64 wheel
- RISE project homepage
- RISE RISC-V Runners, six weeks in (May 2026)
- RISE easy installation of binary Python packages on riscv64 (May 2025)
- Igalia blog - Boosting RISC-V application performance, LLVM journey
- flutter/flutter PR #178711 - get toolkit working on RISC-V
- flutter/flutter PR #178712 - cross-compile Flutter engine for RISC-V
- OMG! Ubuntu - Canonical’s Flutter/Skia RISC-V port
- leoafarias/fvm issue #969 - wrong arch64 engine fetched on riscv64
- skia-python on PyPI
- skia-pathops on PyPI
- Google Highway issue #2554 - Clang 20 RVV intrinsics undeclared
- Google Highway issue #2854 - mold linker .riscv.attributes
- Google Highway issue #2738 - -march mismatch on RVA23
- Abseil-cpp issue #1986 - CRC32C hardware acceleration PR
- Abseil-cpp issue #2002 - test SEGFAULT on Debian riscv64
- Abseil-cpp issue #1702 - missing -latomic on riscv64 cross-compile
- Arch Linux RISC-V unofficial port