Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using fence sync objects in OpenGL

I am trying to look for scenarios where Sync Objects can be used in OpenGL. My understanding is that a sync object once put in GL command stream ( using glFenceSync() ) will be signaled after all the GL commands are executed and realized. If the sync objects are synchronization primitives why can't we MANUALLY signal them ? Where exactly this functionality can help GL programmer ?

Is the following scenario a correct one ?

Thread 1 :

Load model
Draw()
glFenceSync()

Thread 2 :

glWaitSync();
ReadPixels
Use data for subsequent operation.

Does this mean that I can't launch thread 2 unless glFenceSync() is called in Thread 1 ?

like image 646
maverick9888 Avatar asked Feb 28 '13 13:02

maverick9888


1 Answers

Fences are not so much meant to synchronize threads, but to know, when asynchronus operations are finished. For example if you do a glReadPixels into a pixel buffer object (PBO), you might want to know, that the read has been completed, before you even attempt to read from or map the PBO to client address space.

If you do a glReadPixels with a PBO being the target, the call will return immediately, but the data transfer may indeed take some time. That's where fences come in handy.

like image 84
datenwolf Avatar answered Nov 12 '22 03:11

datenwolf