# KWin pivot — fix the chrome-on-KWin video stall > **2026-04-28 update part 2 — qt6-base-fourier landed, validated, did > not fix the chrome stall.** The Qt 6 GL_ALPHA bug (qopengltextureglyphcache.cpp, > qrhigles2.cpp, qopengltextureuploader.cpp) is real, the patch is > correct, the journal noise is gone — but the chromium-fourier 149-r4 > playback under KWin still deadlocks at ~6 seconds (vs ~3 seconds > pre-patch — so the GL_ALPHA churn was contributing some overhead, > just not the primary cause). Vindication came from a clean weston > A/B: same chrome v4 binary, same panfrost mesa, same V4L2 driver, > same hardware → swapping KWin for weston turns the stall off. Chrome > plays through under weston (with elevated CPU because weston falls > back to LINEAR composite). KWin has a *second* bug, structurally > deeper than the Qt one. **Phase 4 below — write/ship/upstream the Qt > fix — was completed today.** This document now pivots again to the > remaining KWin investigation. > **2026-04-28 update part 1 — Phase 2 collapsed onto Phase 1: not KWin > for the GL_ALPHA part.** Source-grep nailed the offender on the > first pass. Real culprit: Qt 6's `QOpenGLTextureGlyphCache` > (`src/opengl/qopengltextureglyphcache.cpp:111-117`) and > `QRhiGles2::toGlTextureFormat` (`src/gui/rhi/qrhigles2.cpp:1373-1378`). > KWin's own GL paths use `GL_R8` correctly (`src/opengl/gltexture.cpp:61`, > `src/scene/shadowitem.cpp:494`). The Qt-fourier patch series shipped > as `marfrit-packages/arch/qt6-base-fourier/` and was validated on > ohm — zero `GL_INVALID_VALUE` in a fresh-session journal. ## Triangulation table after today's work | Path | Result | |---|---| | `ffmpeg -hwaccel v4l2request -f null` | ✓ 36 fps, clean | | `mpv --vo=null --hwdec=v4l2request` | ✓ decode-only, clean | | `mpv --vo=drm --hwdec=v4l2request` (KMS scanout, no compositor) | ✓ 0.7% drops in 19 s | | **chrome v4 under weston** | **✓ plays through; ~96 % CPU** | | chrome v4 under KWin (post-Qt-fix) | ✗ stall @ ~6 s, ⏸ icon, audio clock advances | | `mpv --vo=gpu-next --hwdec=v4l2request` under KWin | ✗ ~76 % drops, slideshow | | **chrome v4 under KWin pre-Qt-fix** | **✗ stall @ ~3 s** (GL_ALPHA spam adds load) | Decode + display hardware path is fully capable. Wayland *as a protocol* is fine (weston works). The wall is **specifically KWin's compositor scheduling and presentation pipeline on this stack** — panfrost ES 3.2 + V4L2 stateless NV12 dmabuf clients. The chromium-fourier patch series is correct. The qt6-base-fourier patch series is correct. The KWin bug is the third independent problem on this hardware, exposed by the prior two fixes. ## What we know and what we don't **Known:** - The stall is *not* in chrome's V4L2VideoDecoder (works under weston). - The stall is *not* in panfrost's dmabuf import (works under weston). - The stall is *not* a GL error (no `GL_INVALID_VALUE` after qt6 fix). - The stall is *not* a thread parked in `vb2`/`v4l2`/`dma_fence` wchan (kwin/chrome/audio threads all sit in `futex_do_wait` / `poll_schedule_timeout` / `unix_stream_read_generic`). - The stall *does* idle the audio output socket (renderer audio thread blocks reading from the audio service unix socket → audio drains the last ALSA buffer, static, silence). - The stall *does* leave the `