2015-01-07 16 views
15

Quali sono i passaggi necessari per creare un driver GPU che esegue il rendering dei pixel su un display? Fondamentalmente solo il più semplice esempio di "ciao mondo" per creare un driver GPU, come ad esempio girare lo schermo in rosso o mostrare solo un singolo pixel. Da dove inizi?Esempio di driver grafico "ciao mondo"?

Mi piacerebbe hackerare direttamente sulla GPU, senza alcuna astrazione C o OpenGL o altro. Sto usando Mac OSX, e penso di avere la scheda grafica i7 Intel HD, in modo da these docs sembrava una buona misura:

Il progetto Mesa3D dice che ci sono un certo numero di driver grafici open source, e Wikipedia dice che Intel produce questi documenti in modo che tu possa scrivere un driver open source se vuoi, ma non spiegare come.

Mi sono imbattuto anche in Michael Abrash's Graphics Programming Black Book, il che spiega molto.

Tuttavia questo è un po 'troppo da mordere tutto in una volta. E non sembrano esserci informazioni su come iniziare a hackerare su un driver GPU, un progetto "ciao mondo".

Ad esempio:

  • Per saperne di assemblaggio, si può semplicemente brew install nasm, scrivere qualche assemblaggio, compilare ed eseguirlo per stampare "ciao mondo".
  • Per imparare Arduino, è possibile collegare una scheda Arduino al computer tramite un cavo USB, installare il loro software e caricare un codice C direttamente sulla scheda ed eseguirlo, per visualizzare una luce LED lampeggiante.

Come si esegue lo stesso tipo di operazione per la scheda grafica?

L'esempio di ciao mondo non deve necessariamente funzionare (anche se sarebbe bello se lo facesse!); Sarebbe utile anche solo delineare ciò che sarebbe necessario in un senso pratico/di livello superiore. Se non è possibile su un Mac o anche su Linux, sarebbe bene saperlo. Ma anche allora la domanda rimane, dove inizi a scrivere un driver grafico?

+0

Dipende dalla piattaforma scelta. Sei contento di avere solo un output grafico su un buffer che puoi poi riversare su un file, ma nessun output di visualizzazione reale? (display e grafica sono cose separate). Per nessun output di visualizzazione è sufficiente scrivere un driver ioctl primitivo che colpisce i registri GPU e fa le operazioni di base per l'avvio. Probabilmente puoi semplicemente assegnare un enorme blocco di memoria in modo statico per giocare, in modo da non dover perdere tempo nella gestione della memoria. Non c'è davvero un buon driver del mondo, un driver ha un sacco di requisiti solo per fare un pixel o chiaro. – djgandy

+0

Hai trovato quell'esempio di "ciao mondo"? Sarei molto interessato Grazie. –

risposta

11
  • Fase 1: Comprendere il particolare GPU ci si rivolge (Architettura, registrarsi e dettagli Stream). Ho paura per molte delle GPU che questi dettagli possono essere proprietari e potresti non ottenerlo.(Ma come hai detto, nel tuo caso le specifiche sono disponibili)
  • Step 2: aggiungi alcune chiamate nel tuo driver che sono in grado di interrogare registri/dettagli dal driver.
  • Passaggio 3: aggiungere alcune chiamate nel driver per modificare i registri. (Modalità di modifica, ecc.)
  • Passaggio 4: è possibile controllare come disegnare un triangolo/quad sulla GPU con un colore costante. Prova a implementare la schermata chiara (funzionalità simile a glClear) disegnando un grande quad o 2 triangoli o 1 triangolo di dimensioni doppie dello schermo o inviando qualche comando chiaro . (qualunque metodo sia supportato dalla GPU) Se si è disegnando un triangolo o quadruplo, utilizzare NDC (coordinate normalizzate del dispositivo) e preferire il funzionamento nel sistema di finestre Raw o NWS (sistema di finestre Null ). Il sistema Windowing è responsabile della visualizzazione del framebuffer di output dopo il compositing o di alcune elaborazioni successive. Con Raw o NWS, voglio dire visualizzare il framebuffer direttamente sullo schermo.
  • Passaggio 5 (la maggior parte delle cose è facoltativa): implementa un disegno complesso. Questo può comportare il supporto di altre modalità di disegno come pixel, linea , striscia triangolare, ventola triangolare ecc. E supporto di texture, illuminazione , trasformazione, interazione con altri sistemi di finestre. Per questo passaggio dovrai imparare il montaggio. Ma notate, questo è non assembly x86 o arm (CPU), piuttosto è assembly GPU che è specializzato nella gestione di SIMD.
  • Passaggio 6: Implementa funzionalità stencil. Prepara uno stencil di Hello World nel tuo programma. Cancella lo schermo con il colore 1. Applica lo stencil e cancella nuovamente lo schermo con il colore 2. Ora hai Ciao mondo scritto a colori 2 con colore 1 come sfondo.

La motivazione per fare tutto questo è: si desidera fare ciò. E questo sarà bello.

La demotivazione per fare ciò è: Possibile indisponibilità delle specifiche della GPU, curva di apprendimento per l'assemblaggio della GPU, complessità della grafica.

La mia raccomandazione: Se le specifiche GPU (insieme all'assemblaggio) sono disponibili, suggerirei di implementare sottoinsieme di qualsiasi set di API disponibile (aperto vg e aperto GLES 1.1) ad esempio. Per ulteriori informazioni su questo set di API, visitare il sito Web khronos.

+0

Grazie! Puoi entrare più nel dettaglio sul punto 2-4? Quando dici "Aggiungi alcune chiamate nel tuo autista che sono in grado di interrogare i registri", fino a "disegnare un triangolo/quad", quale sarebbe? È solo assemblaggio (come [questo] (https://github.com/lancejpollard/assembly-example/blob/master/osx/index.asm#L33-L41)) che posso compilare sulla riga di comando?Se è così, sembra che i comandi specifici dell'assemblaggio GPU siano probabilmente in quei documenti Intel sopra, giusto? O se non è assemblato, che cosa è esattamente - devo fare manualmente il cablaggio di qualsiasi hardware o posso fare tutto dalla riga di comando? –

+2

La ricerca di molti registri non richiede la conoscenza dell'assemblaggio. Solo per interrogare i registri interni (designati come) (dalle banche dei registri) è necessaria la conoscenza dell'assemblaggio, ma non è quasi mai necessario. Questo passaggio serve solo a garantire che siamo in grado di leggere il dispositivo (GPU). Questo assicurerà che tu capisca come la GPU è connessa al bus ecc. Non è necessario cablare manualmente il dispositivo, ma sì, è disponibile un simulatore per il driver, potrebbe essere utile (eliminando tutti i rischi) afferrare il dispositivo di comprensione migliore. –

+2

Una volta che è possibile leggere/scrivere registri, è necessario imparare dalla documentazione su come cancellare lo schermo (Output FBO). A seconda della GPU, questo metodo può disegnare un quad di dimensioni dello schermo, inviando un chiaro comando, disegnando due triangoli sullo schermo o disegnando un grande triangolo che può divorare lo schermo completo. (base = screen_width * 2 e height = screen_height) è il più piccolo di questi triangoli. Una volta che si è in grado di cancellare lo schermo o disegnare un triangolo sullo schermo con il colore desiderato, si può fare qualsiasi disegno 3d che si desidera. –