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

15

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

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

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

    
posta ttb 15.09.2012 - 21:22
fonte

4 risposte

14

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

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

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

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

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

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

Per semplificare le cose, immaginiamo un flusso semplificato di dati (e comandi) che avvengono alle entrate 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 le immagini che vengono visualizzate sullo schermo.

Ci sono diversi casi che tratterò delle risposte a queste domande:
-Il tuo computer ha una scheda grafica (GPU), o solo una CPU, per elaborare le funzioni grafiche?
-è la tua applicazione incorporata 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 sulla rete?
Immagino che tu abbia i driver per la tua GPU se ne possiedi uno e che hai Mesa per il rendering del software).

Primo scenario: si esegue un'applicazione grafica scritta con OpenInventor, senza utilizzare il sistema X Window, e non si dispone di 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 del software": i comandi grafici non sono gestiti da alcun hardware grafico, ma 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 è chiamato "accelerazione hardware", solitamente più veloce del primo scenario.

Terzo scenario: ora introduciamo il flusso del sistema X Window, o almeno come penso, basato sulle poche righe di Wikipedia che ho letto.
Dimentichiamo per un po 'l'hardware grafico e l'API. Il flusso dovrebbe essere simile a:

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 viene eseguita l'applicazione potrebbero non essere collegati "direttamente", ma potrebbero essere collegati tramite una rete.

Quarto scenario: supponiamo di voler aggiungere fantastici rendering grafici 3D all'applicazione client X dell'esempio precedente. Mi sembra che l'X Window System non sia originariamente in grado di farlo, o per lo meno richiederebbe molto codice complicato per eseguire l'equivalente di una funzione API OpenGL.
Fortunatamente è possibile utilizzare GLX per aggiungere il 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 sullo schermo!

Finalmente ciò che penso capisca del DRI:
Sembra che Mesa abbia 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 server e il client si trovino sullo stesso computer e che si disponga di una GPU. In quel 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.
Combinare il grafico precedente in un singolo potrebbe rendere le cose più facili da capire. Lo faccio come un esercizio per te!

    
risposta data 16.09.2012 - 21:37
fonte
7

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

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

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 le routine glX * (GL per X).

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

Le operazioni comuni di WGL / GLX sono la creazione di una finestra, la creazione di un buffer fuori dallo schermo, rendere corrente il contesto OpenGL su un thread, scambiare i buffer di estrazione ...

Il DRI invece è un livello del kernel che consente la comunicazione diretta con la scheda grafica, bypassando l'XServer, accelerando effettivamente l'applicazione usando le routine OpenGL.

    
risposta data 17.09.2012 - 16:56
fonte
3

link

La Direct Rendering Infrastructure, 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 del DRI è la creazione di implementazioni OpenGL veloci che forniscano l'accelerazione hardware per Mesa. Diversi driver 3D accelerati sono stati scritti sulla specifica DRI, inclusi i driver per chipset prodotti da 3DFX, AMD (precedentemente ATI), Intel e Matrox.

    
risposta data 09.03.2014 - 09:30
fonte
2

Per dirla semplicemente OpenGL è il tipo e le specifiche della libreria grafica. La Mesa è una implosione di base. DRI è un sistema di interfaccia hardware.

Mesa si riferisce fondamentalmente all'intero framework. Tuttavia, presumo che tu stia parlando del driver hardware di Mesa.

DRI è fondamentalmente l'interfaccia del kernel per gestire l'hardware. Tecnicamente potrebbe essere usato per altre cose, ma è stato creato per Mesa e viene utilizzato principalmente per Mesa.

GLX è come tutto si interfaccia a X !!

Per capire che cos'è 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 se hai un'interfaccia "Diretta" o un'interfaccia "Indiretta" dipende se il tuo programma si preoccuperà di questo.

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

In una configurazione indiretta va come segue: Quadro delle applicazioni (vale a dire applicazione scritta, motore o API di astrazione) | libGL | Mesa Driver | DRI | Hardware

In questa configurazione, GLX è appena usato sul lato per gestire l'interfaccia tra l'uso GL del tuo programma e altri programmi. A parte le chiamate specifiche di GLX usate per fare cose che richiedono la comunicazione dello stack X11 e dei suoi programmi di supporto (come i Window Managers) GLX è in gran parte non toccato. in questa disposizione.

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

Per un indiretto lo è Il tuo quadro applicativo | LibGL (lato utente) | libglx | LibGL (lato X11) | Driver hardware Mesa | DRI | Hardware

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

Questa configurazione può funzionare su più VM che condividono una singola scheda video o addirittura accedere attraverso una rete a causa di ciò. Alcune forme di memoria condivisa o memoria virtuale "clonata" possono essere utilizzate a causa delle nuove estensioni, ma non è l'accesso diretto alla memoria video che si trova nella modalità di rendering diretto.

Lo svantaggio è che l'uso di pipe o socket di rete per interfacciarsi con X11 può essere lento, per lo meno introdurre latenze su programmi ben ottimizzati e, nel peggiore dei casi, ridurre drasticamente i frame-rate su quelli poco ottimizzati.

Questo è il tipo di installazione migliore per i client di rete, le configurazioni che richiedono una sicurezza più robusta e le 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.

    
risposta data 12.07.2017 - 05:40
fonte

Leggi altre domande sui tag