2013-02-28 16 views
8

Sto cercando di individuare gli scenari in cui è possibile utilizzare gli oggetti di sincronizzazione in OpenGL. La mia comprensione è che un oggetto di sincronizzazione, una volta messo in GL command stream (usando glFenceSync()), verrà segnalato dopo che tutti i comandi GL sono stati eseguiti e realizzati. Se gli oggetti di sincronizzazione sono primitive di sincronizzazione, perché non possiamo segnalarli MANUALMENTE? Dove esattamente questa funzionalità può aiutare il programmatore GL?Utilizzo di oggetti di sincronizzazione fence in OpenGL

Il seguente scenario è corretto?

Thread 1 : 

Load model 
Draw() 
glFenceSync() 

Thread 2 : 

glWaitSync(); 
ReadPixels 
Use data for subsequent operation. 

Ciò significa che non è possibile avviare il thread 2 a meno che glFenceSync() non venga chiamato in Thread 1?

+2

"* Questo significa che non è possibile avviare il thread 2 a meno che glFenceSync() non venga chiamato in Thread 1? *" Bene, finché non si chiama 'glFenceSync', l'oggetto sync non esiste ancora. Non puoi aspettare qualcosa che non esiste. –

risposta

8

Le fence non servono tanto a sincronizzare i thread, ma a sapere quando le operazioni asincrone sono terminate. Ad esempio, se si fa un glReadPixels in un oggetto buffer pixel (PBO), si potrebbe voler sapere che la lettura è stata completata, prima ancora di tentare di leggere o mappare il PBO nello spazio degli indirizzi del client.

Se si esegue un glReadPixels con un PBO come target, la chiamata verrà restituita immediatamente, ma il trasferimento dei dati potrebbe richiedere un po 'di tempo. Ecco dove le recinzioni sono utili.

+0

Ho una situazione in cui disegno in un FBO in un thread e quindi eseguo il rendering dalla texture del collegamento del colore a uno schermo in un altro thread (e creo una fence per sapere quando il rendering è completo). Quando è disponibile un nuovo FBO, restituisco il vecchio FBO e il recinto al manager dell'FBO in modo che possa interrogare il recinto e sapere che l'FBO è disponibile per la scrittura di nuovo. – Jherico