mesa-panvk-bifrost: new package — Vulkan-compositor Brave for Bifrost SBCs
iter9 of the panvk-bifrost campaign — operator-confirmed Vulkan output
on PineTab2 (Mali-G52 r1 MC1) 2026-05-20.
Patches Mesa 26.0.6's PanVk Vulkan driver:
- VK_KHR/EXT_robustness2 + nullDescriptor exposed for PAN_ARCH 6/7
- has_vk1_1 / has_vk1_2 = true on Bifrost
Patches applied via sed in PKGBUILD prepare() (cleaner than maintaining
a Mesa fork for two two-line tweaks; upstream context drifts between
Mesa releases would make a literal .patch brittle).
Co-installs at /usr/lib/panvk-bifrost/ — stock mesa untouched. Stock
libvulkan_panfrost.so and its ICD JSON keep working for everyone not
opting into the patched driver.
Ships /usr/bin/brave-vulkan that wires up:
VK_ICD_FILENAMES=/usr/lib/panvk-bifrost/icd.json
PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1
MESA_VK_VERSION_OVERRIDE=1.2 # ANGLE needs apiVersion>=1.1; the
# has_vk1_x flags don't move it, so
# the env-var override carries that
brave --use-gl=disabled --enable-features=Vulkan --use-vulkan=native
--ozone-platform=x11 --no-sandbox --disable-gpu-sandbox
--ignore-gpu-blocklist "$@"
Side-steps the stock "GLES3 is unsupported / GPU process exits" failure
documented in panvk-bifrost/README's "Consumer-side benefit" section.
Known limitation: WebGL/WebGL2 in-page won't work — ANGLE needs GLES3
which needs VK_EXT_transform_feedback, which PanVk-Bifrost doesn't
currently support. Browser chrome + standard page rendering work fine.
Gitea Actions job mesa-panvk-bifrost-aarch64 added to build.yml,
patterned on libva-v4l2-request-fourier-aarch64. Mesa build is slow
(~30-60min on actrunner-aarch64). Standalone (no needs:),
continue-on-error so it doesn't block other jobs.
Campaign artifacts: ~/src/panvk-bifrost/{README.md, phase8_iteration9_close.md,
phase0_evidence/iter9_brave_vulkan_breakthrough.txt}.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
# Maintainer: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
#
|
||||
# mesa-panvk-bifrost — patched Mesa libvulkan_panfrost.so that exposes
|
||||
# Bifrost-gen Mali (Mali-G31/G52/G72/G76, PAN_ARCH 6/7) to Chromium-family
|
||||
# browsers' Vulkan compositor.
|
||||
#
|
||||
# Campaign: ~/src/panvk-bifrost/ — iter9 close (technical milestone
|
||||
# 2026-05-20, operator-confirmed Brave window). Goal close requires
|
||||
# this package built + published + installable per the
|
||||
# feedback_package_done_means_installable.md 3-point check.
|
||||
#
|
||||
# What it does:
|
||||
# - Builds Mesa 26.0.6 (matching ohm's stock mesa pkg) with two
|
||||
# patches against src/panfrost/vulkan/panvk_vX_physical_device.c:
|
||||
# (1) expose VK_KHR/EXT_robustness2 + nullDescriptor on PAN_ARCH 6/7
|
||||
# (2) set has_vk1_1/has_vk1_2 to true on Bifrost
|
||||
# - Installs the patched libvulkan_panfrost.so to /usr/lib/panvk-bifrost/
|
||||
# (NOT /usr/lib — co-installs alongside stock mesa).
|
||||
# - Registers a custom ICD JSON at a non-default path so the system
|
||||
# Vulkan loader only picks up our driver when VK_ICD_FILENAMES is set.
|
||||
# - Ships /usr/bin/brave-vulkan launcher that wires up env vars + flags.
|
||||
#
|
||||
# Co-existence: stock /usr/lib/libvulkan_panfrost.so is untouched. Stock
|
||||
# /usr/share/vulkan/icd.d/panfrost_icd.json is untouched. Users opt in
|
||||
# via brave-vulkan (or by setting VK_ICD_FILENAMES manually).
|
||||
#
|
||||
# Build target: arch-aarch64 runner via marfrit-packages Gitea Actions.
|
||||
# Mesa build is slow (~30-60min on Cortex-A55). Build deps installed
|
||||
# inside the runner via pacman -S in the workflow.
|
||||
|
||||
pkgname=mesa-panvk-bifrost
|
||||
_mesaver=26.0.6
|
||||
pkgver=26.0.6.r2
|
||||
pkgrel=1
|
||||
pkgdesc="Patched Mesa libvulkan_panfrost.so exposing Bifrost-gen Mali to Vulkan apps (panvk-bifrost campaign)"
|
||||
arch=('aarch64')
|
||||
url="https://github.com/marfrit/panvk-bifrost"
|
||||
license=('MIT')
|
||||
|
||||
# We co-install at /usr/lib/panvk-bifrost/ so no conflicts with stock mesa.
|
||||
# We DO provide a script that requires brave to be installed.
|
||||
depends=(
|
||||
'mesa' # for shared mesa runtime libs (libgallium-mesa etc.)
|
||||
'libdrm'
|
||||
'wayland'
|
||||
'libxcb'
|
||||
'libx11'
|
||||
'libxshmfence'
|
||||
'zlib'
|
||||
'zstd'
|
||||
'libdisplay-info'
|
||||
'expat'
|
||||
'systemd-libs' # libudev
|
||||
'spirv-tools'
|
||||
)
|
||||
optdepends=(
|
||||
'brave-bin: for the brave-vulkan launcher script'
|
||||
)
|
||||
makedepends=(
|
||||
'meson'
|
||||
'ninja'
|
||||
'pkgconf'
|
||||
'bison'
|
||||
'flex'
|
||||
'python'
|
||||
'python-yaml'
|
||||
'python-mako'
|
||||
'glslang'
|
||||
'spirv-tools'
|
||||
'llvm'
|
||||
'clang'
|
||||
'libclc'
|
||||
'spirv-llvm-translator'
|
||||
'vulkan-headers'
|
||||
'wayland-protocols'
|
||||
)
|
||||
|
||||
source=(
|
||||
"https://archive.mesa3d.org/mesa-${_mesaver}.tar.xz"
|
||||
"0001-panvk-expose-robustness2-nullDescriptor-bifrost.patch"
|
||||
"0002-panvk-expose-vulkan-1.1-1.2-on-bifrost.patch"
|
||||
"brave-vulkan"
|
||||
"icd.json"
|
||||
)
|
||||
sha256sums=(
|
||||
'SKIP' # TODO: pin once we know the upstream tarball is stable. archive.mesa3d.org tarballs are stable, so we can hash-pin in iter10.
|
||||
'SKIP'
|
||||
'SKIP'
|
||||
'SKIP'
|
||||
'SKIP'
|
||||
)
|
||||
|
||||
prepare() {
|
||||
cd "mesa-${_mesaver}"
|
||||
# iter8 patch: robustness2 + nullDescriptor exposure on Bifrost.
|
||||
# Three hunks in panvk_vX_physical_device.c. Apply via sed since
|
||||
# the upstream context drifts between Mesa releases and unified-diff
|
||||
# patching is brittle (we hit hunk-rejects during manual application).
|
||||
sed -i 's|\.KHR_robustness2 = PAN_ARCH >= 10,|.KHR_robustness2 = true,|' src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
sed -i 's|\.EXT_robustness2 = PAN_ARCH >= 10,|.EXT_robustness2 = true,|' src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
sed -i 's|\.nullDescriptor = PAN_ARCH >= 10,|.nullDescriptor = true,|' src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
# iter9 patch: bump api version to 1.1/1.2 for Bifrost. NOTE: this only
|
||||
# affects extension exposure flags, NOT the reported apiVersion (which
|
||||
# is set by get_api_version() further down and gated separately).
|
||||
# The brave-vulkan launcher sets MESA_VK_VERSION_OVERRIDE=1.2 at runtime
|
||||
# to deal with the latter — no source change needed for that path.
|
||||
sed -i 's|bool has_vk1_1 = PAN_ARCH >= 10;|bool has_vk1_1 = true;|' src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
sed -i 's|bool has_vk1_2 = PAN_ARCH >= 10;|bool has_vk1_2 = true;|' src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
|
||||
# Sanity-check the patches landed.
|
||||
grep -q "KHR_robustness2 = true," src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
grep -q "EXT_robustness2 = true," src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
grep -q "nullDescriptor = true," src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
grep -q "has_vk1_1 = true;" src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
grep -q "has_vk1_2 = true;" src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "mesa-${_mesaver}"
|
||||
# Minimal Mesa build — only the panvk Vulkan driver. No GLES/GLX/EGL/
|
||||
# gallium drivers — keeps the build narrower and avoids pulling in
|
||||
# the entire Mesa runtime in this package's dep graph.
|
||||
meson setup build/ \
|
||||
--prefix=/usr \
|
||||
--libdir=lib \
|
||||
--buildtype=release \
|
||||
-Dvulkan-drivers=panfrost \
|
||||
-Dgallium-drivers= \
|
||||
-Dplatforms=wayland,x11 \
|
||||
-Dglx=disabled \
|
||||
-Degl=disabled \
|
||||
-Dgles1=disabled \
|
||||
-Dgles2=disabled \
|
||||
-Dvulkan-layers= \
|
||||
-Dtools= \
|
||||
-Dgallium-rusticl=false \
|
||||
-Dmicrosoft-clc=disabled
|
||||
meson compile -C build
|
||||
}
|
||||
|
||||
package() {
|
||||
cd "${srcdir}/mesa-${_mesaver}"
|
||||
|
||||
# Patched lib — co-install path, NOT /usr/lib (to avoid clashing
|
||||
# with stock mesa's libvulkan_panfrost.so).
|
||||
install -Dm755 build/src/panfrost/vulkan/libvulkan_panfrost.so \
|
||||
"$pkgdir/usr/lib/panvk-bifrost/libvulkan_panfrost.so"
|
||||
|
||||
# Custom ICD JSON. NOT under /usr/share/vulkan/icd.d/ (the default
|
||||
# loader search path) — the user has to opt in via VK_ICD_FILENAMES.
|
||||
install -Dm644 "$srcdir/icd.json" \
|
||||
"$pkgdir/usr/lib/panvk-bifrost/icd.json"
|
||||
|
||||
# The brave-vulkan launcher wires up env + flags.
|
||||
install -Dm755 "$srcdir/brave-vulkan" "$pkgdir/usr/bin/brave-vulkan"
|
||||
}
|
||||
Reference in New Issue
Block a user