wayland: Implement direct scanout for cropped and scaled surfaces
Until now we only supported direct scanout to the primary plane if the buffer size perfectly matched the display size. Since display controllers usually support scaling and cropping buffers highly efficiently, try to let them do the job. This is usually helpful if wp_viewporter is used by the client or Mutter uses fractional scaling.
This has several advantages:
- Games (e.g. SDL2 based ones) can almost always hit direct scanout paths in fullscreen mode. Notably when fractional scaling is used or the game renders in a non-native resolution (or both).
- Video players using YUV buffer formats and wp_viewporter can easily hit direct scanout paths, making displaying video very power efficient as the 3D engine is not used at all.
Note that this still only uses the primary plane, no overlay or underlay planes, making this change comparatively low risk.
Suggested test clients:
- gtk4 demo video player: gtk!6618 (merged)
-
weston-simple-egl -f -r
/weston-simple-dmabuf-v4l -s
- Xonotic (make sure to use the Wayland backend)
SDL_VIDEODRIVER=wayland xonotic-sdl
-
mpv
master
(with https://github.com/mpv-player/mpv/pull/12237)mpv --hwdec=vaapi --vo=dmabuf-wayland sintel_trailer-1080p.mp4 --fs
-
mpv --hwdec=vaapi --vo=dmabuf-wayland --vf=format=yuv422p sintel_trailer-1080p.mp4 -fs
(display controllers not supportingNV12
butYUYV
like my Skylake system)
- Gstreamer
gst-launch-1.0 filesrc location=sintel_trailer-1080p.mp4 ! qtdemux ! h264parse ! vah264dec ! vapostproc ! waylandsink fullscreen=1
This was tested already on an Intel, AMD, RK3399 (panfrost) and a Raspberry Pi 4B.
See also:
Fixed bug in preparation:
- https://patchwork.freedesktop.org/patch/557059/ (available in >= 6.5.12)
- https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25603 (available in >= 23.3)
- https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26109 (available in >= 23.3)
- https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26283 (available in >= 23.3)
Edited by Robert Mader