2013-08-28 13 views
6

Motivazione: scrivere un programma in C (e Assemblaggio, se necessario) per colorare un'area rettangolare nello schermo rosso.Qual è il livello più basso assoluto di astrazione "disegno" in GNU/Linux?

Requisiti STRICT - GNU/Linux in esecuzione con le utilità e le interfacce minime nude nella modalità testo/console. Quindi nessuna X (o equivalente come Wayland/Mir), nessuna libreria non predefinita (al di fuori POSIX, LSB, ecc. Fornita dal kernel) o nessuna supposizione aggiuntiva, tranne la presenza del driver del dispositivo per il monitor.

In effetti, quello che sto cercando sono informazioni su come scrivere un programma che alla fine invierà un segnale attraverso la porta VGA e il cavo al monitor per colorare una particolare parte dello schermo rosso.

Ci scusiamo se questo suona maleducato, ma non "Perché vuoi farlo?" o "Perché non usi la libreria ABC?" risposta. Sto cercando di capire come scrivere un'implementazione del server X o una libreria kernel framebuffer (/ dev/fb0) per esempio. Va bene fornire un collegamento all'origine di una libreria C.

+2

http://wiki.osdev.org/VGA_Hardware – Joe

+1

[OpenGL] (http://www.opengl.org/) è, come suggerisce il nome, aperto. Suppongo che tu possa trovare qualche suggerimento per quello che vuoi fare lì. È un livello molto basso, cioè punti, linee, triangoli, colori. Il codice sorgente dovrebbe aiutarti a vedere un esempio di come funziona questa libreria, e c'è una grande quantità di documentazione. [Guarda qui] (http://stackoverflow.com/questions/3352648/where-can-i-download-source-code-of-opengl) per le possibilità del codice sorgente. – ryyker

+2

Il punto è trattare diverse schede grafiche molto diverse. AFAIK, il sottoinsieme comune è VGA che è obsoleto oggi (risoluzione troppo piccola, ecc ...). Avrai bisogno di immergerti in cose specifiche dell'hardware, e il dolore inizia lì .... Wayland o X ti forniscono un'astrazione comune per gestire varie schede grafiche .... –

risposta

1

nessun presupposto aggiuntivo tranne la presenza del driver di periferica per il monitor.

Ciò significa che è possibile utilizzare X o Wayland, perché quelli sono l'infrastruttura dei driver grafici su Linux.

Linux (il Kernel) di per sé non contiene alcuna grafica primitiva. Fornisce alcune interfacce per parlare con la GPU, allocare memoria su di esso e configurare il framebuffer sullo schermo. Ma eccetto il raw framebuffer, l'accesso alla memoria del kernel Linux non ha modo di eseguire operazioni di disegno. Per questo è necessaria una certa infrastruttura nello spazio utente.

Wayland si basa sulla DRI2, che a sua volta parla dell'API del kernel DRM. Quindi hai bisogno di un tracker di stato dipendente dalla GPU. Mesa ha tracker di stato per un certo numero di GPU e offre frontend OpenGL e OpenVG.

I driver NVidia e ATI, a sorgente chiusa, sono progettati per funzionare solo con X. Quindi con chi usa la GPU devi usare X. È così.

Al di fuori di questo è possibile manipolare la memoria del framebuffer su schermo tramite /dev/fbdev, ma si tratta di una semplice spinta pixel, senza alcuna accelerazione GPU.

+0

Quindi se elaboro i commenti sulla domanda e questa risposta, questo è ciò che concludo. In teoria, posso usare "alcune interfacce per parlare con la GPU, allocare memoria su di essa e configurare il framebuffer su schermo" per creare la mia infrastruttura di visualizzazione o la mia libreria simile a OpenGL in un ** modo dipendente da GPU **. Posso anche usare/dev/fbdev senza i vantaggi dell'accelerazione GPU. Praticamente, utilizzerei il driver grafico, ma il driver dei principali fornitori dipende da X. Un'ultima domanda veloce: in che modo ncurses crea interfacce tipo GUI in modalità console? –

+2

@MozanSykol: Sì, questo è essenzialmente il modo in cui funziona. Bene, ncurses usa la normale modalità di testo. La console è una griglia N × M di caratteri e attributi (colore, sfondo, lampeggia). Il buon vecchio VGA supporta direttamente questo, cioè scrivendo i giusti valori nel posto giusto di memoria una scheda grafica compatibile VGA traccerà il testo in base a questo. Laddove VGA non è disponibile, il kernel di Linux può emularlo attraverso il dispositivo di memoria framebuffer ('/ dev/fbdev'). Ma la modalità testo non può fare alcun tipo di grafica di fantasia. – datenwolf

1

Una volta avevamo svgalib (o era chiamato vgalib?) Che ha fatto esattamente quello che stai cercando di fare. Ti raccomando di guardare il suo codice sorgente. Non so se è ancora possibile trovarlo da qualche parte, o se funzionerebbe effettivamente con un kernel moderno. Qualunque cosa tu faccia, sii pronto a riavviare spesso.

+1

SVGALib sembra utile. Wikipedia sostiene che può essere utilizzato come driver per SDL ma Wikipedia è spesso fuorviante sulla programmazione di cose correlate. Hai bisogno di sperimentare per scoprire se funziona. –

Problemi correlati