Etnaviv-Unterstützung in Wayland Mainline

Lucas Stach | | Etnaviv

Wenn man der Entwicklung des Linux Grafikstacks folgt, konnte man in den letzten Wochen die Releases von MESA 17.2 und Weston 3.0 beobachten. Neben den üblichen Verbesserungen und Bugfixes für diverse Grafik-Hardware stellen diese aber auch einen wichtigen Meilenstein für das Etnaviv Projekt dar: mit diesen Releases gibt es vollständigen Support für Vivante-Grafikchips in Wayland!

Für Etnaviv als ein Hardware Treiber in MESA standen Standard-Features wie GBM und die Wayland EGL Plattform ohne weiteres seit der Aufnahme in MESA zur Verfügung; allerdings konnten normale Wayland-Applikationen zunächst noch nicht fehlerfrei genutzt werden: zwar starteten sie, zeigten jedoch noch kein sinnvolles Bild an. Der Grund für dieses Verhalten war das Tiled Memory Layout, das die GPU für Texturing und Rendering verwendet. Im hier verlinkten Artikel befindet sich eine schöne Erklärung der Details.

Da dieses Verhalten ein gängiges Szenario beim 3D Rendern auf allen modernen GPUs ist, stellte sich die Frage, warum der Mechanismus auf Etnaviv zunächst nicht funktionierte. Es stellte sich heraus, dass die alten Protokolle zum Sharen von Grafik-Puffern zwischen einer Applikation und dem Compositor/Server, etwa DRI2 und wl_dru, einen Mechanismus besaßen, um Metadaten wie das verwendete Tiling Layout mit dem Buffer zu übertragen. Alle existierende Treiber wie Radeon, Noveau und Intel benutzten hingegen Side-Channels, um die Informationen zwischen den verschiedenen Prozessen auszutauschen. Diese Treiber hängen die Metadaten an die kernelseitigen Grafikpuffer, was so lange gut funktioniert, wie es ein direktes 1:1 Verhältnis zwischen Userspace- und Kernelseite gibt. Allerdings entwickeln sich moderne Grafiksysteme wie Vulcan zunehmend in eine Richtung, bei der der Inhalt eines kernelseitigen Puffers mehreren Userspace-Puffern zugeordnet ist. Für diese Vorgehensweise funktioniert die Zuordnung der Metadaten auf die bislang gewählte Weise nicht mehr.

Daneben ergäbe sich aus dem alten Konzept eine breitere API zwischen der Kernelseite von Etnaviv und dem Userspace Treiber, die aus Kompatibilitätsgründen für alle Zeiten von Linux unterstützt werden müsste. Deshalb wurde entschieden, diesen Weg mit Etnaviv nicht zu beschreiten und das bereits von Intel und Collabora begonnene Verfahren zu implementieren, bei dem die Tiling-Informationen vollständig im Userspace geshared werden. Dabei werden sogenannte "modifiers" verwendet, bei denen es sich um 64 Bit Enums handelt. Der Kernel verwaltet diese Modifier, so dass diese nicht nur im 3D Stack, sondern auch auf der Grafik-Ausgabeseite verwendet werden. Für die Details des Verfahrens sei der Vortrag über End-to-End Kompression im Intel Grafikstack auf der XDC von vor ein paar Tagen empfohlen.

Was ändert sich nun mit Weston 3.0 und MESA 17.2?

Weston implementiert nun das zwp_linux_dmabuf Protokoll zusätzlich zum bereits bestehenden wl_drm Protokoll. Damit ist es nun möglich, Puffer zwischen der Wayland-Applikation und dem Compositor mit Hilfe von dma-buf Deskriptoren auszutauschen und dabei beliebige Metadaten zur Beschreibung des Puffer-Inhalts über das Wayland-Protokoll auszutauschen. Findet MESA dieses Protokoll vor, wird es für die Implementierung des Buffer-Sharings in der Wayland EGL Plattform genutzt.

Ein Großteil der Arbeit, die für diese Funktionalität im generischen Weston und MESA Code notwendig war, wurde von Daniel Stone (Collabora) umgesetzt. Varad Gautam, ebenfalls Collabora, hat Support für die Modifier auf dem Gallium Interface Level implementiert. Im Rahmen meiner Aufgaben bei Pengutronix wurden die Gallium-Patches gereviewt und alle nötigen Mechanismen im Etnaviv-Treiber implementiert. Damit ist Etnaviv der erste Gallium-Treiber, der den neuen Mechanismus zum Sharen von Puffer-Metadaten über das Wayland-Protokoll nutzt.

Aus der Kombination der Änderungen, die in die neuen Revisionen eingeflossen sind, ergibt sich nun ein vollständig funktionierender Wayland-Stack auf den Plattformen, die von Etnaviv unterstützt sind. Und ein weiterer Vorteil ergibt sich aus diesem Konzept: mit diesem Stack ist es ohne Änderungen auf Treiberebene möglich, den Android Grafikstack mit Etnaviv zu nutzen!.