diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index eb7547090..50d853a56 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -1092,3 +1092,121 @@ jobs: - name: wipe secrets if: always() 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 diff --git a/arch/mesa-panvk-bifrost/0001-panvk-expose-robustness2-nullDescriptor-bifrost.patch b/arch/mesa-panvk-bifrost/0001-panvk-expose-robustness2-nullDescriptor-bifrost.patch new file mode 100644 index 000000000..8d2a377c5 --- /dev/null +++ b/arch/mesa-panvk-bifrost/0001-panvk-expose-robustness2-nullDescriptor-bifrost.patch @@ -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, diff --git a/arch/mesa-panvk-bifrost/0002-panvk-expose-vulkan-1.1-1.2-on-bifrost.patch b/arch/mesa-panvk-bifrost/0002-panvk-expose-vulkan-1.1-1.2-on-bifrost.patch new file mode 100644 index 000000000..f44ffcbb5 --- /dev/null +++ b/arch/mesa-panvk-bifrost/0002-panvk-expose-vulkan-1.1-1.2-on-bifrost.patch @@ -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){ diff --git a/arch/mesa-panvk-bifrost/PKGBUILD b/arch/mesa-panvk-bifrost/PKGBUILD new file mode 100644 index 000000000..dd9133882 --- /dev/null +++ b/arch/mesa-panvk-bifrost/PKGBUILD @@ -0,0 +1,156 @@ +# Maintainer: Markus Fritsche +# +# 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" +} diff --git a/arch/mesa-panvk-bifrost/README.md b/arch/mesa-panvk-bifrost/README.md new file mode 100644 index 000000000..0487e0ef6 --- /dev/null +++ b/arch/mesa-panvk-bifrost/README.md @@ -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. diff --git a/arch/mesa-panvk-bifrost/brave-vulkan b/arch/mesa-panvk-bifrost/brave-vulkan new file mode 100644 index 000000000..65bc017e0 --- /dev/null +++ b/arch/mesa-panvk-bifrost/brave-vulkan @@ -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 \ + "$@" diff --git a/arch/mesa-panvk-bifrost/icd.json b/arch/mesa-panvk-bifrost/icd.json new file mode 100644 index 000000000..1ceaf4d6b --- /dev/null +++ b/arch/mesa-panvk-bifrost/icd.json @@ -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" +}