Files
marfrit 298431810e Phase 0 extended: A1' multi-window probes — cannot reproduce Wayland stutter
Two extended Wayland reps under increasingly aggressive
provocation conditions to find the stutter envelope referenced
in the campaign premise:

- a1prime_konsole_rep1: chromium-fourier + active konsole running
  `top -d 0.5` behind, both at fullscreen-stacked geometry.
- a1prime_tiled_rep1: chromium-fourier at 600x400 tile +
  konsole+top behind at fullscreen.

Both: drops_post_warmup=0, kwin %CPU median=0.00, perf zero
samples in composite/dmabuf/GL paths. Same floor result as
single-window A1.

KWin DBus scripting confirms the limitation: all top-level
windows are at fullscreen-equivalent geometry stacked, kwin's
z-order culls everything behind chrome from rendering. Even the
tiled rep didn't break the pattern.

Three interpretations: (A) predecessor's patches actually fixed
the original Wayland stutter on this workload (per
KWIN_PIVOT.md, plausible); (B) stutter conditions I haven't
matched (different content, time-of-session, load); (C) session-
state divergence. Cannot adjudicate from synthetic reps alone.

a1prime_findings.md surfaces four operator-decision options:
specific scenario from daily-driver, extended-use observation,
acceptance of (A) and matrix reframe, or continued probing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 15:59:08 +00:00

7.1 KiB
Raw Permalink Blame History

A1' multi-window probe — findings + open question for operator

Date: 2026-05-03 14:23 → 16:18 CEST. Goal: provoke Wayland-side stutter under multi-window conditions, so the matrix has a non-floor Wayland baseline for the X11 cells to compare against. Outcome: could not provoke stutter under any condition tested in 5 reps. All show drops_post_warmup = 0 and kwin %CPU median = 0.00 — same floor result as the single-window A1.

Reps run

Rep Condition drops_total drops_post_warmup frames_total kwin %CPU median
a1_rep1 single-window chromium-fourier-kwin 0 0 1685 0.00
a1_rep2 single-window chromium-fourier-kwin 0 0 1685 0.00
a1_rep3 single-window chromium-fourier-kwin 0 0 1686 0.00
a1prime_konsole_rep1 chromium-fourier + active konsole+top behind, both fullscreen-stacked 0 0 1687 0.00
a1prime_tiled_rep1 chromium-fourier at 600×400 tile + konsole+top behind at fullscreen 1 0 1682 0.00

What I learned about Wayland's window state

Probed via a kwin script (org.kde.KWin /Scripting) that called workspace.windowList() and printed each window's resourceClass + caption + geometry + minimized/hidden state. During the "multi-window with active konsole" rep, the window list was:

plasmashell || hidden=false geometry=0,0,1280×800        (desktop wallpaper)
plasmashell || hidden=true  geometry=0,738,1280×62        (panel — auto-hidden)
kwin_wayland|| hidden=false geometry=0,0,1280×800        (kwin internal)
org.kde.konsole|~ : bash — Konsole | hidden=false geometry=0,0,1280×800
org.kde.konsole|~ : top — Konsole  | hidden=false geometry=0,0,1280×800

Multiple top-level windows exist, all at fullscreen-equivalent geometry stacked on top of each other. hidden=false reports that none are minimized — but the kwin compositor's z-order hides windows-behind-windows from rendering. Only the topmost visible client (chrome, when it's launched) is being painted. The active konsole's text scrolling never reaches kwin's composite stage because the konsole is occluded by chrome.

The tiled rep tried to fix this: chrome at 600×400+350+150, konsole at fullscreen behind. Even there, drops_post_warmup = 0 and kwin %CPU = 0. Either the tiled chrome triggered some other fast-path (maybe both planes engaged: chrome's NV12 to Plane 39, konsole+desktop's RGB to Plane 45), or the konsole was still mostly occluded by Plasma's desktop background painting between its window decoration and the chrome viewport.

perf reports across all 5 reps

Top symbols on kwin_wayland for the 5 reps:

rep top symbol(s) — % of (sparse) samples
a1_rep1 __pi_memcpy_generic 97 % (single big memcpy in 39 samples)
a1_rep2 libz.so 38 %, call_filldir 32 %
a1_rep3 dbus_message_unref 39 %, QUnixEventDispatcherQPA::processEvents 37 %, libz 23 %
a1prime_konsole_rep1 (similar shape — DBus + Qt event loop + libz)
a1prime_tiled_rep1 (similar shape)

Zero samples in any composite/dmabuf-import/GL path across all 5 reps. Total cycle counts in the millions, not billions. KWin was scheduled out for >99 % of every 70 s capture window.

Two interpretations

(A) The predecessor's patches (kwin-fourier 6.6.4-3 + qt6-base-fourier 6.11.0-3 + chromium-fourier 149) actually fixed the Wayland-stutter problem the campaign is named after. The predecessor's KWIN_PIVOT.md documents exactly this success on 2026-04-28: "Three patches landed on ohm in sequence ... Together they produce smooth 1080p30 H.264 playback under KDE Plasma 6.6.4 Wayland on the box where stock chromium previously stalled in 3 seconds." The drops the predecessor measured later (kwin_timing_nodebug_rep[1-3]: 14, 28, 42 drops_post_warmup) may have been residual variance that has since settled out, or captured during a transient state.

(B) I haven't found the right conditions. The user's operating premise was that Wayland stutter is observable in their daily-driver use. My 70s synthetic reps haven't reproduced what the user has observed. Possibilities:

  • Different content (YouTube, not local file; specific codecs)
  • Different decode path (libva engaging vs not)
  • Time-of-session (cumulative state after hours of use)
  • System concurrency (other apps doing real work)
  • Power state (battery vs charging, governor transitions)
  • Page-specific behavior (sites that engage HDR, advertising, WebRTC, etc.)

I cannot tell from synthetic reps alone whether (A) or (B) holds.

Question for operator

To honor the campaign idea ("stutterless playback - possible with X11? proven impossible with Wayland") without circumventing it into a different question, I need a decisive scenario from your daily-driver experience. Options ordered by my preference:

  1. A specific URL or video file + viewer + duration that you personally observe stuttering under Wayland on this PineTab2. I'll replicate that exact scenario across the matrix cells. E.g.: "play https://www.youtube.com/watch?v=… in Brave fullscreen for 2 minutes, by minute 1 you'll see drops."

  2. An extended-use observation protocol. Run a passive monitor daemon (logs frame-drops, kwin-CPU events, page-faults) for an hour during your normal Wayland use; then the same hour under X11. Compare. Less synthetic, more honest about what "your daily-driver experience" actually involves.

  3. Confirmation of (A). If you accept that the kwin-fourier patches fixed the original Wayland-stutter problem on the 24fps test page, the campaign's premise on this specific workload is no longer valid and the matrix should reframe around either a harder workload (1080p60, 4K, network video) where stutter still happens, OR around a different question (latency, power, daily-driver-quality-of-life) where X11 vs Wayland may still differ even when both deliver clean playback.

  4. Continue probing. I haven't yet tested: stock Brave 147 (script support gap — would need a small wrapper), Firefox 150 (no script support at all), longer captures (e.g. 10 min instead of 70 s), thermal-stressed conditions (run yes > /dev/null on three cores in parallel), battery-drain mode (if PineTab2's governor changes when unplugged). These extend the search space but risk becoming data-shopping if pursued without a specific operator-observed condition to match.

The honest report is: under conditions I can synthesize from SSH in a freshly-autologin'd Plasma Wayland session on this hardware right now, Wayland is delivering stutterless playback on brave_drops_test.html. Anything I'd do beyond this without operator guidance risks tuning conditions until drops appear, which is exactly the data-shopping the campaign-contained-data discipline guards against.

File map

a1prime_konsole_rep1/  — chrome + active konsole+top behind, both fullscreen-stacked
a1prime_tiled_rep1/    — chrome at 600x400, konsole+top behind at fullscreen
a1prime_findings.md    — this file

Each rep dir has the same shape as a1_rep[1-3]/ (15 files; top_full.txt and stderr.log are in .gitignore).