Diese Frage ist fast unmöglich zu beantworten, da OpenGL für sich genommen nur eine Front-End-API ist. Solange eine Implementierung der Spezifikation entspricht und das Ergebnis dieser entspricht, kann dies nach Ihren Wünschen erfolgen.
Die Frage könnte gewesen sein: Wie funktioniert ein OpenGL-Treiber auf der untersten Ebene? Dies ist nun wieder generell nicht mehr zu beantworten, da ein Treiber eng mit einer Hardware verbunden ist, die möglicherweise wieder Dinge tut, wie auch immer der Entwickler sie entworfen hat.
Die Frage hätte also lauten sollen: "Wie sieht es im Durchschnitt hinter den Kulissen von OpenGL und dem Grafiksystem aus?". Schauen wir uns das von unten nach oben an:
Auf der untersten Ebene gibt es ein Grafikgerät. Heutzutage sind dies GPUs, die einen Satz von Registern bereitstellen, die ihren Betrieb steuern (wobei die Register genau geräteabhängig sind), einen Programmspeicher für Shader, einen Massenspeicher für Eingabedaten (Eckpunkte, Texturen usw.) und einen E / A-Kanal für den Rest haben des Systems, über das es Daten und Befehlsströme empfängt / sendet.
Der Grafiktreiber verfolgt den GPU-Status und alle Ressourcenanwendungsprogramme, die die GPU verwenden. Es ist auch für die Konvertierung oder sonstige Verarbeitung der von Anwendungen gesendeten Daten verantwortlich (Konvertieren von Texturen in das von der GPU unterstützte Pixelformat, Kompilieren von Shadern im Maschinencode der GPU). Darüber hinaus bietet es eine abstrakte, treiberabhängige Schnittstelle zu Anwendungsprogrammen.
Dann gibt es die treiberabhängige OpenGL-Clientbibliothek / den Treiber. Unter Windows wird dies per Proxy über opengl32.dll geladen, auf Unix-Systemen an zwei Stellen:
- X11 GLX-Modul und treiberabhängiger GLX-Treiber
- und /usr/lib/libGL.so können einige treiberabhängige Elemente für das direkte Rendern enthalten
Unter MacOS X ist dies zufällig das "OpenGL Framework".
Dieser Teil übersetzt OpenGL-Aufrufe in Aufrufe der treiberspezifischen Funktionen in dem in (2) beschriebenen Teil des Treibers.
Schließlich die eigentliche OpenGL-API-Bibliothek, opengl32.dll in Windows und unter Unix /usr/lib/libGL.so; Dadurch werden die Befehle meist nur an die eigentliche OpenGL-Implementierung weitergegeben.
Wie die eigentliche Kommunikation abläuft, kann nicht verallgemeinert werden:
Unter Unix kann die 3 <-> 4-Verbindung entweder über Sockets (ja, möglicherweise über das Netzwerk, wenn Sie möchten) oder über Shared Memory erfolgen. In Windows werden sowohl die Schnittstellenbibliothek als auch der Treiberclient in den Prozessadressraum geladen. Das ist also nicht so viel Kommunikation, sondern einfache Funktionsaufrufe und Variablen- / Zeigerübergabe. In MacOS X ähnelt dies Windows, nur dass es keine Trennung zwischen OpenGL-Schnittstelle und Treiberclient gibt (dies ist der Grund, warum MacOS X so langsam mit neuen OpenGL-Versionen Schritt hält, dass immer ein vollständiges Betriebssystem-Upgrade erforderlich ist, um das neue zu liefern Rahmen).
Die Kommunikation zwischen 3 <-> 2 kann über ioctl, Lesen / Schreiben oder durch Zuordnen eines Speichers zum Prozessadressraum und Konfigurieren der MMU erfolgen, um Treibercode auszulösen, wenn Änderungen an diesem Speicher vorgenommen werden. Dies ist auf jedem Betriebssystem ziemlich ähnlich, da Sie immer die Kernel / Userland-Grenze überschreiten müssen: Letztendlich durchlaufen Sie einen Systemaufruf.
Die Kommunikation zwischen System und GPU erfolgt über den Periphialbus und die von ihm definierten Zugriffsmethoden, also PCI, AGP, PCI-E usw., die über Port-E / A, speicherabgebildete E / A, DMA, IRQs funktionieren.