Index: ui/gl/gl_fence.cc |
diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc |
index f44570e2b6042911005dd202a9480322fe76cdf3..262de48af63870209ffa69ea5dc1aa336fe70a6e 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,15 @@ class GLFenceNVFence: public gfx::GLFence { |
} |
virtual void ClientWait() OVERRIDE { |
- glFinishFenceNV(fence_); |
+ if (!flush_event_ || flush_event_->IsSignaled()) { |
+ glFinishFenceNV(fence_); |
+ } else { |
+ LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
+ } |
} |
virtual void ServerWait() OVERRIDE { |
- glFinishFenceNV(fence_); |
+ ClientWait(); |
} |
private: |
@@ -47,14 +54,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 +80,19 @@ class GLFenceARBSync: public gfx::GLFence { |
} |
virtual void ClientWait() OVERRIDE { |
- glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); |
+ if (!flush_event_ || flush_event_->IsSignaled()) { |
+ glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED); |
+ } else { |
+ LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
+ } |
} |
virtual void ServerWait() OVERRIDE { |
- glWaitSync(sync_, 0, GL_TIMEOUT_IGNORED); |
+ if (!flush_event_ || flush_event_->IsSignaled()) { |
+ glWaitSync(sync_, 0, GL_TIMEOUT_IGNORED); |
+ } else { |
+ LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
+ } |
} |
private: |
@@ -82,6 +101,7 @@ class GLFenceARBSync: public gfx::GLFence { |
} |
GLsync sync_; |
+ scoped_refptr<gfx::GLContext::FlushEvent> flush_event_; |
}; |
#if !defined(OS_MACOSX) |
@@ -90,8 +110,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 +125,22 @@ 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_ || 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..."; |
+ } |
} |
virtual void ServerWait() OVERRIDE { |
- EGLint flags = 0; |
- eglWaitSyncKHR(display_, sync_, flags); |
+ if (!flush_event_ || flush_event_->IsSignaled()) { |
+ EGLint flags = 0; |
+ eglWaitSyncKHR(display_, sync_, flags); |
+ } else { |
+ LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
+ } |
} |
@@ -120,11 +151,15 @@ 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) { |
+ DCHECK(gfx::GLContext::GetCurrent()) |
+ << "Trying to create fence with no context"; |
+ |
#if !defined(OS_MACOSX) |
if (gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync) |
return new EGLFenceSync(flush); |