a4e7d8ab90
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>
129 lines
6.5 KiB
Markdown
129 lines
6.5 KiB
Markdown
# 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_EXT` strings
|
||
- `vk_icdGetInstanceProcAddr` exported
|
||
|
||
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:
|
||
|
||
1. **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.
|
||
2. **ANGLE-on-Vulkan → GLES3 → WebGL2 / WebGPU** unlocked by iter13's
|
||
transform_feedback. Without VK_EXT_transform_feedback the ANGLE
|
||
GLES3 path won't initialize.
|
||
3. **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 pattern
|
||
- `project_panvk_bifrost_campaign_close.md` — campaign summary + final scoreboard + non-upstream packaging path
|
||
|
||
— claude-noether, 2026-05-21
|