È quasi impossibile rispondere a questa domanda perché OpenGL di per sé è solo un'API front-end, e fintanto che un'implementazione aderisce alle specifiche e il risultato è conforme a questo, può essere fatto come preferisci.
La domanda potrebbe essere stata: come funziona un driver OpenGL al livello più basso. Ora è di nuovo impossibile rispondere a questo in generale, poiché un driver è strettamente legato a qualche componente hardware, il che potrebbe di nuovo fare le cose comunque lo sviluppatore lo ha progettato.
Quindi la domanda avrebbe dovuto essere: "Come appare in media dietro le quinte di OpenGL e del sistema grafico?". Diamo un'occhiata a questo dal basso verso l'alto:
Al livello più basso c'è un dispositivo grafico. Oggigiorno si tratta di GPU che forniscono un set di registri che controllano il loro funzionamento (che registra esattamente dipende dal dispositivo) hanno una memoria di programma per shader, memoria di massa per i dati di input (vertici, texture, ecc.) E un canale I / O per il resto del sistema su cui riceve / invia dati e flussi di comandi.
Il driver grafico tiene traccia dello stato delle GPU e di tutti i programmi applicativi delle risorse che fanno uso della GPU. Inoltre è responsabile della conversione o di qualsiasi altra elaborazione dei dati inviati dalle applicazioni (converte le texture nel formato pixel supportato dalla GPU, compila gli shader nel codice macchina della GPU). Inoltre fornisce un'interfaccia astratta dipendente dal driver per i programmi applicativi.
Poi c'è la libreria / driver client OpenGL dipendente dal driver. Su Windows questo viene caricato dal proxy tramite opengl32.dll, sui sistemi Unix risiede in due posti:
- Modulo GLX X11 e driver GLX dipendente dal driver
- e /usr/lib/libGL.so può contenere alcune cose dipendenti dal driver per il rendering diretto
Su MacOS X questo sembra essere "OpenGL Framework".
È questa parte che traduce le chiamate OpenGL come lo fai in chiamate alle funzioni specifiche del driver nella parte del driver descritta in (2).
Infine l'attuale libreria API OpenGL, opengl32.dll in Windows e su Unix /usr/lib/libGL.so; questo per lo più passa solo i comandi all'implementazione OpenGL corretta.
Il modo in cui avviene la comunicazione effettiva non può essere generalizzato:
In Unix la connessione 3 <-> 4 può avvenire o tramite Socket (sì, può, e va in rete se lo si desidera) o tramite Shared Memory. In Windows la libreria dell'interfaccia e il client del driver vengono entrambi caricati nello spazio degli indirizzi del processo, quindi non c'è molta comunicazione ma semplici chiamate di funzione e passaggio di variabili / puntatori. In MacOS X questo è simile a Windows, solo che non c'è separazione tra l'interfaccia OpenGL e il client del driver (questo è il motivo per cui MacOS X è così lento a tenere il passo con le nuove versioni di OpenGL, richiede sempre un aggiornamento completo del sistema operativo per fornire il nuovo struttura).
La comunicazione tra 3 <-> 2 può passare attraverso ioctl, lettura / scrittura o mappare parte della memoria nello spazio degli indirizzi del processo e configurare la MMU per attivare un codice driver ogni volta che vengono apportate modifiche a quella memoria. Questo è abbastanza simile su qualsiasi sistema operativo poiché devi sempre oltrepassare il confine kernel / userland: alla fine passi attraverso un po 'di syscall.
La comunicazione tra il sistema e la GPU avviene attraverso il bus perifiale e i metodi di accesso che definisce, quindi PCI, AGP, PCI-E, ecc., Che funzionano tramite Port-I / O, Memory Mapped I / O, DMA, IRQ.