Eigentlich ist es ganz einfach, man sollte für den Anfang ins Linux-Lager schauen: Vor inzwischen mehr als ein paar Jahren entschloss man sich unter Linux den Grafikstack komplett umzubauen. Im Rahmen dessen wurde der ganze Kram neu geordnet. Auf Seiten des Kernels gibt es vereinfacht gesagt einmal das "Kernel Mode Setting", was für die Ausgabe verantwortlich ist. Also welches Bild in der welcher Auflösung und Farbtiefe auf welchen Ausgang der Grafikkarte geschrieben wird und wie die an die Grafikkarte angeschlossenen Monitore zusammenhängen. Dazu kommt der "Direct Rendering Manager", der die GPU selbst ansteuert und aus einem Instruktionsstrom das Bild rendert. Wie das mit Kernelmodulen, Speichermanagern und so weiter zusammenhängt, ist sehr von der jeweiligen GPU und ihrer Treiberimplementierung abhängig. Auf Userlandseite braucht man eine Frontend-Bibliothek, die den Instruktionsstrom für die GPU erzeugt. Das ist bei den freien Treiber (fast) immer Mesa3D, was sich wiederum seitens der Anwendung durch OpenGL, OpenGL ES, DirectX und Vulkan in verschiedenen Versionen ansprechend lässt.
Nimmt man nun Wayland oder ein ähnliches Window System wie das gerade verstorbene Mir oder Androids Dingens, dessen Namen ich immer vergesse, ist man an dieser Stelle fertig. Ein Compositor rendert die Desktopdarstellung über Mesa3D, die GPU erzeugt vom Direct Rendering Manager gesteuert ein Bild und es wird dann per Kernel Mode Setting ausgegeben. Bei X11 benötigt man allerdings ein weiteres Modul, da X11 selbst Dinge managemen will, für die andere Komponenten zuständig sind. Außerdem nutzen nicht alle Windows Manager Compositing, auch die alten 2D-Rendering APIs sind noch weit verbreitet. Daher benötigt man einen DDX-Treiber, der X11 ermöglicht, all dies anzubieten. Früher gab es für jede Grafikkartenfamilie einen eigenen DDX-Treiber, also xf86-video-intel, xf86-video-radeon, etc. Da hauptsächlich dank Kernel Mode Setting und weniger wichtig dem Direct Rendering Manager aus dem Userland alle Grafikkarten gleich erscheinen, kann man mit xf86-video-modesetting einen generischen DDX-Treiber installieren.
Also unter Linux:
- Freie Treiber: Kernel Mode Setting und den Direct Rendering Manager zusammengetüdelt durch den Kerneltreiber, Mesa3D und xf86-video-modesetting.
- Nvidia: Kernel Mode Setting (nvidia-modesetting), Nvidias proprietäres Renderinterface (nvidia), Nvidias libGL, xf86-video-nvidia.
- AMD: Kernel Mode Setting und den Direct Rendering Manager + Proprietäre Erweiterungen zusammengetüddelt durch amdgpu (auch von freien Treibern nutzbar), AMDs proprietäre libGL oder Mesa3D, xf86-video-modesetting. Das ist noch sehr beta, in der Praxis dürfte man vor allem die Variante mit Mesa3D oder den alten, freien Render-Stack über radeonsi finden.
Unter FreeBSD ist die Sache nun ähnlich:
- Für Intel: Kernel Mode Setting und den Direct Rendering Manager, implementiert durch i915kms.ko und drm2.ko. Im Userland eigentlich xf86-video-modesetting, da das aber derzeit kaputt ist, doch wieder xf86-video-intel. Das alte x915.ko ist der alte Render Stack ohne Kernel Mode Setting. Der ist nur noch aus historischen Gründen da und funktioniert meines Wissens nicht mehr sauber. In 12-CURRENT ist er entfernt.
- Für Nvidia: Kernel Mode Setting durch nvidia-modesetting.ko, Nvidias proprietäres Renderinterface durch nvidia.ko, Nvidias libGL, xf86-video-nvidia
Derzeit ist unter FreeBSD allerdings bei den freien Treibern bei Intel Haswell Schluss und AMD wird praktisch gar nicht unterstützt. Zumindest keine halbwegs aktuellen Karten und die älteren Modelle nur recht bröselig. Daher gibt es ein Projekt, um ein aktuellen Kernel Mode Setting, einen aktuellen Direct Rendering Manager, aktuelle AMD- und Intel-Treiber, sowie den daran hängenden Rattenschwanz auf FreeBSD zu portieren. Anders als bisher wird aber keine echte Portierung mehr gemacht, stattdessen baut man einen Wrapper, der den Linux-Code idealerweise 1:1 auf FreeBSD ausführen kann. Damit kann man später einfach neuere Versionen übernehmen, muss allenfalls den Wrapper anpassen. Dies Projekt heißt "drm-next", basierte einige Zeit auf Linux 4.9, inzwischen ist es aber weiter, meine ich. Bisher ist es noch nicht in FreeBSD angekommen, sollte es aber bald. Wer es nutzen will, um aktuellen AMD- und Intel-Karten anzusprechen, muss daher seinen Kernel aus dem Branch bauen.
Keine Ahnung, ob das in nun in allen Details so korrekt und nicht zu sehr vereinfacht ist. Aber zumindest für den Überblick sollte es stimmen. Wikipedia hat auch noch eine Menge, ein guter Einstiegspunkt ist:
https://en.wikipedia.org/wiki/Mesa_(computer_graphics) Anders als ich unterschlagen sie auch nicht das Direct Rendering Interface, was das alles zusammenklebt.