Index: ui/gl/gl_fence.cc |
diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc |
index 9a40ec2a8b652f11135be687c46aeef9a22216fb..68aa88b4229756965bbb48352502e3bbabab53d9 100644 |
--- a/ui/gl/gl_fence.cc |
+++ b/ui/gl/gl_fence.cc |
@@ -32,6 +32,10 @@ class GLFenceNVFence: public gfx::GLFence { |
return !!glTestFenceNV(fence_); |
} |
+ virtual void ClientWait() OVERRIDE { |
+ glFinishFenceNV(fence_); |
+ } |
+ |
private: |
virtual ~GLFenceNVFence() { |
glDeleteFencesNV(1, &fence_); |
@@ -62,6 +66,10 @@ class GLFenceARBSync: public gfx::GLFence { |
return length == 1 && value == GL_SIGNALED; |
} |
+ virtual void ClientWait() OVERRIDE { |
+ glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); |
+ } |
+ |
private: |
virtual ~GLFenceARBSync() { |
glDeleteSync(sync_); |
@@ -70,6 +78,37 @@ class GLFenceARBSync: public gfx::GLFence { |
GLsync sync_; |
}; |
+#if !defined(OS_MACOSX) |
+class EGLFenceSync : public gfx::GLFence { |
+ public: |
+ EGLFenceSync() { |
+ display_ = eglGetCurrentDisplay(); |
+ sync_ = eglCreateSyncKHR(display_, EGL_SYNC_FENCE_KHR, NULL); |
+ } |
+ |
+ virtual bool HasCompleted() OVERRIDE { |
+ EGLint value = 0; |
+ eglGetSyncAttribKHR(display_, sync_, EGL_SYNC_STATUS_KHR, &value); |
+ DCHECK(value == EGL_SIGNALED_KHR || value == EGL_UNSIGNALED_KHR); |
+ return !value || value == EGL_SIGNALED_KHR; |
+ } |
+ |
+ virtual void ClientWait() OVERRIDE { |
+ EGLint flags = EGL_SYNC_FLUSH_COMMANDS_BIT_KHR; |
+ EGLTimeKHR time = EGL_FOREVER_KHR; |
+ eglClientWaitSyncKHR(display_, sync_, flags, time); |
+ } |
+ |
+ private: |
+ virtual ~EGLFenceSync() { |
+ eglDestroySyncKHR(display_, sync_); |
+ } |
+ |
+ EGLSyncKHR sync_; |
+ EGLDisplay display_; |
+}; |
+#endif // !OS_MACOSX |
+ |
} // namespace |
namespace gfx { |
@@ -82,13 +121,15 @@ GLFence::~GLFence() { |
// static |
GLFence* GLFence::Create() { |
- if (gfx::g_driver_gl.ext.b_GL_NV_fence) { |
+#if !defined(OS_MACOSX) |
+ if (gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync) |
+ return new EGLFenceSync(); |
+#endif |
+ if (gfx::g_driver_gl.ext.b_GL_NV_fence) |
return new GLFenceNVFence(); |
- } else if (gfx::g_driver_gl.ext.b_GL_ARB_sync) { |
+ if (gfx::g_driver_gl.ext.b_GL_ARB_sync) |
return new GLFenceARBSync(); |
- } else { |
- return NULL; |
- } |
+ return NULL; |
} |
} // namespace gfx |