Qual è il vantaggio del meccanismo di accesso diretto allo stato di OpenGL?


11

Ho letto di OpenGL 4.5 Direct State Access (DSA) su opengl.org e non sono sicuro che lo stia facendo bene.

Sembra implicare che il vecchio modo sia meno efficiente:

glBind(something)
glSetA(..)
glSetB(..)
glSetC(..)

rispetto al nuovo modo:

glSetA(something, ..)
glSetB(something, ..)
glSetC(something, ..)

A quanto pare ora ognuno glSetdeve includere glBind(something)al suo interno e se OpenGL è ancora una macchina a stati non può trarre vantaggio dalle modifiche in streaming applicate a un singolo something.

Spiegare il ragionamento alla base e i vantaggi del nuovo DSA.

Risposte:


21

Dal suo aspetto ora ogni glSet deve includere glBind (qualcosa) al suo interno

Non esattamente. È il contrario, come descritto diversi paragrafi di seguito.

Anche se fosse vero, ricorda che i comandi GL dall'app client al server GL (aka driver) hanno un sacco di spese generali di spedizione rispetto a una normale chiamata di funzione. Anche se supponiamo che le funzioni DSA siano solo wrapper per le funzioni esistenti, sono wrapper che vivono all'interno del server GL e quindi possono avere (un po ') meno spese generali.

se OpenGL è ancora una macchina a stati non può trarre vantaggio dalle modifiche in streaming applicate a un singolo qualcosa.

Le GPU non sono macchine a stati. L'interfaccia della macchina a stati GL è un'emulazione che avvolge i driver interni simili a DSA, non viceversa.

Rimuovere uno strato di wrapping - uno strato che richiede un numero eccessivo di chiamate nel server GL - è chiaramente una vittoria, anche se piccolo.

L'approccio della macchina a stati inoltre non ha molto senso quando si ha a che fare con più thread; GL è ancora terribile in questo caso d'uso, ma i driver spesso usano thread dietro le quinte e una macchina a stati richiede molta sincronizzazione dei thread o algoritmi / costrutti paralleli davvero fantasiosi per far funzionare le cose in modo affidabile.

L'estensione DSA continua a formulare il suo funzionamento in termini di cambiamenti di stato perché, dopo tutto, è un'estensione di un documento esistente basato sullo stato e non un'API completamente nuova, quindi doveva essere pronto per il collegamento alla specifica GL esistente lingua e terminologia del documento. Anche se quel linguaggio esistente è abbastanza adatto al suo lavoro di moderna API hardware grafico.

Spiegare il ragionamento alla base e i vantaggi del nuovo DSA.

Il più grande ragionamento è che il vecchio modo era un dolore. Ha reso molto difficile comporre insieme librerie che potrebbero modificare o fare affidamento sullo stato GL. Ha reso difficile avvolgere in modo efficiente l'API GL in uno stile orientato agli oggetti o funzionale a causa delle sue profonde radici di gestione dello stato procedurale, che ha reso difficile il confezionamento dell'API in vari linguaggi non-C e ha anche reso difficile fornire wrapper per dispositivi grafici efficienti quell'astratto OpenGL di Direct3D.

Il secondo era l'overhead dell'API della macchina a stati procedurale, come descritto in precedenza.

In terzo luogo, le funzioni DSA hanno modificato la semantica, se del caso, dalle vecchie API che hanno consentito una maggiore efficienza. Le cose precedentemente mutabili sono state rese immutabili, ad esempio, il che rimuove un sacco di codice contabile dal server GL. Le chiamate dell'applicazione possono essere inviate all'hardware o convalidate prima (o in mode più parallele) quando il server GL non deve gestire oggetti mutabili.

-

Ulteriori giustificazioni e spiegazioni sono fornite nelle specifiche dell'estensione EXT_direct_state_access .

-

Le modifiche hardware rilevanti per la progettazione dell'API sono piuttosto numerose.

Ricorda che OpenGL risale al 1991. L'hardware di destinazione non era una scheda grafica di consumo (quelli non esistevano) ma grandi stazioni di lavoro CAD e simili. L'hardware di quell'epoca aveva prestazioni molto diverse rispetto a oggi; il multi-threading era più raro, i bus di memoria e le CPU avevano un gap di velocità minore e la GPU faceva poco più del rendering a triangolo a funzione fissa.

Sono state aggiunte sempre più funzioni a funzione fissa. Sono stati aggiunti vari modelli di illuminazione, modalità texture, ecc. Ognuno ha bisogno del proprio stato. Il semplice approccio basato sullo stato ha funzionato quando avevi una manciata di stati. Man mano che venivano aggiunti sempre più stati, l'API iniziò a esplodere. L'API è diventata più imbarazzante ma non si è discostata troppo dalle modalità hardware, poiché erano effettivamente basate su molti switch di stato.

Poi è arrivato l'hardware programmabile. L'hardware è diventato sempre più programmabile, al punto che ora l'hardware supporta un piccolo stato, alcuni programmi forniti dall'utente e molti buffer. Tutto quello stato dell'era precedente doveva essere emulato, così come tutti i driver a funzione fissa di quell'era venivano emulati.

Anche l'hardware è cambiato per essere sempre più parallelo. Ciò ha richiesto altre riprogettazioni hardware che hanno reso le modifiche dello stato della grafica molto costose. L'hardware funziona in grandi blocchi di stato immutabile. A causa di queste modifiche, il driver non poteva semplicemente applicare ogni piccola parte dello stato impostato dall'utente immediatamente, ma doveva impacchettare automaticamente le modifiche e applicarle quando necessario in modo implicito.

L'hardware moderno funziona ancora di più rispetto al classico modello OpenGL. DSA è un piccolo cambiamento che era necessario più di 10 anni fa (originariamente era stato promesso come parte di OpenGL 3.0), simile a quello che ha fatto D3D10. Molte delle modifiche hardware di cui sopra necessitano molto di più del semplice DSA per mantenere OpenGL rilevante, motivo per cui sono ancora disponibili estensioni ancora più grandi che cambiano drasticamente il modello OpenGL . Poi c'è la nuova API GLnext più D3D12, Mantle, Metal, ecc. Non una sola delle quali mantiene l'astrazione obsoleta della macchina a stati.


Grazie per la risposta. Quindi sembra che prima un certo punto la macchina a stati (non DSA) fosse una vittoria, ma a un certo punto qualcosa è cambiato e ora il DSA è vantaggioso. Puoi far luce su ciò che è cambiato?
Kromster,

@KromStern: ho fatto del mio meglio. Se hai bisogno di maggiori dettagli, qualcuno dovrà essere più informato di me.
Sean Middleditch il

@KromStern Ho visto (dalla mia ricerca limitata nella storia) openGL passare a chiamate di disegno sempre meno lato CPU per frame; elenchi di visualizzazione (per quello che valgono), glDrawArrays (disegnare in una chiamata), VBO (caricare una volta su GPU), VAO (associare i buffer agli attributi una volta), oggetto buffer uniforme (impostare uniformi in una volta sola). C'è altro che mi manca, ne sono sicuro.
maniaco del cricchetto

@ratchetfreak: stranamente, ci stiamo muovendo dall'altra parte ora. Le moderne API / estensioni si concentrano sull'aumento delle chiamate di disegno per frame, principalmente rimuovendo tutto quello stato che deve essere impostato / inviato per chiamata di disegno e rendendo le chiamate di disegno poco più di "inserire il comando di disegno nella coda di comando" contro un grande insieme di stato statico e risorse non vincolate. Oooh, indolore, ho dimenticato di menzionare anche quella parte nella mia risposta.
Sean Middleditch,

@SeanMiddleditch Avrei dovuto impostare chiamate per frame.
maniaco del cricchetto

1

La panoramica lo giustifica per:

Lo scopo di questa estensione è di renderlo più efficiente per le librerie per evitare di disturbare il selettore e lo stato bloccato. L'estensione consente inoltre un utilizzo più efficiente dei comandi eliminando la necessità di comandi di aggiornamento del selettore.

Penso che "più efficiente" qui si riferisca sia a un minore sovraccarico di contabilità per gli autori delle biblioteche, sia a prestazioni più elevate. Con l'API corrente, per essere "ben educati" è necessario interrogare lo stato, nasconderlo, cambiare lo stato per fare ciò che è necessario, quindi ripristinare lo stato originale.

Piace

oldState = glGet()
glBind()
glDoThings...
glSet(oldState)  // restore, in case anyone needs it just as they left it

Presumibilmente, l'hardware più vecchio potrebbe essere reso più performante con l'API esplicita che cambia stato; altrimenti è un rituale piuttosto strano. Questa estensione implica (e basta guardare la lista degli autori!) Che evitare quel recupero, set, ripristino danza è ora più di una prestazione vincente sull'hardware corrente, anche con il parametro aggiuntivo su ogni chiamata.


"bisogno di interrogare / nascondere / cambiare / ripristinare" - come è meglio con DSA?
Kromster,

..modificato pseudo codice da mostrare. Con DSA, nulla di tutto ciò è necessario. Presumibilmente l'hardware attuale non ha davvero bisogno di uno stato "vincolante", può solo accedervi tutto se necessario.
David Van Brink,

La catena get/bind/do/setviene utilizzata raramente, perché "Get" è molto lento. Di solito le app devono comunque conservare la replica delle variabili, quindi si riduce a solo bind/do. Vedo il punto però.
Kromster,

2
@krom get dallo stato del driver può essere veloce, parte dello stato ottenibile non ha attività sulla GPU, quindi può essere ottenuto dalla RAM che è veloce.
maniaco del cricchetto
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.