Chromium Code Reviews| Index: ui/gl/gl_fence.cc |
| diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc |
| index 1790f864415f12788297152e9c9645557b834cc5..97f48bab5b383957c9fdd8e6f289ee977c2c8142 100644 |
| --- a/ui/gl/gl_fence.cc |
| +++ b/ui/gl/gl_fence.cc |
| @@ -25,8 +25,11 @@ class GLFenceNVFence: public gfx::GLFence { |
| // We will arbitrarily return TRUE for consistency. |
| glGenFencesNV(1, &fence_); |
| glSetFenceNV(fence_, GL_ALL_COMPLETED_NV); |
| - if (flush) |
| + if (flush) { |
| glFlush(); |
| + } else { |
| + flush_event_ = gfx::GLContext::GetCurrent()->SignalFlush(); |
| + } |
| } |
| virtual bool HasCompleted() OVERRIDE { |
| @@ -34,11 +37,16 @@ class GLFenceNVFence: public gfx::GLFence { |
| } |
| virtual void ClientWait() OVERRIDE { |
| - glFinishFenceNV(fence_); |
| + if (flush_event_->IsSignaled()) { |
|
piman
2014/03/15 00:18:40
(here an below), you also need to check for flush_
no sievers
2014/03/19 01:25:21
Done.
|
| + glFinishFenceNV(fence_); |
| + } else { |
| + LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
| + NOTREACHED(); |
|
piman
2014/03/15 00:18:40
Maybe remove the NOTREACHED. It can be reached fro
no sievers
2014/03/19 01:25:21
Done.
|
| + } |
| } |
| virtual void ServerWait() OVERRIDE { |
| - glFinishFenceNV(fence_); |
| + ClientWait(); |
| } |
| private: |
| @@ -47,14 +55,18 @@ class GLFenceNVFence: public gfx::GLFence { |
| } |
| GLuint fence_; |
| + scoped_refptr<gfx::GLContext::FlushEvent> flush_event_; |
| }; |
| class GLFenceARBSync: public gfx::GLFence { |
| public: |
| GLFenceARBSync(bool flush) { |
| sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); |
| - if (flush) |
| + if (flush) { |
| glFlush(); |
| + } else { |
| + flush_event_ = gfx::GLContext::GetCurrent()->SignalFlush(); |
| + } |
| } |
| virtual bool HasCompleted() OVERRIDE { |
| @@ -69,11 +81,21 @@ class GLFenceARBSync: public gfx::GLFence { |
| } |
| virtual void ClientWait() OVERRIDE { |
| - glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); |
| + if (flush_event_->IsSignaled()) { |
| + glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); |
| + } else { |
| + LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
| + NOTREACHED(); |
| + } |
| } |
| virtual void ServerWait() OVERRIDE { |
| - glWaitSync(sync_, 0, GL_TIMEOUT_IGNORED); |
| + if (flush_event_->IsSignaled()) { |
| + glWaitSync(sync_, 0, GL_TIMEOUT_IGNORED); |
| + } else { |
| + LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
| + NOTREACHED(); |
| + } |
| } |
| private: |
| @@ -82,6 +104,7 @@ class GLFenceARBSync: public gfx::GLFence { |
| } |
| GLsync sync_; |
| + scoped_refptr<gfx::GLContext::FlushEvent> flush_event_; |
| }; |
| #if !defined(OS_MACOSX) |
| @@ -90,8 +113,11 @@ class EGLFenceSync : public gfx::GLFence { |
| EGLFenceSync(bool flush) { |
| display_ = eglGetCurrentDisplay(); |
| sync_ = eglCreateSyncKHR(display_, EGL_SYNC_FENCE_KHR, NULL); |
| - if (flush) |
| + if (flush) { |
| glFlush(); |
| + } else { |
| + flush_event_ = gfx::GLContext::GetCurrent()->SignalFlush(); |
| + } |
| } |
| virtual bool HasCompleted() OVERRIDE { |
| @@ -102,14 +128,24 @@ class EGLFenceSync : public gfx::GLFence { |
| } |
| virtual void ClientWait() OVERRIDE { |
| - EGLint flags = 0; |
| - EGLTimeKHR time = EGL_FOREVER_KHR; |
| - eglClientWaitSyncKHR(display_, sync_, flags, time); |
| + if (flush_event_->IsSignaled()) { |
| + EGLint flags = 0; |
| + EGLTimeKHR time = EGL_FOREVER_KHR; |
| + eglClientWaitSyncKHR(display_, sync_, flags, time); |
| + } else { |
| + LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
| + NOTREACHED(); |
| + } |
| } |
| virtual void ServerWait() OVERRIDE { |
| - EGLint flags = 0; |
| - eglWaitSyncKHR(display_, sync_, flags); |
| + if (flush_event_->IsSignaled()) { |
| + EGLint flags = 0; |
| + eglWaitSyncKHR(display_, sync_, flags); |
| + } else { |
| + LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
| + NOTREACHED(); |
| + } |
| } |
| @@ -120,11 +156,16 @@ class EGLFenceSync : public gfx::GLFence { |
| EGLSyncKHR sync_; |
| EGLDisplay display_; |
| + scoped_refptr<gfx::GLContext::FlushEvent> flush_event_; |
| }; |
| #endif // !OS_MACOSX |
| // static |
| gfx::GLFence* CreateFence(bool flush) { |
| + if (!gfx::GLContext::GetCurrent()) { |
|
piman
2014/03/15 00:18:40
nit: simply DCHECK(gfx::GLContext::GetCurrent()) ?
no sievers
2014/03/19 01:25:21
Done.
|
| + NOTREACHED() << "Trying to create fence with no context"; |
| + return NULL; |
| + } |
| #if !defined(OS_MACOSX) |
| if (gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync) |
| return new EGLFenceSync(flush); |