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(...);
}