Buongiorno, sto giocando un pò con opengl e vorrei capire un pò meglio quello che sto facendo.
Le funzioni che disegnano vertici e poligoni, che impostano un tipo di prospettiva, ecc... sono esguite dalla cpu o dalla gpu della scheda grafica?
Grazie
apatriarca ha scritto:Le chiamate nelle OpenGL sono asincrone. In pratica inseriscono uno o più comandi corrispondenti a quello che devi fare in una specie di coda e non hai modo di sapere quando il comando viene eseguito. In realtà nelle versioni più recenti ci sono alcuni sistemi per sapere quando alcune operazioni vengono eseguite ed è possibile usare glFinish che è sincrono e aspetta che la coda venga svuotata prima di tornare all'esecuzione della funzione, ma in pratica niente di tutto ciò viene usato (se non in casi particolari). E' comune nelle applicazioni grafiche essere un po' indietro rispetto allo stato interno del programma, ma è qualcosa con la quale si deve vivere ed è in ogni caso inevitabile.
apatriarca ha scritto:Normalmente dalla GPU, ma dipende. Esistono infatti implementazioni delle OpenGL che utilizzano la CPU per disegnare la scena (si tratta principalmente di implementazioni pensate per sistemi non dotati di scheda grafica o senza driver appositi. Ci sono poi situazioni, sempre meno frequenti per fortuna, in cui alcuni driver utilizzano la CPU invece della GPU per emulare funzionalità non supportate dalla scheda video. Si trattava a volte di scelte di marketing. La specifica delle OpenGL non richiede infatti che le chiamate siano effettuate su un tipo di hardware specifico e non richiede che una certa operazione sia efficiente. Un driver può (ma era più comune in passato - soprattutto su schede video integrate Intel) dire di supportare qualcosa, per esempio una specifica versione delle OpenGL, accelerare in hardware solo alcune operazioni e disattivare tale accelerazione negli altri casi senza alcun tipo di avvertimento. Tali funzionalità capaci di disattivare l'accelerazione hardware potevano per esempio essere alcuni formati per le texture o il supporto agli shader..
(...)
apatriarca ha scritto:La natura asincrona delle OpenGL ha ben poco a che vedere con la programmazione ad eventi o gli hw interrupt. E' per certi versi simile alla programmazione web. Perché un comando venga eseguito sulla GPU è infatti necessario che tale comando e tutti i dati ad esso associati vengano inviati alla GPU attraverso il canale apposito. Una volta che la GPU ha ricevuto questi comandi li deve poi eseguire. Tutto questo richiede tantissimo tempo (dal punto di vista del processore) e non ha senso che la CPU aspetti che i comandi vengano eseguiti per continuare a fare qualcosa. E' per questo che le chiamate OpenGL ritornano subito al tuo programma dopo che il comando è stato mandato alla GPU ma non aspettano che tale comando sia stato eseguito ed in effetti potrebbe volerci tanto perché questo avvenga (potrebbero esserci altri comandi non ancora eseguiti in coda per esempio).
I passi per disegnare un triangolo sullo schermo sono tantissimi in una moderna scheda video. Tanto per darti una idea, dai una occhiata alla moderna pipeline delle OpenGL: http://www.seas.upenn.edu/~pcozzi/OpenG ... peline.pdf
apatriarca ha scritto:Ma non ci sono funzioni di callback nelle OpenGL e non si programma ad eventi. Non capisco a cosa tu stia facendo riferimento nel tuo post. In che cosa verrebbero usati gli interrupt?
Come ti ho già spiegato non c'è alcuna garanzia che qualcosa sia accelerato da una GPU (esistono implementazioni software), ma è quello che normalmente avviene quando c'è una GPU. Con ogni probabilità i triangoli che disegni con le OpenGL sono disegnati dalla GPU.
Visitano il forum: Nessuno e 1 ospite