Bottom-band flicker on HDMI: same fix, max_render_time 8 (2026-10-15)
Evidence class: operator report on the real monitor plus a phone video the operator recorded of the monitor. No grim capture shows the band (see below).
System: /nix/store/d3p5n719gbhc91vyqjbgxh0zicr9c3jw-nixos-system-nixos-26.11.20260919.20b1ddd
(landscape 7.2 test image), HDMI-A-1 at 1280x800, panel switched off.
Symptom. On Home, moving the mouse anywhere from the bottom edge to about one dock height above the dock flickered a dark band across the full width. Moving it elsewhere did not. Apps and the card overview did not flicker.
hdmi-dock-band-phone-frames.png shows three frames from the operator’s
3 s phone video (video_2026-10-15_13-46-58.mp4, sha256
00fa2990…57ee, not committed). Each frame is cropped to the dock and
turned so the dock runs across the image. Top: correct. Middle: starting to
darken. Bottom: the band, a dark translucent layer with the dock icons and
wallpaper still faintly visible through it.
What didn’t cause it:
- Dumb-buffer cache maintenance. A test kernel cleaned every framebuffer before each plane update, and the band was unchanged.
- The hardware cursor plane running past the bottom edge. The canaan VO
driver does program the unclipped cursor rectangle (debugfs:
crtc-pos=64x64+639+797on an 800-line mode). A test kernel clipped it, and the band was unchanged. WithWLR_NO_HARDWARE_CURSORS=1, the band was also unchanged. - Home’s own pixels. A host render of
draw_home_shmat 1280x800 with the pointer at y = 300 to 790 differed from the no-pointer render in 0 pixels. Hover only makes Home repaint and re-commit.
Cause, as for DSI-1 (max-render-time-fix.md). Every pointer motion
over Home makes the shell commit a new frame, so Sway composites
continuously. With max_render_time 0, Sway renders right after the
previous flip. Apps and the overview stay idle under a moving pointer,
which is why they did not flicker. HDMI frames are ARGB8888 (AR24,
1280x800, about 4 MiB), versus RGB565 on the panel.
Fix. At 15:21:14 CDT (sway journal: Handling command 'output HDMI-A-1 max_render_time 8'), swaymsg output HDMI-A-1 max_render_time 8 was
applied at runtime (get_outputs showed max_render_time 0 → 8). The
operator then moved the mouse over the dock again and reported “band’s
gone”. It is now in nix/shell.nix’s output HDMI-A-1 line.
Limits.
- The acceptance is the operator’s look, not a frame capture after the fix.
- Screencopy (
grim) cannot show this band because it reads the composed frame, not the scan-out. - As on the panel, a rendered frame can add up to 8 ms of latency.
The config line on the board. The build carrying it, system
/nix/store/wyxsfdsy2m835dy2fgw4f7q9ndjr7xhz-nixos-system-nixos-26.11.20260919.20b1ddd,
was booted at 15:27 CDT. swaymsg -t get_outputs showed HDMI-A-1 active
with max_render_time 8. The sway journal for that boot has no runtime
output HDMI-A-1 max_render_time command, so the value comes from the
config.