As usual, this month has been rich in Wayland-related activities. Rose has continued building and upstreaming better frame scheduling infrastructure for wlroots, you can read more on her blog. I’ve resurrected an old patch to make wlroots behave better when the GPU is under high load. In my testing this improves latency a lot some specific scenarios and some specific hardware, but doesn’t help on some others. It’s not super clear if anything can be done about this, it may be that we are hitting some hardware limitations here: GPUs don’t know how to preempt tasks very well.
I’ve also started working on explicit synchronization again. This was
previously blocked on a hard problem: drivers may want to use a new kind of
synchronization fence primitive (user-space memory fences) and it wasn’t clear
how the current primitives (
drm_syncobj) would hold up. We’ve been talking
about this new primitive for a few years but unfortunately it’s a complicated
matter and nothing new has surfaced. However, after discussing with Daniel
Vetter, we’ve come to the conclusion that the kernel will provide backwards
drm_syncobj, so we can just stop worrying and use that as
the basis for explicit synchronization protocols and implementations. Moreover,
NVIDIA engineers are interested in helping with this effort, so I hope we can
keep the momentum and join forces to push the new protocol, APIs and
implementations to the finish line.
There is a lot to be done to plumb explicit synchronization. This month I’ve
respinned a new kernel uAPI patch to allow compositors to
wait on a
drm_syncobj without blocking. This also involved writing a test
suite in IGT and a wlroots patch to use the new uAPI. Everything is now
reviewed, I hope to merge this soon. Apart from this, we also need a
new Wayland protocol, a new Vulkan
drm_syncobj import/export, more implementations of the
protocol, ideally yet another new kernel uAPI to improve
sync_file, and even a new X11 protocol so that legacy
X11 clients (read: games) can take advantage of this whole thing. Oh my… As
French people say, there is some bread on the table.
In other Wayland news, we’ve started having some more-or-less weekly meetings for wayland-protocols standardization. We’ve been talking about upstreaming some of the stuff currently in a private GTK protocol, IMEs, and layer-shell. It’s been great to be able to discuss face-to-face about blockers for these protocols. The meeting notes are available on the wiki. We’ve done a lot of talking and gesturing, but also some actual work: security-context has finally (!) been merged, and I’ve updated the ext-layer-shell patch.
Apart from the explicit synchronization work, I’ve sent a few other kernel patches. Numerous patches to improve the kernel uAPI documentation, and a few patches to add more information to the hotplug events sent by bridge/i915/nouveau so that compositors don’t need to reload the whole KMS state on each hotplug event (instead, they can now only reload the KMS state of the one specific connector which got hotplugged). I’ve reviewed a few patches as well. Thomas Zimmermann has made it so all DRM drivers now support DMA-BUFs (required for wlroots to run), so now wlroots works on e.g. gma500. AMD engineers have sent patches to support more than 64 DRM devices, there are some subtle uAPI stability issues at play I’ve tried to provide feedback on.
Let’s wrap up this status update with a collection of various smaller
happenings. I’ve removed
dlsym() related magic used in the Wayland test suite
which caused sporadic failures on FreeBSD. I’ve been gradually improving the
API for go-imap v2 and fixing a few bugs. hut now supports pagination on all
commands thanks to tireless work by Thorben Günther. kanshi now supports
configuring adaptive sync (VRR). I’ve improved the API of go-oauth2 a bit. Last
but not least, I’ve reworked an old patch to make it easier to
parse scfg files from Go programs, by defining a Go struct
instead of hand-rolling parsing code.
See you next month!