diff options
author | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-03 14:44:55 +0000 |
---|---|---|
committer | sievers@chromium.org <sievers@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-03 14:44:55 +0000 |
commit | f6c292fff1959661d15b27915d77f65964457e10 (patch) | |
tree | 5fdc07355cdfbe9f0dd4374b5c6b0b012613cdea /ui/gl/gl_fence.cc | |
parent | eb4319e9a9d5088660f465b652c54b187bf951c8 (diff) | |
download | chromium_src-f6c292fff1959661d15b27915d77f65964457e10.zip chromium_src-f6c292fff1959661d15b27915d77f65964457e10.tar.gz chromium_src-f6c292fff1959661d15b27915d77f65964457e10.tar.bz2 |
Revert r258965 aka reland r258122
gpu: Allow fences to check whether a flush has occurred
This skips waiting on a fence that was created but never committed.
BUG=352419,355275
TBR=piman@chromium.org
> Original Review URL: https://codereview.chromium.org/197563003
Review URL: https://codereview.chromium.org/222103008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@261383 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gl/gl_fence.cc')
-rw-r--r-- | ui/gl/gl_fence.cc | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc index f44570e..262de48 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); |