Status update, June 2020
Time for a new monthly status update! Let’s start with Wayland stuff. Once again I’ve continued working on wlroots’ DRM backend. I’ve submitted a bunch of bugfixes for all of the atomic refactoring done last month. I’ve also started working on integrating our long-planned renderer v6 interfaces into the DRM backend.
“Renderer v6” is a proposal to change how the rendering interfaces work in wlroots. Right now the backends (DRM, Wayland, X11, headless) have a hard dependency on EGL. Additionally, the renderer depends on the backend; it’s initialized and used differently on each backend. Renderer v6’s goal is to completely split the backends and the renderer. This is achieved by introducing a buffer interface: the renderer writes to a buffer, which the compositor can then hand over to the backend for display.
There are a number of upsides to this design. Renderer v6 will enable non-EGL
renderers like Vulkan, will give more control over the swapchain, and will
result in a simpler design than trying to workaround EGLSurface
/VkSurface
/
gbm_surface
/etc to achieve the same goals.
Up until now renderer v6 work has been mostly preparatory work, tweaking some
interfaces to better fit the future APIs like wlr_buffer
, and adding some
helpers like wlr_dmabuf_attributes
and wlr_drm_format_set
. This month, I’ve
been adding the remaining pieces of the puzzle in my work-in-progress pull
request: wlr_allocator
and wlr_swapchain
.
A huge part of the renderer v6 effort has been to figure out how to
incrementally refactor wlroots. Big patches with multiple thousands lines of
code changed are making the reviewers’ work extremely long and difficult. They
are a lot of effort, thus take a long time and need to be rebased constantly.
They make it impossible to bisect the Git history to understand bugs. That’s
why my pull request only touches the DRM backend internals: it allows wlroots
to us the new toys for a single backend without actually breaking any API.
Once we’re confident this design works as expected, we can make other backends
migrate to the new APIs internally, one by one, and then move everything out of
the backends into wlr_output
itself (still without breaking the compositor
API).
Of course there are still some open questions regarding renderer v6: it’s not
yet clear how it’ll blend with wlr_matrix
helpers which expect Y-inverted
output, software rendering which doesn’t work with DMA-BUFs, hardware planes
and the future scene-graph API. The path forward is slowly becoming clearer and
clearer, I’m excited to see wlroots continue to pioneer the Wayland landscape.
Apart from renderer v6, there have been some other very interesting additions to wlroots: any1 has added DMA-BUF support to the screencopy protocol, allowing more efficient screen capture for clients that need to perform a GPU copy. I’ve finished my viewporter protocol implementation, allowing older X11 games to work better and future optimizations in video players and web browsers (I’ve heard Firefox plans to use it with their GPU-accelerated rendering engine).
Xyene and Kenny Levinsen have send a bunch of bug fixes for Sway, greatly improving the user experience around input handling and moving/resizing windows. Thanks!
Looking at the wider Wayland ecosystem, the linux-dmabuf hints protocol has
been improved after reviews from Daniel Stone and Scott Anderson. I hope we’ll
be able to finally come to a consensus soon and finally be able to ditch the
old wl_drm
protocol and benefit from the performance improvements of
per-surface hints. I’ve also sent some xorg-xserver and
Mesa patches to use newer interfaces when available,
allowing direct scan-out in more situations.
I’ve also been submitting patches to improve the Linux graphics docs. When I first tried to understand how all of it worked I had a hard time because there are almost no docs. The situation has improved a little nowadays with e.g. kms-quads, but there’s still a lot to be done. I’ve become a drm-misc committer to continue this work, so feel free to CC me if you submit a patch about DRM docs!
The soju IRC bouncer keeps improving and is now definitely production-ready
for small instances. delthas has added support for the CHATHISTORY extension,
allowing clients to query history and implement features like infinite
scrollback. delthas has also added a user create
command to create users
on-the-fly. SASL EXTERNAL has been implemented by foxcpp to enable
authentication via TLS client certificates (also known as “CertFP”). Last, I’ve
added a network update
command to edit a network’s settings and added support
for WebSockets (for Web-based IRC clients).
Let’s wrap this status update up by mentioning my linker sld. I’ve added
support for .rodata
sections (reserved for read-only data), and I have a
work-in-progress patch for .bss
sections (reserved for zero-initialized
data). It’s not yet quite working and it’s a little bit difficult to debug
(because it’s segfaulting before the executable is actually started), but
hopefully I’ll find some time to debug it and get it working.
See you next month!