Qual è la relazione tra OpenGL, GLX, DRI e Mesa3D?


17

Sto iniziando a fare una programmazione 3D di basso livello in Linux. Ho molta esperienza nell'uso dell'API grafica OpenInventor di livello superiore.

So che non è strettamente necessario essere consapevoli di come tutte queste cose si incastrano ma sono solo curioso. So che OpenGL è solo uno standard per le applicazioni grafiche. Mesa3D sembra essere un'implementazione open source di questo standard.

Allora, dove si adattano GLX e DRI? Scavando su Wikipedia e su tutti questi siti web, devo ancora trovare una spiegazione di come va esattamente tutto insieme. Dove si verifica l'accelerazione hardware? Cosa hanno a che fare i driver proprietari con questo?

Risposte:


15

Tranne OpenGL, non ho mai usato quelle librerie, ma cercherò di indovinare, leggendo le pagine di Wikipedia, come hai fatto tu.

Sembri giusto su Mesa. Ecco le informazioni aggiuntive che abbiamo:

"Il sistema X Window è un sistema software e un protocollo di rete che fornisce una GUI di base per i computer in rete. Crea un livello di astrazione hardware."

"GLX consente ai programmi che desiderano utilizzare OpenGL di farlo all'interno di una finestra fornita da X Window System.
GLX è costituito da tre parti:
- Un'API che fornisce funzioni OpenGL.
- Un'estensione del protocollo X, che consente al client di inviare 3D comandi di rendering - Un'estensione del server X che riceve i comandi di rendering dal client e li trasmette alla libreria OpenGL installata
Se client e server sono in esecuzione sullo stesso computer ed è disponibile una scheda grafica 3D accelerata, i due componenti precedenti possono essere bypassato dal DRI. Il programma client può quindi accedere direttamente all'hardware grafico. "

"Direct Rendering Infrastructure (DRI) è un'interfaccia utilizzata nel sistema X Window per consentire alle applicazioni degli utenti di accedere all'hardware video senza richiedere il passaggio dei dati attraverso il server X."

"Open Inventor è un'API grafica 3D C ++ progettata per fornire un livello superiore di programmazione per OpenGL"

Per semplificare le cose, immaginiamo un flusso semplificato di dati (e comandi) che si verifica alle voci e alle uscite di ciascuna di queste API. All'inizio abbiamo il tuo programma applicativo (codice compilato), che esegui dal tuo computer. Alla fine abbiamo immagini che vengono visualizzate sul tuo schermo.

Esistono diversi casi che trattengo dalle risposte a queste domande:
-il tuo computer ha una scheda grafica (GPU), o solo una CPU, per elaborare le funzioni grafiche?
-la tua applicazione è integrata in una finestra del sistema x-window?
-se usi il sistema x window, il "x server" è in esecuzione sul tuo computer o su un altro computer in rete?
Presumo che tu abbia i driver per la tua GPU se ne hai uno e che tu abbia Mesa per il rendering del software).

Primo scenario: esegui un'applicazione grafica scritta con OpenInventor, senza utilizzare il sistema X Window e non hai una scheda grafica. Il flusso del programma sarebbe abbastanza simile a:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Mesa
  ↓ (implemented OpenGL functions to be run on the CPU)
[Probably] Operating System rendering API
  ↓
3D Images on your screen

Quello che succede qui si chiama "rendering software": i comandi grafici non sono gestiti da alcun hardware grafico, ma invece dalla tua solita CPU, il processore che generalmente esegue il software.

Secondo scenario: ora immagina che con le stesse condizioni di cui sopra, hai una scheda grafica. Il flusso sarebbe più simile a questo:

Your application
  ↓ (uses functions of)
OpenInventor
  ↓ (calls functions declared by)
OpenGL
  ↓ (redirects function calls to implementation defined by)
Proprietary Drivers
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

Quello che succede ora si chiama "accelerazione hardware", di solito più veloce del primo scenario.

Terzo scenario: ora introduciamo il flusso di X Window System, o almeno come penso, basato sulle poche righe di Wikipedia che ho letto.
Dimentichiamoci dell'hardware grafico e dell'API per un po '. Il flusso dovrebbe apparire come:

Your application (X Window System sees it as an "X Client")
  ↓ (sends requests defined by the X Window System Core Protocol)
X Server
  ↓ (convert your request to graphic commands)
[Probably] Operating System rendering API
  ↓
Windows or 2D images on your screen

Si noti che quando si utilizza X Window System, lo schermo e il computer da cui si esegue l'applicazione potrebbero non essere "direttamente" connessi, ma potrebbero essere collegati attraverso una rete.

Quarto scenario: supponiamo di voler aggiungere fantasiosi rendering grafici 3D all'applicazione X Client dell'esempio precedente. Mi sembra che il sistema X Window inizialmente non sia in grado di farlo, o almeno richiederebbe molto codice contorto per eseguire l'equivalente di una funzione API OpenGL.
Fortunatamente puoi usare GLX per aggiungere supporto per i comandi OpenGL al sistema. Ora hai:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
X Server with the GLX extension
  ↓ (convert your request to OpenGL commands)
OpenGL
  ↓ (redirects function calls to implementation defined by)
 ...

Ora puoi ricollegare l'ultima freccia a quella dopo "OpenGL" nel primo scenario: puoi ottenere immagini 3D sul tuo schermo!

Infine su ciò che penso capisca del DRI:
sembra consentire a Mesa di avere accesso alla GPU, in modo da modificare il flusso del nostro primo scenario in:

...
  ↓
Mesa
  ↓ (forwards OpenGL commands)
DRI
  ↓ (converts OpenGL commands to GPU commands)
Graphic Card
  ↓
3D Images on your screen

E sembra anche cortocircuitare il flusso quando si utilizza GLX, data la condizione che il suo server e client si trovino sullo stesso computer e che si disponga di una GPU. In tal caso, il grafico del nostro quarto scenario diventerebbe semplicemente:

Your application
  ↓ (sends graphic requests defined by the "GLX extension to the X Protocol")
DRI
  ↓ ("catches" OpenGL commands and converts them to GPU commands)
Graphic Card
  ↓
3D Images on your screen

Questo è tutto !
Ora tieni presente che non sono un esperto in ambienti Unix, quindi il mio miglior consiglio è di studiare la documentazione di ciascuna di queste API per sapere esattamente cosa possono fare.
La combinazione del grafico precedente in uno singolo potrebbe rendere le cose più facili da capire. Ho lasciato questo come esercizio per te!


1
è solo una teoria basata sulla deduzione da poche frasi. non è la verità.
KawaiKx

8

OpenGL è indipendente dalla piattaforma; ciò significa che l'API OpenGL è indipendente dalla piattaforma.

Gli stati e i buffer OpenGL sono raccolti da un oggetto astratto, comunemente chiamato contesto.

La piattaforma di hosting è responsabile di fornire alcune API per creare il contesto OpenGL per la piattaforma sottostante. Su Windows ci sono le routine wgl * (Windows per GL), su Unix ci sono routine glX * (GL per X).

Infatti GLX non è altro che un'API che consente all'applicazione di creare un contesto OpenGL, al fine di utilizzare l'API OpenGL.

Le operazioni WGL / GLX comuni sono la creazione di una finestra, la creazione di un buffer off-screen, rendere il contesto OpenGL aggiornato su un thread, scambiare buffer di disegno ...

DRI invece è uno strato del kernel che consente la comunicazione diretta con la scheda grafica, bypassando l'XServer, velocizzando infatti l'applicazione usando le routine OpenGL.


3

http://www.bitwiz.org.uk/s/how-dri-and-drm-work.html

L'infrastruttura di rendering diretto, nota anche come DRI, è un framework per consentire l'accesso diretto all'hardware grafico sotto il sistema X Window in modo sicuro ed efficiente. Include modifiche al server X, a diverse librerie client e al kernel (DRM, Direct Rendering Manager). L'uso più importante per il DRI è la creazione di implementazioni OpenGL veloci che forniscono l'accelerazione hardware per Mesa. Diversi driver con accelerazione 3D sono stati scritti secondo le specifiche DRI, inclusi i driver per chipset prodotti da 3DFX, AMD (precedentemente ATI), Intel e Matrox.


2

Per dirla semplicemente, OpenGL è il tipo e le specifiche della libreria grafica. Mesa è un'implementazione di base. DRI è un sistema di interfaccia hardware.

Mesa si riferisce sostanzialmente a tutto il quadro. Tuttavia, presumo che tu stia parlando del driver hardware Mesa.

DRI è sostanzialmente l'interfaccia del kernel per gestire l'hardware. Tecnicamente potrebbe essere usato per altre cose, ma è stato realizzato per Mesa ed è utilizzato principalmente per Mesa.

GLX è come tutto si interfaccia con X !!

Per capire cosa sia ogni parte, devi sapere come si adatta insieme.

Un programma è progettato per interfacciarsi con qualsiasi libreria openGL.

GLX è un mezzo per interfacciare OpenGL con o tramite X11. A seconda che tu abbia un'interfaccia "Diretta" o un'interfaccia "Indiretta" dipende se il tuo programma si preoccuperà di questo.

libGL è praticamente l'interfaccia per questi. Di solito viene fornito da Mesa se si utilizza un driver Mesa.

In una configurazione indiretta si procede come segue: Framework di applicazioni (ad es. Applicazione scritta, motore o API di astrazione) | LibGL | Driver Mesa | DRI | Hardware

In questa configurazione, GLX viene utilizzato solo sul lato per gestire l'interfaccia tra l'uso GL del programma e altri programmi. Oltre alle chiamate specifiche GLX utilizzate per fare cose che richiedono la comunicazione dello stack X11 e dei suoi programmi di supporto (come Window Manager) GLX è in gran parte intatta. in questa disposizione.

Inoltre, è possibile utilizzare il passthrough dei comandi e la memoria condivisa per ottimizzare ulteriormente i livelli in questo sistema. Tutto ciò riduce le latenze e migliora la velocità di accesso all'hardware. Questo è ciò che di solito vuoi.

Per un indiretto è il tuo quadro applicativo | LibGL (lato utente) | LibGLX | LibGL (lato X11) | Driver hardware Mesa | DRI | Hardware

Il vantaggio è che non è necessario un buffer di memoria condivisa diretta con l'hardware per utilizzare questa configurazione. (Consentendo client di rete, oltre a maggiore robustezza e una configurazione più sicura.)

Questa configurazione può funzionare su più macchine virtuali che condividono una singola scheda video o addirittura accedono a una rete per questo motivo. Alcune forme di memoria condivisa o memoria virtuale "clonata" condivisa possono essere utilizzate a causa di estensioni più recenti, ma non è l'accesso diretto alla memoria video trovato nella modalità di rendering diretto.

Lo svantaggio è che l'uso di pipe o prese di rete per interfacciarsi con X11 può essere lento, quantomeno introducendo latenze su programmi ben ottimizzati e, nel peggiore dei casi, riducendo drasticamente i frame rate su quelli scarsamente ottimizzati.

Questo è il tipo di installazione migliore per i client in rete, configurazioni che richiedono una sicurezza più solida e configurazioni in cui più sistemi operativi devono condividere l'hardware eseguendo lo stesso stack GL. È tutt'altro che ottimale ma ti dà un certo grado di accelerazione hardware.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.