# 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