GL_OES_EGL_sync#
Supported Hardware#
Series5, Series5XT, Series6, Series6XE, Series6XT
Valid APIs#
OpenGL ES 1.x, 2.0, 3.x
Description#
This extension enables the use of EGLSync objects in an OpenGL ES command stream. EGLSync objects are defined in separate extensions, such as EGL_KHR_fence_sync.
Note#
This functionality is superseded by GLSync objects in OpenGL ES 3.0, but is still useful for cross-API communication.
Registry Link#
http://www.khronos.org/registry/gles/extensions/OES/EGL_KHR_fence_sync.txt
Example#
// Disclaimer: None of this is good thread-safe code, it's pseudo-code for illustration. The exact CPU-side synchronisation mechanism will depend on your code.
// A fence sync handle accessible from both threads.
EGLSyncKHR g_eglFenceSync = 0;
// Pseudo-Function representing operations on a thread, in particular this thread is acting as
// a data producer.
void Thread1()
{
// Render something
glDraw(...);
// Create a fence sync object in the command stream after the draw call, so a second
// thread knows when the render operation is completed.
g_eglFenceSync = eglCreateSyncKHR(eglDisplay, EGL_SYNC_FENCE_KHR, NULL);
/* Call eglClientWaitSync to flush the context, so that it's guaranteed to finish at
some point. It only flushes the current context for the thread, hence calling it
here - Flushing from the thread which actually needs to wait on this sync object
would not flush the previous draw operations. By setting the timeout to 0 we've
effectively called "glFlush" but a little more precisely, and it must work on all
drivers.
*/
EGLint waitResult = eglClientWaitSyncKHR(eglDisplay, eglFenceSync,
EGL_SYNCH_FLUSH_COMMANDS_BIT_KHR, 0);
}
// Pseudo-Function representing operations on a second thread. This thread acts as a data consumer.
void Thread2()
{
while(g_eglFenceSync == 0)
{
// Do some other work, the first thread isn't ready.
}
// Wait for the synchronisation object
EGLint waitResult = eglClientWaitSyncKHR(eglDisplay, eglFenceSync,
EGL_SYNCH_FLUSH_COMMANDS_BIT_KHR, EGL_FOREVER_KHR);
// Destroy the fence sync object once we're done with it.
EGLBoolean success = eglDestroySyncKHR(eglDisplay, eglFenceSync);
// Now that the first thread's rendering has completed, do something with the result.
// For example, composite the result of the draw into a windowing system.
glDraw(...);
}