Chromium Code Reviews| Index: ui/gl/gl_fence.cc |
| diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc |
| index 9a40ec2a8b652f11135be687c46aeef9a22216fb..15b21a9fa9919f33aaa8fa204047823d0265de6b 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() { |
| + NOTIMPLEMENTED(); |
|
apatrick_chromium
2013/06/18 22:15:01
glFinishFenceNV(fence_);
epenner
2013/06/18 22:37:25
Done.
|
| + } |
| + |
| private: |
| virtual ~GLFenceNVFence() { |
| glDeleteFencesNV(1, &fence_); |
| @@ -62,6 +66,10 @@ class GLFenceARBSync: public gfx::GLFence { |
| return length == 1 && value == GL_SIGNALED; |
| } |
| + virtual void ClientWait() { |
| + NOTIMPLEMENTED(); |
|
apatrick_chromium
2013/06/18 22:15:01
glClientWaitSyncARB(sync_, SYNC_FLUSH_COMMANDS_BIT
epenner
2013/06/18 22:37:25
Done. Note there is no ARB, and added GL_ to const
|
| + } |
| + |
| private: |
| virtual ~GLFenceARBSync() { |
| glDeleteSync(sync_); |
| @@ -70,6 +78,36 @@ class GLFenceARBSync: public gfx::GLFence { |
| GLsync sync_; |
| }; |
| +class EglFenceSync : public gfx::GLFence { |
|
apatrick_chromium
2013/06/18 22:15:01
We've been using "EGL" (all caps) everywhere else.
epenner
2013/06/18 22:37:25
Done.
|
| + public: |
| + EglFenceSync() { |
| + sync_ = eglCreateSyncKHR(eglGetCurrentDisplay(), |
|
apatrick_chromium
2013/06/18 22:15:01
nit: make first arg display_ and move the statemen
epenner
2013/06/18 22:37:25
Done.
|
| + EGL_SYNC_FENCE_KHR, NULL); |
| + display_ = eglGetCurrentDisplay(); |
| + } |
| + |
| + 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_; |
| +}; |
| + |
| } // namespace |
| namespace gfx { |
| @@ -82,7 +120,9 @@ GLFence::~GLFence() { |
| // static |
| GLFence* GLFence::Create() { |
| - if (gfx::g_driver_gl.ext.b_GL_NV_fence) { |
| + if (gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync) { |
| + return new EglFenceSync(); |
| + } else if (gfx::g_driver_gl.ext.b_GL_NV_fence) { |
| return new GLFenceNVFence(); |
| } else if (gfx::g_driver_gl.ext.b_GL_ARB_sync) { |
| return new GLFenceARBSync(); |