fourier:journey
Table of Contents
fourier — journey
Chronological account of how a single-patch chromium V4L2 dispatch unlock turned into a 4-series + RFC + 3 upstream draft campaign. Each step uncovered the next layer's contributing bug. Index: fourier.
The cascade
- Started as a single chromium V4L2 dispatch unlock — flip
kAcceleratedVideoDecodeLinuxdefault + re-allow direct EGL/GLES2 inWaylandSurfaceFactory. Two patches, “does it decode?”. - Discovered every NV12 modifier on panfrost is
external_only→ wrote chromium patch 3 (NV12EXTERNAL_OES). Without this, sampling NV12 from a panfrost dmabuf goes through a path that doesn't advertise the modifier correctly. - Validated patch 3 → discovered chrome stalled at 3 s under KWin. Different bug, deeper layer.
- Attributed stall to Qt 6
glTexImage2D(GL_ALPHA)errors —GL_ALPHAis deprecated as an internalFormat in OpenGL ES 3.0; Qt 6 was hard-coding it viaQT_CONFIG(opengles2)with no runtime ES check. Wrote qt6-base-fourier (3 patches). - Stall persisted at 6 s → identified KWin's
Transaction::watchDmaBufparking transactions on stub fences. The compositor was waiting for a fence the producer never signalled. - Wrote kwin-fourier 0001 (diagnostic bypass) → stall persisted at 22 s → identified the V4L2 capture pool depth equal to chrome's pipeline depth. Decoder running, compositor working, but the pipeline deadlocked itself on buffer count.
- Wrote chromium patch 4 (capture pool floor at 16) → end-to-end smooth playback on ohm. ~81 % chrome CPU vs ~131 % pre-patch baseline.
- Drafted upstream-shape kwin patch 0002 (poll dmabuf fd directly instead of going through
EXPORT_SYNC_FILE+QSocketNotifier), vb2-dma-resv RFC (3-patch kernel series — the architectural correction that makes the kwin wait premise actually true), and the Qt 6 bug report body. - Restructured public github repo from
chromium-fourier→fourierwith sibling subdirs (chromium-fourier/,qt6-base-fourier/,kwin-fourier/,docs/,tools/). The campaign needed a name that reflected what it actually was. - Mesa
Syyuuregression on fresnel diagnosed and worked around — mesa 26.0.5 introduced a panfrost GLX regression on Mali-T860 that crashessddm-greeter-qt6. Pinned to 26.0.3 viaIgnorePkg. Separate from fourier work, captured here because it surfaced during a fresnel install of fourier packages. - firefox-fourier patch 3 runtime defect identified and corrected (today, 2026-04-28; rebuild pending on boltzmann).
MOZ_LOGshowed patch 3 only walked the generic codec'shw_configs; libavcodec on ALARM registers v4l2_request as separateAVCodecentries (h264_v4l2requestetc.). Corrected to probe by name first, fall back tohw_configs.
Source-of-truth narratives
The investigation thread is documented in gitea/marfrit-packages under:
arch/chromium-fourier/NEXT.md— campaign chronology, including the 2026-04-28 closing sectionarch/chromium-fourier/KWIN_PIVOT.md— the discovery story for the qt6 + kwin layersdocs/dmabuf-zero-copy.md(in github.com/marfrit/fourier) — the panfrostexternal_onlyfinding and how it cascaded into chromium patches 2 + 3
Pattern
Every time a layer was patched, the next layer's contributing bug surfaced. The campaign was over when all four layers (chromium, Qt 6, KWin, the V4L2 capture pool depth) were patched on the same machine, on the same kernel, on the same compositor.
The vb2-dma-resv RFC is the only piece that adjusts a fifth layer (the kernel video producer), and it's a correctness patch rather than a gating one — kwin-fourier 0002 already works without it; the RFC just removes the need for the workaround.
fourier/journey.txt · Last modified: by markus_fritsche
