panvk-bifrost campaigns (r1..r4 Vulkan compositor + r5.video1 Vulkan
video decode) shipped before this repo existed; the deliverable
patches live in marfrit-packages, but the reasoning chain, phase docs,
and source-state evidence lived only in local working trees on the
development host.
This retrofit imports:
- mesa-panvk-bifrost/ — r1..r4 era phase docs (iter1..iter18)
(libmali stub blobs at iter18/blob/ excluded
— 109MB of RE artifacts replaced with a README
pointer)
- mesa-panvk-bifrost-video/ — sibling campaign phase docs + probe
- evidence/ — frozen .tgz source snapshots at each milestone
(basis for the 0005 patch diff generation)
Future iterations should branch off here from day one, so each iter is
a commit rather than a snapshot. See [[feedback-session-local-process-pins]]
for the process drift this retrofit closes.
Total: 1.9 MB across 124 files.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
6.8 KiB
Phase 0 — substrate for iter11
Opened 2026-05-20 after iter10 effectively closed (the published package stays at iter9 — mesa-panvk-bifrost-26.0.6.r2-1; iter10's path-change polish was withdrawn locally).
Locked research question — iter11
Get Brave's GPU process to engage VAAPI hardware video decode on PineTab2 (via libva-v4l2-request-fourier's
v4l2_requestdriver), while preserving the iter9 Vulkan compositor path. Verify:chrome://gpureports "Video Decode: Hardware accelerated" for at least one codec; a YouTube H.264 1080p30 video plays smoothly; CPU usage stays low during playback (proving the rkvdec hardware engaged).
Why this shape
iter9 closed the Vulkan-compositor-on-Bifrost path. Brave 148 boots, browser UI renders via Vulkan. Video decode still falls to software because the GPU process emits:
ERROR:media/gpu/vaapi/vaapi_wrapper.cc:1640 vaInitialize failed: unknown libva error
every time. The libva stack itself works system-wide (libva-v4l2-request-fourier installed; ffmpeg + mpv both use rkvdec hardware decode on ohm). So the gap is Brave-process-internal: env vars don't reach it, feature flags aren't on, or there's a structural integration issue.
A strings /opt/brave-bin/brave grep on 148.1.90.122 shows VAAPI delegates for AV1/H264/VP8/VP9 + the VaapiVideoDecoder + VaapiIgnoreDriverChecks feature flags — the build is VAAPI-capable. So the goal is runtime config alignment, not patches.
Hypothesis space
-
Env vars not propagating to GPU process.
libva-v4l2-request-fourierships/etc/profile.d/libva-v4l2-request.shsetting:LIBVA_DRIVER_NAME=v4l2_requestLIBVA_V4L2_REQUEST_VIDEO_PATH=/dev/video1LIBVA_V4L2_REQUEST_MEDIA_PATH=/dev/media0
These are inherited by Plasma's session shells but not by our SSH-spawned brave-vulkan invocations (no login shell). The current
brave-vulkanwrapper doesn't set them explicitly. Fix candidate: wrapper-level export. -
Chromium VAAPI feature flag not enabled.
--enable-features=VaapiVideoDecoderis needed in modern Chromium for VAAPI to engage in the GPU process. May also needVaapiIgnoreDriverChecksbecausev4l2_requestisn't on Chromium's hardcoded driver allowlist (which expects InteliHD/ AMDradeonsi/ Mesa Galliumvaetc.). Fix candidate: flag-level addition. -
--use-gl=disabledblocks the VAAPI→presentation path. Chromium's classic VAAPI integration: VAAPI decode → DMA-BUF → GL texture import → compositor uploads the texture. With GL disabled, the texture import step doesn't exist; even if VAAPI succeeds the frame has nowhere to go. Fix candidate: either switch to a different--use-glmode that provides texture import (probably--use-gl=egl), or rely on Chromium's newer Vulkan VAAPI path (VK_EXT_external_memory_dma_bufimport — supported by PanVk-Bifrost per iter0 vulkaninfo). The latter requires the right Chromium feature flag (e.g.,EnableVulkanVideoDecode-style). -
Codec profile mismatch. Chromium asks libva for specific VAProfiles (e.g.,
VAProfileH264Main). libva-v4l2-request-fourier supports certain profiles per hardware. If Chromium's first probed profile isn't supported,vaCreateContext(notvaInitialize) would fail — but our error is atvaInitializewhich is earlier. So this is downstream of (1) and (2). -
Output format mismatch. rkvdec emits MM21 (Mali tiled NV12). Chromium expects NV12 (linear) or potentially tiled variants depending on platform. Even if VAAPI engages, the frame format may not be importable. Diagnostic only at this stage — wouldn't show up until VAAPI is actually loading.
-
libva-v4l2-request-fourier API gap. Chromium may call libva entry points that v4l2_request-fourier doesn't implement (e.g., specific buffer query operations). Need to look at vaapi_wrapper.cc's startup sequence to see exactly which call returns "unknown libva error."
Phase 1 plan
- Brave-side env propagation: run brave-vulkan with explicit
LIBVA_DRIVER_NAME+LIBVA_V4L2_REQUEST_*set in the invocation. DidvaInitializesucceed? - If still failing: add
--enable-features=VaapiVideoDecoder,VaapiIgnoreDriverChecksto the Brave flags. Re-run. - If still failing: try
--use-gl=eglinstead of--use-gl=disabled. Risk: re-introduces the GLES3 issue iter9 worked around. If GLES3 path is now OK because patched lib exposes Vulkan-1.2 ANGLE engagement, this might just work. - If steps 1-3 give "VAAPI initialized but no codecs available" or similar — drop into the codec profile question (hypothesis 4).
- Capture
chrome://gpucontent via--remote-debugging-port=9222+ DevTools protocol scrape (saved as iter11 evidence). - Measure: play a known H.264 sample (we have
~/fourier-test/bbb_1080p30_h264.mp4per libva-multiplanar iter9). Compare CPU usage with VAAPI on vs. off (or against ffmpeg-mpv hardware decode for a known-good baseline).
In-scope (LOCKED 2026-05-20 for iter11)
- Brave 148.1.90.122 on ohm with mesa-panvk-bifrost iter9 package already installed.
- libva-v4l2-request-fourier system install (no changes).
- Brave wrapper / flag changes only — no Mesa patches, no libva changes.
- Verify via chrome://gpu + a real video playback.
Out-of-scope (LOCKED 2026-05-20 for iter11)
- Patching Chromium / Brave (build is months; we don't have an aarch64 Chromium-build pipeline).
- Patching libva-v4l2-request-fourier (separate campaign; if iter11 surfaces a real API gap, file an issue against
libva-v4l2-request-fourier#N). - VAAPI encode (hardware video encode is a rkvenc concern, not rkvdec; out of scope).
- WebGL via ANGLE-GLES3 (iter12+ if it ever happens — needs
VK_EXT_transform_feedbackin PanVk-Bifrost, Bifrost RE work). - Packaging changes — only modify the brave-vulkan wrapper if a working flag+env combo is found; the iter9 package layout stays.
Success criteria
chrome://gpushows "Video Decode: Hardware accelerated" for at least one codec (likely H.264).- Visual playback of
bbb_1080p30_h264.mp4(or an equivalent local file) shows smooth frame delivery, no software-decode lag. - CPU usage during playback comparable to mpv-with-hardware-decode baseline (single-digit % on the 4× Cortex-A55 cluster).
- iter9 baseline (no GPU process crashes, Vulkan compositor still active) still holds — VAAPI engagement isn't a regression.
If all 4 → iter11 GREEN. Wrapper change deferred to the close phase (we add the right env+flags to brave-vulkan, bump pkgrel=3 if shipping; otherwise note the flags in docs and leave the wrapper alone).
Reference
- iter9 close: phase8_iteration9_close.md.
- libva-multiplanar iter9 substrate (for env-var pattern):
~/src/libva-multiplanar/phase0_findings_iter9.md. - Brave 148 VAAPI symbol grep (this session, recent).
- chromium VAAPI integration source: Chromium tree
media/gpu/vaapi/(not locally cloned; reference only).