Rust X11 Server YServer 1.5.1 Fixes Chrome Video Artifacts and Java Text Bugs
Four bug fixes land just two days after the major 1.5.0 release, including a DRI3 layout lie that scrambled Chrome's AV1 playback.
YSserver 1.5.1 dropped yesterday with a clean slate of four pull requests merged within 24 hours. Maintainer Jos Dehaes addressed real-world desktop breakage across the X11 stack: scrambled hardware-accelerated video in Chrome, invisible Java text, white backgrounds in KDE windows, and phantom window drags in OpenBox.
Keep in mind that YServer is a full Rust rewrite of the X11 display server. It does not try to clone Xorg byte-for-byte. Instead, the project aims for functional parity on modern hardware, driving DRM/KMS directly, using Vulkan for rendering, and skipping legacy baggage like the DDX driver ABI and endian-swapped clients.
The 1.5.0 release shipped on September 9 with roughly 40 changes. YServer 1.5.1 arrived on September 11. That two-day gap signals a maintainer who is actively engaging with upstream bugs as they hit users' screens.
The Chrome Video Scramble
The most technically interesting fix here involves how YServer handled buffer layouts for Chrome.
A Linux Mint 22.3 user reported YouTube AV1 video rendered as scrambled horizontal blocks while the rest of the page displayed correctly. Disabling Chrome's hardware acceleration made the problem vanish. The culprit was YServer's DRI3 implementation lying about buffer formats.
On DRI3 1.0, the legacy PixmapFromBuffer import path carries no modifier on the wire. The buffer layout is implicit and should be resolved from the buffer itself. YServer, however, hardcoded DRM_FORMAT_MOD_LINEAR for every such import and then re-exported that description back to the client.
Chrome trusted the lie. It sampled its own AV1 frames using the wrong tiling and produced garbage.
The fix distinguishes between explicit and implicit modifier imports structurally. An imported pixmap now exports a duplicate of the client's own file descriptor with the client's own stride and offset, rather than going through Vulkan via a fake linear image. The buffer retains its actual layout metadata so clients can resolve tiling correctly.
Dehaes verified the fix on AMD RX 6800 hardware with Mesa 26.2.2. Chromium AV1 playback now handles advertisements, full-screen video, and playback without artifacts. Regression tests for DRI3 are included, though CI skips them on Vulkan ICDs that cannot export dma-bufs, like lavapipe.
Java Text Was Invisible
The second fix addresses a complete failure to render text in Java/AWT/Swing applications.
YServer's X RENDER CompositeGlyphs paint path accepted only SolidFill and Gradient source pictures. It silently dropped everything else. Java2D paints text through XRSolidSrcPict, which is a 1x1 pixmap picture with repeat=Normal. Every request from Java clients was discarded.
Diagnostic logging showed 33 out of 33 CompositeGlyphs requests from the Java client painting zero rectangles, against a healthy 3,429 out of 3,429 from every other client combined.
Once that was resolved, a second issue surfaced: subpixel (LCD) antialiased text rendered as solid filled rectangles. AddGlyphs was stripping per-channel coverage values from ARGB32 glyphs, which subpixel clients use for coverage data.
The fix collapses the 1x1 source picture to a constant color and enables per-channel glyph rendering for subpixel glyphs. Dehaes added an LRU cache to avoid redundant readbacks, which were consuming 75% of frame close operations.
A/B testing via virtme-ng against Xorg confirmed the fix. Post-fix, the same 21 requests now paint one rectangle each. Subpixel text renders correctly on MATE and GNOME.
The AI Factor
Here is the bit that might make Xorg purists reach for the pitchforks. Every commit in this release shows Co-Authored-By: Claude Opus 5 in the metadata. Dehaes is using Anthropic's 1-million-token context model to drive the Rust codebase. The verification-first approach paired with AI assistance is aggressive, but the results speak. Each fix includes tests proven red first, followed by hardware verification on real GPUs.
The commit messages read like inline documentation. They detail the problem, the solution, trade-offs considered and rejected, and the verification methodology. You would not guess an AI was involved in generating this level of technical precision.
Other Fixes
Window content also got patched up. KDE Plasma windows created with no background attribute now respect background_none instead of falling back to a white placeholder value.
When mpv went full-screen, KWin suspended compositing. Unredirecting back from full-screen caused window content to vanish. YServer kept a stale private per-window leaf after the redirect. The fix walks the subtree to restore leaves from the backing during unredirect, matching Xorg behavior.
Finally, input propagation was corrected. Under OpenBox, windows would spontaneously start following the mouse pointer roughly once every 1-2 minutes. A single click stopped the dragging.
Xorg delivers events per window, trying XI2, then XI1, then core, and stops as soon as any flavor delivers. YServer consulted core masks only. A GTK client selecting XI2 without a core mask let press events climb up to the reparenting window manager's frame. OpenBox armed its drag state from that spurious press, then fired move or resize commands from a bare motion event with no button held.
The propagation walk now respects absorbing XI2 event types per window, mirroring Xorg's delivery loop. Slave-device selections are excluded from the absorption check, which matches the master-slave event model.
Head here to the full release notes and download.
