Files
marfrit-packages/arch/chromium-fourier/PKGBUILD
T
marfrit 58f67d4b2c chromium-fourier: bump to 148.0.7778.178, add Debian recipe
Arch: version 147→148, drop enable_nacl (removed upstream), fix
nv12-external-oes patch context for 148 (base/numerics/safe_conversions.h
include removed upstream). Header comment updated: native build fiction →
cross-compile reality.

Debian: new build-deb.sh that assembles .deb from pre-built artifacts
on CT 220 (data). Same binary artifacts as the Arch package, launcher at
/usr/bin/chromium-fourier (no Conflicts with stock chromium on Debian).

Both packages published to packages.reauktion.de:
- Arch: marfrit/aarch64/chromium-fourier 1:148.0.7778.178-1
- Debian: trixie+bookworm/main/arm64 chromium-fourier 1:148.0.7778.178-1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-24 09:45:30 +02:00

265 lines
8.8 KiB
Bash

# Maintainer: Markus Fritsche <mfritsche@reauktion.de>
#
# Chromium with V4L2 HW video decode unlocked on Linux for Rockchip
# (RK3566 hantro / RK3588 VDPU381) on **mainline** kernel + Wayland +
# panfrost / panthor — no vendor MPP, no Mali blob, no panfork, no
# 5.10 BSP kernel. Fills the niche that 7Ji's chromium-mpp explicitly
# does not (it forces BSP + X11 + vendor stack); see STUDY.md and
# NEXT.md alongside this PKGBUILD for the full rationale and the
# validation log on PineTab2 (RK3566).
#
# Cross-compiled from x86_64 using chromium's bundled clang (upstream
# LLVM doesn't ship clang 23+ yet; chromium's internal fork is required).
# Runtime target is aarch64. The three patches are architecture-independent.
pkgname=chromium-fourier
pkgver=148.0.7778.178
pkgrel=1
epoch=1
pkgdesc='Chromium with V4L2VDA HW video decode unlocked for mainline Linux Wayland on Rockchip'
arch=('aarch64' 'x86_64')
url='https://www.chromium.org/Home'
license=('BSD-3-Clause')
depends=(
alsa-lib
at-spi2-core
cairo
cups
dbus
fontconfig
freetype2
gtk3
hicolor-icon-theme
libdrm
libpulse
libva
libxcb
libxkbcommon
mesa
nspr
nss
pango
pciutils
pipewire
ttf-liberation
v4l-utils
wayland
)
makedepends=(
clang
elfutils
gn
gperf
java-runtime-headless
libxslt
lld
ninja
nodejs
npm
python
qt5-base
qt6-base
re2
rust
rust-bindgen
)
optdepends=(
'qt6-base: for Qt6 toolkit integration'
)
provides=(chromium)
conflicts=(chromium)
options=('!lto' '!strip')
# Canonical chromium release tarball (5.7 GB compressed). Versions track
# the chromium release schedule (see https://chromiumdash.appspot.com).
# When bumping pkgver the patches may need their hunk line numbers
# refreshed against the new tree — they are written against
# media/base/media_switches.cc and ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc
# which both move around between minor releases.
source=(
"https://commondatastorage.googleapis.com/chromium-browser-official/chromium-${pkgver}.tar.xz"
'patches/enable-v4l2-decoder-default.patch'
'patches/wayland-allow-direct-egl-gles2.patch'
'patches/nv12-external-oes-on-modifier-external-only.patch'
)
sha256sums=(
'SKIP'
'SKIP'
'SKIP'
'SKIP'
)
prepare() {
cd "${srcdir}/chromium-${pkgver}"
# Fourier patch 1/2: flip kAcceleratedVideoDecodeLinux's default to
# enabled when USE_V4L2_CODEC is the build's HW decode path. Without
# this the runtime master gate stays off on USE_V4L2_CODEC-only builds
# and chrome silently falls back to ffmpeg software decode. See the
# patch header for the validation log on RK3566 hantro.
patch -Np1 -i "${srcdir}/patches/enable-v4l2-decoder-default.patch"
# Fourier patch 2/3: re-allow the direct EGL/GLES2 path in the Wayland
# ozone surface factory so panfrost's EGL_EXT_image_dma_buf_import
# surfaces to chrome's GL display, lighting up the NV12 zero-copy
# native-pixmap pipeline. The launcher defaults to ANGLE (DCHECK in
# gl_context_egl.cc:241 fires on direct EGL with non-official builds);
# this patch keeps the direct path available for users who flip
# is_official_build=true and want the lower-CPU pipeline.
patch -Np1 -i "${srcdir}/patches/wayland-allow-direct-egl-gles2.patch"
# Fourier patch 3/3: pick GL_TEXTURE_EXTERNAL_OES for NV12 dmabufs
# whose DRM modifier is advertised external_only by the EGL driver.
# On panfrost / panthor every NV12 modifier (LINEAR + AFBC + AFRC) is
# external_only; chromium's default OzoneImageGLTexturesHolder picked
# GL_TEXTURE_2D and ANGLE then rejected the YUV EGLImage on a
# non-EXTERNAL_OES target, forcing the NV12->AR24 software conversion
# fallback. This closes that gap and enables the actual zero-copy
# path. Validated on ohm (RK3566 hantro): 1080p30 H.264 drops from
# ~131% combined CPU to ~34.7% (~3.8x). See patches/0004 for context.
patch -Np1 -i "${srcdir}/patches/nv12-external-oes-on-modifier-external-only.patch"
# Use system node, system java
case "$CARCH" in
aarch64) _node_dir=node-linux-arm64 ;;
x86_64) _node_dir=node-linux-x64 ;;
esac
rm -f "third_party/node/linux/${_node_dir}/bin/node"
mkdir -p "third_party/node/linux/${_node_dir}/bin"
ln -sf /usr/bin/node "third_party/node/linux/${_node_dir}/bin/"
ln -sf /usr/bin/java third_party/jdk/current/bin/ 2>/dev/null || true
}
build() {
cd "${srcdir}/chromium-${pkgver}"
case "$CARCH" in
aarch64) _target_cpu="arm64" ;;
x86_64) _target_cpu="x64" ;;
esac
local _flags=(
"target_cpu=\"${_target_cpu}\""
'is_official_build=false'
'is_debug=false'
# dcheck_always_on defaults to !is_official_build (true here);
# explicitly off so the direct EGL/GLES2 path doesn't FATAL on
# gl_context_egl.cc:241's DCHECK(!global_texture_share_group_).
'dcheck_always_on=false'
'symbol_level=0'
'is_cfi=false'
'treat_warnings_as_errors=false'
'enable_widevine=false'
# System toolchain (clang/lld from pacman)
'custom_toolchain="//build/toolchain/linux/unbundle:default"'
'host_toolchain="//build/toolchain/linux/unbundle:default"'
'use_sysroot=false'
'use_custom_libcxx=true'
# The whole point of chromium-fourier — V4L2 HW decode on Linux
'use_v4l2_codec=true'
'use_v4lplugin=true'
'use_linux_v4l2_only=true'
'use_vaapi=false'
# Codec branding for proprietary codec support (H.264 etc.)
'ffmpeg_branding="Chrome"'
'proprietary_codecs=true'
'rtc_use_pipewire=true'
'link_pulseaudio=true'
'use_qt6=true'
'moc_qt6_path="/usr/lib/qt6"'
)
gn gen out/Default --args="${_flags[*]}"
ninja -C out/Default chrome chrome_crashpad_handler
}
package() {
cd "${srcdir}/chromium-${pkgver}"
install -Dm755 out/Default/chrome "${pkgdir}/usr/lib/chromium/chromium"
install -Dm755 out/Default/chrome_crashpad_handler \
"${pkgdir}/usr/lib/chromium/chrome_crashpad_handler"
[ -f out/Default/chrome_sandbox ] && install -Dm4755 out/Default/chrome_sandbox \
"${pkgdir}/usr/lib/chromium/chrome-sandbox"
[ -f out/Default/chromedriver ] && install -Dm755 out/Default/chromedriver \
"${pkgdir}/usr/bin/chromedriver"
# Bundled GL/Vulkan runtime — chrome dlopens these from its own dir,
# not /usr/lib/. Without them GL init fails and chrome falls back to
# software compositing.
for so in libEGL.so libGLESv2.so libvk_swiftshader.so libvulkan.so.1; do
[ -f "out/Default/$so" ] && install -Dm755 "out/Default/$so" \
"${pkgdir}/usr/lib/chromium/$so"
done
# ANGLE and SwiftShader ICD config files
for icd in out/Default/*_icd.json; do
[ -f "$icd" ] && install -Dm644 "$icd" \
"${pkgdir}/usr/lib/chromium/$(basename "$icd")"
done
# Resources / locales / pak files
for f in chrome_100_percent.pak chrome_200_percent.pak resources.pak \
v8_context_snapshot.bin snapshot_blob.bin icudtl.dat \
headless_lib_data.pak headless_lib_strings.pak \
headless_command_resources.pak; do
[ -f "out/Default/$f" ] && install -Dm644 "out/Default/$f" \
"${pkgdir}/usr/lib/chromium/$f"
done
# Locales
if [ -d out/Default/locales ]; then
install -dm755 "${pkgdir}/usr/lib/chromium/locales"
cp -r out/Default/locales/* "${pkgdir}/usr/lib/chromium/locales/"
fi
# Launcher shim — defaults to ANGLE→GLES on Wayland with Vulkan
# disabled. Vulkan is off by default because:
# - panvk on RK3566 (Mali-G52 Bifrost) returns
# VK_ERROR_INCOMPATIBLE_DRIVER on chromium's probe and breaks
# V4L2 dispatch downstream (chrome falls back to FFmpeg software);
# - panthor on RK3588 (Mali-G610 Valhall) is more functional but
# not yet validated end-to-end against this build.
#
# User overrides for development on other Rockchips:
# --enable-features=Vulkan enable Vulkan (panthor / others)
# --use-vulkan=native|swiftshader pick the Vulkan backend
# --disable-features=Vulkan explicit re-disable
# Any of those on the command line short-circuits the launcher's
# default disable, so the user's intent always wins.
install -dm755 "${pkgdir}/usr/bin"
cat > "${pkgdir}/usr/bin/chromium" <<'LAUNCHER'
#!/bin/bash
# chromium-fourier launcher — V4L2 HW decode + Wayland + ANGLE
# Vulkan disabled by default; pass --enable-features=Vulkan or
# --use-vulkan=native to opt in (e.g. RK3588 panthor work).
USER_HANDLES_VULKAN=0
for arg in "$@"; do
case "$arg" in
--use-vulkan*|--enable-features=*Vulkan*|--disable-features=*Vulkan*|--use-angle=vulkan*)
USER_HANDLES_VULKAN=1
break
;;
esac
done
vulkan_default=()
if [ "$USER_HANDLES_VULKAN" = 0 ]; then
vulkan_default=(--disable-features=Vulkan)
fi
exec /usr/lib/chromium/chromium \
--ozone-platform=wayland \
--use-gl=angle --use-angle=gles \
--enable-features=AcceleratedVideoDecoder \
"${vulkan_default[@]}" \
"$@"
LAUNCHER
chmod 0755 "${pkgdir}/usr/bin/chromium"
}