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.5 KiB
Phase 4 — iter18 close + campaign-close artifact
What iter18 found (recap from phase0_findings.md)
There is no Mali-G52 Vulkan blob. Static analysis of five distinct libmali-bifrost-g52 variants from Rockchip's JeffyCN mirror confirms:
- 0 exported Vulkan ICD entrypoints
- 0
VK_KHR_*/VK_EXT_*strings - 1,999 OpenCL/EGL/GLES symbols
Cross-checked against Valhall (libmali-bifrost-g610-g24p0-dummy.so) for control:
- 197
VK_KHR/VK_EXTstrings vk_icdGetInstanceProcAddrexported
Arm crossed the Vulkan threshold on Valhall (RK3588). Bifrost-G52 (RK3566 / PineTab2) was left behind and never received Vulkan support from Arm/Rockchip.
The decisive consequence
iter15 asked "how much of the proprietary Mali blob now ships with panvk-bifrost?" as if measuring a percentage against an external reference. Phase 0 dissolves the question's premise: there is no external Vulkan reference on this hardware. The percentage IS the absolute number.
panvk-bifrost is the only Vulkan implementation that exists for Mali-G52.
Campaign-close standing artifacts
| iter | Artifact | Status |
|---|---|---|
| iter1–iter7 | Bringup substrate, fault triage, panvk recompile path | Closed |
| iter8 | KHR_robustness2 + nullDescriptor exposure on Bifrost | Shipped (PKGBUILD patch 0001) |
| iter9 | VK 1.1/1.2 exposure + Brave/Chromium GPU process boot | Shipped (PKGBUILD patch 0002 + ohm Brave window operator-confirmed 2026-05-20) |
| iter10–iter12 | Display/scheduler/IPC investigations (informational) | Closed |
| iter13 | VK_EXT_transform_feedback (XFB) implementation | Shipped (PKGBUILD patch 0003) |
| iter14 | Brave HW video-decode attempt — wall: ARM64 binaries lack VAAPI in dispatch | Closed with documented permanent wall (memory: project_brave_arm64_vaapi_wall) |
| iter15 | Khronos CTS XFB measurement: 75.7% pass on first run | Closed — 796 P / 243 F / 132551 NS |
| iter16 | Winding-decomposition Path A (driver-side) | Deferred — dispatch-level state mutation does not reproduce IDVS-bound descriptor cache |
| iter17 | Winding-decomposition Path B (NIR-pass-level) | Shipped (PKGBUILD patch 0004) — 91.7% CTS pass, all 162 winding fails closed |
| iter18 | Mali blob dissection — no Vulkan competitor exists | This document |
Final XFB CTS scoreboard (the campaign's measurable deliverable)
baseline iter15 iter17 net delta
(no work) (iter13 (iter13 + over campaign
alone) iter17)
Pass 0 796 958 +958
Fail 0 243 81 +81 (= resume_*, by-design)
Crashes N/A 24* 0 -24
Pass rate runnable 0% 76.2% 91.7% +91.7pp
*iter15 24 crashes resolved between iter15-iter17 via resilient runner + resume topology handling. iter17 final run = 0 crashes.
For context: vendor "reference" pass rate on Mali-G52 = undefined / N/A (no Vulkan implementation exists from Arm/Rockchip for this hardware).
Consumption point validation (Phase 8 done-criteria across the campaign)
Per feedback-package-done-means-installable, every campaign iteration delivering code lands as an installable package:
- mesa-panvk-bifrost r1: iter8 (robustness2 + nullDescriptor)
- mesa-panvk-bifrost r2: iter9 (VK 1.1/1.2 + brave-vulkan launcher)
- mesa-panvk-bifrost r3: iter13 (VK_EXT_transform_feedback)
- mesa-panvk-bifrost r4: iter17 (XFB primitive decomposition) — pending merge
Each rN is installable from packages.reauktion.de via pacman -Sy mesa-panvk-bifrost
on Arch-ARM, on an unmodified consumer machine. The r4 step closes
this loop fully — branch pushed at noether/mesa-panvk-bifrost-r4-iter17-xfb-decomp,
PR pending merge into marfrit/main; Gitea Actions builds + signs +
publishes on merge.
What we will NOT do (and why)
Per feedback-no-upstream-proposals (permanent rule established 2026-05-21 during iter16): no Mesa upstream MR for these patches, no kernel patch series, no panfrost-Gallium re-share. The marfrit-packages PKGBUILD fork is the canonical distribution channel.
Reasoning that informs the rule:
- The upstream maintenance burden of carrying Bifrost-specific NIR-pass divergence from Panfrost-Gallium's pan_nir_lower_xfb is high.
- Mesa's CI does not test on Mali-G52 Bifrost-gen-2 hardware.
- Our packaging path delivers the patches to PineTab2/RK3566 users directly. The upstreaming round-trip adds no value to our consumer.
Why panvk-bifrost matters beyond the bug counts
Concrete user-visible deliverables now possible on Mali-G52 hardware that were impossible before this campaign:
- Chromium-family browsers (Brave) boot their GPU process via Vulkan — chrome://gpu reports "Hardware accelerated" across rasterization, video-decode (CPU-decode path), WebGL, WebGL2, and WebGPU surface composition. Before iter9: no Vulkan GPU process on Bifrost ARM period.
- ANGLE-on-Vulkan → GLES3 → WebGL2 / WebGPU unlocked by iter13's transform_feedback. Without VK_EXT_transform_feedback the ANGLE GLES3 path won't initialize.
- 162 dEQP-VK XFB conformance tests pass on Bifrost where the pre-campaign state was "feature not exposed at all." 91.7% of runnable XFB CTS — and that's against the absolute Khronos CTS reference, with no proprietary Bifrost-G52 Vulkan ICD existing anywhere to measure against.
Campaign close conditions met
✓ Operator-stated goal (Brave Vulkan GPU process boot on PineTab2): met at iter9, operator-confirmed 2026-05-20. ✓ Khronos CTS XFB measurement against absolute reference: complete (iter15 → iter17). ✓ Winding decomposition cluster closed: complete (iter17, +162 P / -162 F). ✓ Vendor blob dissection (operator directive iter18): complete; no blob exists. ✓ All code deliverables packaged + published via marfrit-packages: r1 through r3 merged; r4 PR open and pending.
Recommendation
Campaign closes after r4 merges + packages.reauktion.de mirrors the
build artifact + a single pacman -Syu mesa-panvk-bifrost on a fresh
PineTab2 produces an installable r4 binary that re-runs probe_winding
with TRIANGLE_STRIP=18-entry capture. That re-verify cycle is the last
Phase 8 step for iter17.
Memory updates in flight:
project_iter17_xfb_decomposition.md— NIR-pass approach + sysval threading + topology dispatch ladder patternproject_panvk_bifrost_campaign_close.md— campaign summary + final scoreboard + non-upstream packaging path
— claude-noether, 2026-05-21