mesa-panvk-bifrost-video: sibling package adding VK_KHR_video_decode_h264
panvk-bifrost-video campaign close. Phase 4 byte-exact validated 2026-05-21 on RK3566/PineTab2 (Mali-G52 r1 MC1 + hantro VPU): 48/48 unique BBB display frames decoded by this driver are byte-identical to ffmpeg+libva-v4l2-request-fourier on the same hantro hardware (frame 42 Y md5 = 54b9b396e6cd377256eb4bce0efc0bed both ways). Phase 5 second-model review passed; load-bearing findings applied. Co-installs at /usr/lib/panvk-bifrost-video/ parallel to the r4 sibling at /usr/lib/panvk-bifrost/; opt-in via VK_ICD_FILENAMES. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
# Maintainer: Markus Fritsche <fritsche.markus@gmail.com>
|
||||
#
|
||||
# mesa-panvk-bifrost-video — sibling of mesa-panvk-bifrost (r4) that adds
|
||||
# VK_KHR_video_decode_h264 on Mali Bifrost SBCs (PAN_ARCH 6/7) backed by
|
||||
# the SoC's V4L2-stateless hantro VPU (RK3566/RK3568).
|
||||
#
|
||||
# Campaign: ~/src/panvk-bifrost-video/ — Phase 4 byte-exact validated
|
||||
# 2026-05-21 (48/48 BBB display frames match ffmpeg+libva-v4l2-request-
|
||||
# fourier byte-for-byte on the same hantro). Phase 5 second-model review
|
||||
# completed; load-bearing findings (output_map OOB, static counter,
|
||||
# session_init unwind, probe_hantro gate) all applied.
|
||||
#
|
||||
# What it does (on top of r4):
|
||||
# - 0001..0004: inherited from mesa-panvk-bifrost (robustness2/null-
|
||||
# descriptor, vk1.1/1.2 advertisement, EXT_transform_feedback, XFB
|
||||
# primitive decomposition) — symlinked from the r4 package directory
|
||||
# so the patches don't drift between siblings.
|
||||
# - 0005: VK_KHR_video_queue + VK_KHR_video_decode_queue +
|
||||
# VK_KHR_video_decode_h264 backed by V4L2-stateless hantro.
|
||||
# Touches 14 files in src/panfrost/vulkan/; full diff in
|
||||
# 0005-panvk-bifrost-video-KHR-video-decode-h264.patch.
|
||||
#
|
||||
# Co-existence:
|
||||
# - Installs to /usr/lib/panvk-bifrost-video/ (parallel to r4's
|
||||
# /usr/lib/panvk-bifrost/). Pick at runtime via VK_ICD_FILENAMES.
|
||||
# - r4 stays the recommended default for the Chromium-GPU-process
|
||||
# consumer (no video needed there). Use this package when the
|
||||
# consumer wants Vulkan video decode (mpv-fourier, ffmpeg-vulkan,
|
||||
# future Chromium-VulkanVideoDecoder).
|
||||
#
|
||||
# Phase 1 limitations to know about (documented in source comments):
|
||||
# - Single video session per device (active_video singleton)
|
||||
# - Synchronous decode at record time — no pipelining yet
|
||||
# - Hardcoded /dev/video1 + /dev/media0 (matches RK3566/68, blocks
|
||||
# other SoCs without a topology-walk port)
|
||||
# - Bitstream source buffer assumed HOST_VISIBLE (true on panvk-
|
||||
# bifrost, would need fallback on other backends)
|
||||
#
|
||||
# Build target: arch-aarch64 runner via marfrit-packages Gitea Actions.
|
||||
# Mesa build is slow (~30-60min on Cortex-A55).
|
||||
|
||||
pkgname=mesa-panvk-bifrost-video
|
||||
_mesaver=26.0.6
|
||||
pkgver=26.0.6.r5.video1
|
||||
pkgrel=1
|
||||
pkgdesc="Patched Mesa libvulkan_panfrost.so adding VK_KHR_video_decode_h264 on Bifrost SBCs (sibling of mesa-panvk-bifrost-r4)"
|
||||
arch=('aarch64')
|
||||
url="https://github.com/marfrit/panvk-bifrost"
|
||||
license=('MIT')
|
||||
|
||||
depends=(
|
||||
'mesa' # for shared mesa runtime libs
|
||||
'libdrm'
|
||||
'wayland'
|
||||
'libxcb'
|
||||
'libx11'
|
||||
'libxshmfence'
|
||||
'zlib'
|
||||
'zstd'
|
||||
'libelf'
|
||||
'libffi'
|
||||
'expat'
|
||||
'llvm-libs'
|
||||
'lm_sensors'
|
||||
)
|
||||
makedepends=(
|
||||
'meson'
|
||||
'ninja'
|
||||
'glslang'
|
||||
'python-mako'
|
||||
'python-packaging'
|
||||
'wayland-protocols'
|
||||
'libxrandr'
|
||||
'xorgproto'
|
||||
'libdrm'
|
||||
'llvm'
|
||||
'libclc'
|
||||
'spirv-llvm-translator'
|
||||
'spirv-tools'
|
||||
'rust-bindgen'
|
||||
'patch'
|
||||
)
|
||||
|
||||
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"
|
||||
"0003-panvk-bifrost-vk-ext-transform-feedback.patch"
|
||||
"0004-panvk-bifrost-xfb-primitive-decomposition.patch"
|
||||
"0005-panvk-bifrost-video-KHR-video-decode-h264.patch"
|
||||
"icd.json"
|
||||
)
|
||||
# Mesa tarball checksum matches the sibling r4 package — same upstream version.
|
||||
sha256sums=(
|
||||
'SKIP' # mesa tarball — co-trust w/ r4 sibling
|
||||
'SKIP' # patches are local
|
||||
'SKIP'
|
||||
'SKIP'
|
||||
'SKIP'
|
||||
'SKIP'
|
||||
'SKIP' # icd.json
|
||||
)
|
||||
|
||||
prepare() {
|
||||
cd "mesa-${_mesaver}"
|
||||
|
||||
# r1+r2: small sed-based edits inherited from r4 (verbatim from the
|
||||
# sibling PKGBUILD — keep in sync).
|
||||
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
|
||||
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
|
||||
|
||||
# r3: EXT_transform_feedback for Bifrost.
|
||||
patch -p1 < "${srcdir}/0003-panvk-bifrost-vk-ext-transform-feedback.patch"
|
||||
|
||||
# r4: XFB primitive decomposition NIR pass.
|
||||
patch -p1 < "${srcdir}/0004-panvk-bifrost-xfb-primitive-decomposition.patch"
|
||||
|
||||
# video: VK_KHR_video_decode_h264 via V4L2-hantro.
|
||||
patch -p1 < "${srcdir}/0005-panvk-bifrost-video-KHR-video-decode-h264.patch"
|
||||
|
||||
# Sanity-check r1..r4 (inherited).
|
||||
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
|
||||
grep -q "EXT_transform_feedback = PAN_ARCH < 9," src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
test -f src/panfrost/vulkan/jm/panvk_vX_cmd_xfb.c
|
||||
grep -q "panvk_per_arch(nir_lower_xfb)" src/panfrost/vulkan/panvk_vX_shader.c
|
||||
test -f src/panfrost/vulkan/panvk_vX_xfb_lower.c
|
||||
|
||||
# Sanity-check video patch landed.
|
||||
grep -q "KHR_video_queue = PAN_ARCH < 9 && panvk_v4l2_probe_hantro()" \
|
||||
src/panfrost/vulkan/panvk_vX_physical_device.c
|
||||
grep -q "PANVK_QUEUE_FAMILY_VIDEO_DECODE" src/panfrost/vulkan/panvk_device.h
|
||||
test -f src/panfrost/vulkan/panvk_video_decode.c
|
||||
test -f src/panfrost/vulkan/panvk_video_decode.h
|
||||
test -f src/panfrost/vulkan/panvk_v4l2.c
|
||||
test -f src/panfrost/vulkan/panvk_v4l2_h264.c
|
||||
test -f src/panfrost/vulkan/panvk_v4l2_h264_slice_header.c
|
||||
test -f src/panfrost/vulkan/panvk_v4l2_h264_slice_header.h
|
||||
grep -q "panvk_v4l2_h264_slice_header.c" src/panfrost/vulkan/meson.build
|
||||
grep -q "panvk_video_queue_submit_noop" src/panfrost/vulkan/panvk_vX_device.c
|
||||
}
|
||||
|
||||
build() {
|
||||
cd "mesa-${_mesaver}"
|
||||
# Mirror r4's narrow build profile.
|
||||
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}"
|
||||
|
||||
# Co-install path — parallel to r4's /usr/lib/panvk-bifrost/.
|
||||
install -Dm755 build/src/panfrost/vulkan/libvulkan_panfrost.so \
|
||||
"$pkgdir/usr/lib/panvk-bifrost-video/libvulkan_panfrost.so"
|
||||
|
||||
# ICD JSON pointing at the video build. Opt-in via VK_ICD_FILENAMES;
|
||||
# NOT in /usr/share/vulkan/icd.d/ so it doesn't override stock or r4.
|
||||
install -Dm644 "$srcdir/icd.json" \
|
||||
"$pkgdir/usr/lib/panvk-bifrost-video/icd.json"
|
||||
}
|
||||
Reference in New Issue
Block a user