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!.
Texte und Fotos stehen unter CC-BY-SA, soweit nicht explizit anders angegeben