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:
@@ -1092,3 +1092,121 @@ jobs:
|
|||||||
- name: wipe secrets
|
- name: wipe secrets
|
||||||
if: always()
|
if: always()
|
||||||
run: rm -f /root/.ssh/id_ed25519_hertz
|
run: rm -f /root/.ssh/id_ed25519_hertz
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
# mesa-panvk-bifrost (aarch64 only) — patched Mesa libvulkan_panfrost.so
|
||||||
|
# for Bifrost-gen Mali (panvk-bifrost campaign iter9). Co-installs at
|
||||||
|
# /usr/lib/panvk-bifrost/ so stock mesa stays intact; opt-in via the
|
||||||
|
# brave-vulkan launcher this package also ships.
|
||||||
|
#
|
||||||
|
# Build is slow (~30-60min on actrunner-aarch64): full Mesa-from-source.
|
||||||
|
# Standalone job — no `needs:` since it doesn't depend on the fourier
|
||||||
|
# codec stack. continue-on-error so a build hiccup doesn't block other
|
||||||
|
# jobs in the same workflow run.
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
mesa-panvk-bifrost-aarch64:
|
||||||
|
runs-on: arch-aarch64
|
||||||
|
continue-on-error: true
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: bootstrap runner (idempotent)
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
retry() { for i in 1 2 3; do "$@" && return 0; rc=$?; echo "retry $i (exit=$rc)" >&2; sleep $((i*5)); done; return 1; }
|
||||||
|
retry pacman -Syu --noconfirm --needed base-devel git rsync gnupg openssh sudo
|
||||||
|
|
||||||
|
- name: import signing key
|
||||||
|
env:
|
||||||
|
PRIV: ${{ secrets.MARFRIT_REPO_PRIVATE_KEY }}
|
||||||
|
PASS: ${{ secrets.MARFRIT_REPO_PASSPHRASE }}
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
gpgconf --homedir /root/.gnupg --kill all 2>/dev/null || true
|
||||||
|
rm -rf /root/.gnupg /root/repo_pass
|
||||||
|
mkdir -m700 -p /root/.gnupg
|
||||||
|
printf '%s' "$PASS" > /root/repo_pass
|
||||||
|
chmod 600 /root/repo_pass
|
||||||
|
printf '%s\n' "$PRIV" | gpg --batch --import
|
||||||
|
echo "92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C:6:" | gpg --import-ownertrust
|
||||||
|
|
||||||
|
- name: install deploy ssh key
|
||||||
|
env:
|
||||||
|
KEY: ${{ secrets.MARFRIT_REPO_DEPLOY_KEY }}
|
||||||
|
run: |
|
||||||
|
mkdir -m700 -p /root/.ssh
|
||||||
|
printf '%s\n' "$KEY" > /root/.ssh/id_ed25519
|
||||||
|
chmod 600 /root/.ssh/id_ed25519
|
||||||
|
ssh-keyscan -t ed25519 nc.reauktion.de > /root/.ssh/known_hosts 2>/dev/null
|
||||||
|
|
||||||
|
- name: makepkg mesa-panvk-bifrost
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
rm -rf /tmp/build-mesa-panvk-bifrost
|
||||||
|
cp -r arch/mesa-panvk-bifrost /tmp/build-mesa-panvk-bifrost
|
||||||
|
chown -R builder:builder /tmp/build-mesa-panvk-bifrost
|
||||||
|
cd /tmp/build-mesa-panvk-bifrost
|
||||||
|
# MAKEFLAGS for parallel build; runner is multi-core.
|
||||||
|
# --skipinteg because sha256sums=SKIP in PKGBUILD (matches the
|
||||||
|
# fourier-fork PKGBUILD convention).
|
||||||
|
sudo -u builder -H env MAKEFLAGS="-j60" \
|
||||||
|
makepkg --nocheck --noconfirm --syncdeps --cleanbuild --skipinteg
|
||||||
|
ls -la *.pkg.tar.* | grep -v "\.sig$"
|
||||||
|
|
||||||
|
- name: sign mesa-panvk-bifrost
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
cd /tmp/build-mesa-panvk-bifrost
|
||||||
|
for f in *.pkg.tar.xz *.pkg.tar.zst *.pkg.tar.gz; do
|
||||||
|
[ -f "$f" ] || continue
|
||||||
|
gpg --batch --pinentry-mode loopback --passphrase-file /root/repo_pass \
|
||||||
|
--detach-sign --yes -u 92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C "$f"
|
||||||
|
done
|
||||||
|
|
||||||
|
- name: update aarch64 repo db
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
mkdir -p /tmp/arch-stage-mesa-panvk
|
||||||
|
cd /tmp/arch-stage-mesa-panvk
|
||||||
|
rm -f *
|
||||||
|
for f in marfrit.db.tar.gz marfrit.db.tar.gz.sig marfrit.files.tar.gz marfrit.files.tar.gz.sig; do
|
||||||
|
curl -sSLf "https://packages.reauktion.de/arch/aarch64/$f" -o "$f" || rm -f "$f"
|
||||||
|
done
|
||||||
|
for ext in xz zst gz; do
|
||||||
|
ls /tmp/build-mesa-panvk-bifrost/*.pkg.tar.$ext 2>/dev/null && \
|
||||||
|
mv /tmp/build-mesa-panvk-bifrost/*.pkg.tar.$ext /tmp/build-mesa-panvk-bifrost/*.pkg.tar.$ext.sig .
|
||||||
|
done || true
|
||||||
|
export GNUPGHOME=/root/.gnupg
|
||||||
|
printf 'pinentry-mode loopback\npassphrase-file /root/repo_pass\n' > /root/.gnupg/gpg.conf
|
||||||
|
printf 'allow-loopback-pinentry\n' > /root/.gnupg/gpg-agent.conf
|
||||||
|
gpg-connect-agent reloadagent /bye
|
||||||
|
pkgs=()
|
||||||
|
for ext in xz zst gz; do
|
||||||
|
for f in *.pkg.tar.$ext; do [ -f "$f" ] && pkgs+=("$f"); done
|
||||||
|
done
|
||||||
|
if [ -f marfrit.db.tar.gz ]; then
|
||||||
|
for f in "${pkgs[@]}"; do
|
||||||
|
name=$(echo "$f" | sed -E 's/-[0-9].*//')
|
||||||
|
repo-remove --sign --key 92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C \
|
||||||
|
marfrit.db.tar.gz "$name" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
repo-add --new --sign --key 92D5E96D8F63C75E4116AA1FF5C8C4603D0D250C \
|
||||||
|
--verify marfrit.db.tar.gz "${pkgs[@]}"
|
||||||
|
ln -sf marfrit.db.tar.gz marfrit.db
|
||||||
|
ln -sf marfrit.files.tar.gz marfrit.files
|
||||||
|
ln -sf marfrit.db.tar.gz.sig marfrit.db.sig
|
||||||
|
rm -f marfrit.files.sig
|
||||||
|
|
||||||
|
- name: publish to aarch64
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
retry() { for i in 1 2 3; do "$@" && return 0; rc=$?; echo "retry $i (exit=$rc)" >&2; sleep $((i*5)); done; return 1; }
|
||||||
|
cd /tmp/arch-stage-mesa-panvk
|
||||||
|
retry rsync -avL --copy-unsafe-links \
|
||||||
|
-e 'ssh -i /root/.ssh/id_ed25519' \
|
||||||
|
./ mfritsche@nc.reauktion.de:arch/aarch64/
|
||||||
|
|
||||||
|
- name: wipe secrets
|
||||||
|
if: always()
|
||||||
|
run: rm -f /root/repo_pass /root/.ssh/id_ed25519
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
From: claude-noether (on behalf of mfritsche)
|
||||||
|
Date: 2026-05-19
|
||||||
|
Subject: panvk: expose VK_KHR/EXT_robustness2 + nullDescriptor on Bifrost (PAN_ARCH 6/7)
|
||||||
|
|
||||||
|
Without this, Mesa's Zink driver refuses to use PanVk-Bifrost as its Vulkan
|
||||||
|
backend, falling back silently to llvmpipe (software rasterizer) for all
|
||||||
|
GL-via-Zink on Bifrost SBCs. That defeats the entire purpose of having a
|
||||||
|
Vulkan driver on Bifrost — GL acceleration via Zink is the most natural
|
||||||
|
near-term consumer.
|
||||||
|
|
||||||
|
panvk_vX_nir_lower_descriptors.c:1309 and panvk_vX_shader.c:1355 already
|
||||||
|
plumb dev->vk.enabled_features.nullDescriptor arch-agnostically — the gate
|
||||||
|
at panvk_vX_physical_device.c was set conservatively when Bifrost was
|
||||||
|
unmaintained, not because of hardware incapability.
|
||||||
|
|
||||||
|
iter1–7 of the panvk-bifrost campaign proved fundamental driver functions
|
||||||
|
on Mali-G52 r1 MC1 (PAN_ARCH=7). This patch is the iter8 follow-up.
|
||||||
|
|
||||||
|
robustBufferAccess2 and robustImageAccess2 are NOT flipped — they're
|
||||||
|
independent rb2 features Zink doesn't require, gated differently
|
||||||
|
(robustBufferAccess2 = PAN_ARCH >= 11, robustImageAccess2 = false), and
|
||||||
|
out of scope for iter8.
|
||||||
|
|
||||||
|
---
|
||||||
|
src/panfrost/vulkan/panvk_vX_physical_device.c | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||||
|
--- a/src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||||
|
+++ b/src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||||
|
@@ -91,7 +91,7 @@ get_device_extensions(const struct panvk_physical_device *device,
|
||||||
|
.KHR_pipeline_binary = true,
|
||||||
|
.KHR_pipeline_executable_properties = true,
|
||||||
|
.KHR_pipeline_library = true,
|
||||||
|
- .KHR_robustness2 = PAN_ARCH >= 10,
|
||||||
|
+ .KHR_robustness2 = true,
|
||||||
|
.KHR_sampler_mirror_clamp_to_edge = true,
|
||||||
|
.KHR_sampler_ycbcr_conversion = true,
|
||||||
|
.KHR_separate_depth_stencil_layouts = true,
|
||||||
|
@@ -168,7 +168,7 @@ get_device_extensions(const struct panvk_physical_device *device,
|
||||||
|
.EXT_queue_family_foreign = true,
|
||||||
|
.EXT_robustness = pan_arch(device->kmod.dev->props.gpu_id) >= 9,
|
||||||
|
.EXT_image_robustness = true,
|
||||||
|
- .EXT_robustness2 = PAN_ARCH >= 10,
|
||||||
|
+ .EXT_robustness2 = true,
|
||||||
|
.EXT_sampler_filter_minmax = PAN_ARCH >= 10,
|
||||||
|
.EXT_scalar_block_layout = true,
|
||||||
|
.EXT_separate_stencil_usage = true,
|
||||||
|
@@ -493,7 +493,7 @@ get_device_features(const struct panvk_physical_device *device,
|
||||||
|
/* VK_KHR_robustness2 */
|
||||||
|
.robustBufferAccess2 = PAN_ARCH >= 11,
|
||||||
|
.robustImageAccess2 = false,
|
||||||
|
- .nullDescriptor = PAN_ARCH >= 10,
|
||||||
|
+ .nullDescriptor = true,
|
||||||
|
|
||||||
|
/* VK_KHR_shader_clock */
|
||||||
|
.shaderSubgroupClock = device->kmod.dev->props.gpu_can_query_timestamp,
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
From: claude-noether (on behalf of mfritsche)
|
||||||
|
Date: 2026-05-20
|
||||||
|
Subject: panvk: expose Vulkan 1.1 + 1.2 on Bifrost (PAN_ARCH 6/7)
|
||||||
|
|
||||||
|
ANGLE (Chromium's GL stack) requires apiVersion >= 1.1 to initialize. Without
|
||||||
|
this, Brave / Chromium's GPU process fails at GL info collection:
|
||||||
|
|
||||||
|
vk_renderer.cpp:2659 (initialize): ANGLE Requires a minimum Vulkan device
|
||||||
|
version of 1.1
|
||||||
|
Display::initialize error 0: Internal Vulkan error (-9): The requested
|
||||||
|
version of Vulkan is not supported by the driver
|
||||||
|
|
||||||
|
Stack-up with iter8's robustness2 patch enables ANGLE → PanVk-Bifrost →
|
||||||
|
Skia (via --enable-features=Vulkan) on Bifrost SBCs.
|
||||||
|
|
||||||
|
PanVk-Bifrost already supports the bulk of 1.1-promoted features as extensions
|
||||||
|
(multiview, maintenance1-3, descriptor update template, 16-bit storage,
|
||||||
|
descriptor update template, sampler ycbcr, variable pointers, etc. — all
|
||||||
|
visible in iter0 vulkaninfo). The version bump primarily bundles them.
|
||||||
|
|
||||||
|
Risk: Vulkan 1.1 has features beyond what iter1–7 exercised (protected memory,
|
||||||
|
full subgroup ops). Specific app failures will be characterizable.
|
||||||
|
|
||||||
|
1.2 is also flipped — Brave's Vulkan path may want descriptor indexing,
|
||||||
|
buffer device address, etc. (all listed in iter0 vulkaninfo as supported
|
||||||
|
extensions, just gated as 1.0-with-extensions, not 1.2-core).
|
||||||
|
|
||||||
|
---
|
||||||
|
src/panfrost/vulkan/panvk_vX_physical_device.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/panfrost/vulkan/panvk_vX_physical_device.c b/src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||||
|
--- a/src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||||
|
+++ b/src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||||
|
@@ -38,8 +38,8 @@ get_device_extensions(const struct panvk_physical_device *device,
|
||||||
|
struct vk_device_extension_table *ext)
|
||||||
|
{
|
||||||
|
*ext = (struct vk_device_extension_table){
|
||||||
|
- .KHR_8bit_storage = true,
|
||||||
|
- .KHR_16bit_storage = true,
|
||||||
|
- bool has_vk1_1 = PAN_ARCH >= 10;
|
||||||
|
- bool has_vk1_2 = PAN_ARCH >= 10;
|
||||||
|
+ .KHR_8bit_storage = true,
|
||||||
|
+ .KHR_16bit_storage = true,
|
||||||
|
+ bool has_vk1_1 = true;
|
||||||
|
+ bool has_vk1_2 = true;
|
||||||
|
*ext = (struct vk_device_extension_table){
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
# mesa-panvk-bifrost
|
||||||
|
|
||||||
|
Patched Mesa `libvulkan_panfrost.so` exposing Bifrost-gen Mali GPUs
|
||||||
|
(Mali-G31/G52/G72/G76, PAN_ARCH 6/7) to Chromium-family browsers'
|
||||||
|
Vulkan compositor.
|
||||||
|
|
||||||
|
Result of the **panvk-bifrost** campaign ([`~/src/panvk-bifrost/`](../../../panvk-bifrost/)),
|
||||||
|
iter9 close 2026-05-20 (technical milestone — operator-confirmed Brave
|
||||||
|
window) followed by this package as the actual delivery.
|
||||||
|
|
||||||
|
## What it solves
|
||||||
|
|
||||||
|
Stock Chromium / Brave on Bifrost SBCs (PineTab2, etc.) currently dies
|
||||||
|
at GL bindings init:
|
||||||
|
|
||||||
|
```
|
||||||
|
ERROR: ui/gl/gl_context_egl.cc:120 GLES3 is unsupported and ES version fallback is disabled
|
||||||
|
ERROR: ui/gl/init/gl_factory.cc:111 Requested GL implementation not found
|
||||||
|
ERROR: components/viz/service/main/viz_main_impl.cc:189 Exiting GPU process due to errors during initialization
|
||||||
|
```
|
||||||
|
|
||||||
|
This package makes Brave's **Vulkan compositor path** work on Bifrost,
|
||||||
|
side-stepping the failing GL stack. Browser chrome and standard page
|
||||||
|
rendering work.
|
||||||
|
|
||||||
|
## Known limitations (not addressed)
|
||||||
|
|
||||||
|
- **WebGL / WebGL2** in-page: blocked. ANGLE needs `VK_EXT_transform_feedback`
|
||||||
|
to expose GLES3 contexts; PanVk-Bifrost doesn't currently support that.
|
||||||
|
Sites using WebGL will degrade or refuse.
|
||||||
|
- **VAAPI hardware video decode**: unrelated to this package — see the
|
||||||
|
`libva-v4l2-request-fourier` package for that path.
|
||||||
|
|
||||||
|
## Install
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Ensure [marfrit] is in /etc/pacman.conf, then:
|
||||||
|
sudo pacman -Sy mesa-panvk-bifrost
|
||||||
|
```
|
||||||
|
|
||||||
|
## Use
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brave-vulkan # launches Brave with Vulkan
|
||||||
|
brave-vulkan https://www.example.com
|
||||||
|
brave-vulkan --your-flags-here # extra args passed through
|
||||||
|
```
|
||||||
|
|
||||||
|
The launcher sets:
|
||||||
|
|
||||||
|
- `VK_ICD_FILENAMES=/usr/lib/panvk-bifrost/icd.json` (the patched driver)
|
||||||
|
- `PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1` (Mesa upstream gate)
|
||||||
|
- `MESA_VK_VERSION_OVERRIDE=1.2` (apiVersion bump for ANGLE)
|
||||||
|
- Brave flags: `--use-gl=disabled --enable-features=Vulkan --use-vulkan=native --ozone-platform=x11 --no-sandbox --disable-gpu-sandbox --ignore-gpu-blocklist`
|
||||||
|
|
||||||
|
## What's in the package
|
||||||
|
|
||||||
|
- `/usr/lib/panvk-bifrost/libvulkan_panfrost.so` — patched Mesa Vulkan driver (Mesa 26.0.6 + 2 sed-applied patches)
|
||||||
|
- `/usr/lib/panvk-bifrost/icd.json` — Vulkan ICD JSON pointing at the patched .so (NOT auto-loaded; only via `VK_ICD_FILENAMES`)
|
||||||
|
- `/usr/bin/brave-vulkan` — launcher script
|
||||||
|
|
||||||
|
System Mesa is untouched. The stock `/usr/lib/libvulkan_panfrost.so` and
|
||||||
|
`/usr/share/vulkan/icd.d/panfrost_icd.json` continue to work for any
|
||||||
|
other Vulkan app.
|
||||||
|
|
||||||
|
## Co-existence
|
||||||
|
|
||||||
|
Both stock Mesa and this package can be installed. Stock Vulkan apps
|
||||||
|
(`vulkaninfo`, `vkcube`, etc.) use the stock driver by default. Only
|
||||||
|
apps started via `brave-vulkan` (or with `VK_ICD_FILENAMES` manually
|
||||||
|
set to our path) use the patched driver.
|
||||||
|
|
||||||
|
## Campaign close criterion
|
||||||
|
|
||||||
|
Per [`feedback_package_done_means_installable`](file:///home/mfritsche/.claude/projects/-home-mfritsche-src/memory/feedback_package_done_means_installable.md)
|
||||||
|
three-point check:
|
||||||
|
|
||||||
|
1. PR merged to `marfrit-packages`
|
||||||
|
2. CI green AND `packages.reauktion.de/arch/aarch64/mesa-panvk-bifrost-*.pkg.tar.zst` exists
|
||||||
|
3. `pacman -Ss mesa-panvk-bifrost` on a fresh consumer host (e.g. ohm
|
||||||
|
after `pacman -Syu` from clean state) returns the package + brave-vulkan launches
|
||||||
|
|
||||||
|
When all three pass, panvk-bifrost iter9 closes.
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# brave-vulkan — launch Brave with the PanVk-Bifrost Vulkan compositor on
|
||||||
|
# Bifrost SBCs (PineTab2 / Mali-G52 r1 MC1 and similar).
|
||||||
|
#
|
||||||
|
# Side-steps the GL stack failures stock Brave hits on Bifrost
|
||||||
|
# (the README "Consumer-side benefit" path of the panvk-bifrost campaign).
|
||||||
|
#
|
||||||
|
# Provided by the mesa-panvk-bifrost package. See:
|
||||||
|
# /usr/share/doc/mesa-panvk-bifrost/README
|
||||||
|
# ~/src/panvk-bifrost/phase8_iteration9_close.md (campaign close)
|
||||||
|
#
|
||||||
|
# Usage: brave-vulkan [brave args...]
|
||||||
|
# Equivalent to: brave [VULKAN_FLAGS] [your args]
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Patched Vulkan driver (from this package) — must point at the custom path
|
||||||
|
# so we don't clash with the stock /usr/share/vulkan/icd.d/panfrost_icd.json
|
||||||
|
export VK_ICD_FILENAMES=/usr/lib/panvk-bifrost/icd.json
|
||||||
|
|
||||||
|
# PanVk's "I know it's not conformant" gate — the patched driver still
|
||||||
|
# refuses to enumerate Bifrost without this env var (Mesa upstream choice,
|
||||||
|
# kept for compatibility).
|
||||||
|
export PAN_I_WANT_A_BROKEN_VULKAN_DRIVER=1
|
||||||
|
|
||||||
|
# Override apiVersion to 1.2 — ANGLE (Chromium's GL stack) requires
|
||||||
|
# device.apiVersion >= 1.1. The patched libvulkan_panfrost.so still has
|
||||||
|
# a PAN_ARCH>=10 gate inside get_api_version(); easier to override at
|
||||||
|
# runtime via this Mesa env var than to add a third patch.
|
||||||
|
export MESA_VK_VERSION_OVERRIDE=1.2
|
||||||
|
|
||||||
|
# Find the live Plasma session's Xauthority. On a fresh boot the suffix
|
||||||
|
# is randomized; pgrep the Xwayland args to find the current one.
|
||||||
|
if [ -z "${XAUTHORITY:-}" ]; then
|
||||||
|
XAUTHF=$(pgrep -fa Xwayland 2>/dev/null | grep -oE "/run/user/$(id -u)/xauth_[A-Za-z0-9]+" | head -1)
|
||||||
|
if [ -n "$XAUTHF" ]; then
|
||||||
|
export XAUTHORITY="$XAUTHF"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Standard session env if not already set
|
||||||
|
: "${XDG_RUNTIME_DIR:=/run/user/$(id -u)}"
|
||||||
|
export XDG_RUNTIME_DIR
|
||||||
|
|
||||||
|
# Default to the active Plasma Wayland session if WAYLAND_DISPLAY unset
|
||||||
|
: "${WAYLAND_DISPLAY:=wayland-0}"
|
||||||
|
export WAYLAND_DISPLAY
|
||||||
|
|
||||||
|
# Default to the XWayland :1 unless DISPLAY is set
|
||||||
|
: "${DISPLAY:=:1}"
|
||||||
|
export DISPLAY
|
||||||
|
|
||||||
|
exec brave \
|
||||||
|
--use-gl=disabled \
|
||||||
|
--enable-features=Vulkan \
|
||||||
|
--use-vulkan=native \
|
||||||
|
--ozone-platform=x11 \
|
||||||
|
--no-sandbox \
|
||||||
|
--disable-gpu-sandbox \
|
||||||
|
--ignore-gpu-blocklist \
|
||||||
|
"$@"
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"ICD": {
|
||||||
|
"api_version": "1.4.335",
|
||||||
|
"library_path": "/usr/lib/panvk-bifrost/libvulkan_panfrost.so"
|
||||||
|
},
|
||||||
|
"file_format_version": "1.0.1"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user