| Index: ui/gl/gl_fence.cc
|
| diff --git a/ui/gl/gl_fence.cc b/ui/gl/gl_fence.cc
|
| index 9b85300fabdbc10e7ecf27685930a7b55f1a2408..1790f864415f12788297152e9c9645557b834cc5 100644
|
| --- a/ui/gl/gl_fence.cc
|
| +++ b/ui/gl/gl_fence.cc
|
| @@ -12,7 +12,7 @@ namespace {
|
|
|
| class GLFenceNVFence: public gfx::GLFence {
|
| public:
|
| - GLFenceNVFence() {
|
| + GLFenceNVFence(bool flush) {
|
| // What if either of these GL calls fails? TestFenceNV will return true.
|
| // See spec:
|
| // http://www.opengl.org/registry/specs/NV/fence.txt
|
| @@ -25,7 +25,8 @@ class GLFenceNVFence: public gfx::GLFence {
|
| // We will arbitrarily return TRUE for consistency.
|
| glGenFencesNV(1, &fence_);
|
| glSetFenceNV(fence_, GL_ALL_COMPLETED_NV);
|
| - glFlush();
|
| + if (flush)
|
| + glFlush();
|
| }
|
|
|
| virtual bool HasCompleted() OVERRIDE {
|
| @@ -36,6 +37,10 @@ class GLFenceNVFence: public gfx::GLFence {
|
| glFinishFenceNV(fence_);
|
| }
|
|
|
| + virtual void ServerWait() OVERRIDE {
|
| + glFinishFenceNV(fence_);
|
| + }
|
| +
|
| private:
|
| virtual ~GLFenceNVFence() {
|
| glDeleteFencesNV(1, &fence_);
|
| @@ -46,9 +51,10 @@ class GLFenceNVFence: public gfx::GLFence {
|
|
|
| class GLFenceARBSync: public gfx::GLFence {
|
| public:
|
| - GLFenceARBSync() {
|
| + GLFenceARBSync(bool flush) {
|
| sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
| - glFlush();
|
| + if (flush)
|
| + glFlush();
|
| }
|
|
|
| virtual bool HasCompleted() OVERRIDE {
|
| @@ -66,6 +72,10 @@ class GLFenceARBSync: public gfx::GLFence {
|
| glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED);
|
| }
|
|
|
| + virtual void ServerWait() OVERRIDE {
|
| + glWaitSync(sync_, 0, GL_TIMEOUT_IGNORED);
|
| + }
|
| +
|
| private:
|
| virtual ~GLFenceARBSync() {
|
| glDeleteSync(sync_);
|
| @@ -77,10 +87,11 @@ class GLFenceARBSync: public gfx::GLFence {
|
| #if !defined(OS_MACOSX)
|
| class EGLFenceSync : public gfx::GLFence {
|
| public:
|
| - EGLFenceSync() {
|
| + EGLFenceSync(bool flush) {
|
| display_ = eglGetCurrentDisplay();
|
| sync_ = eglCreateSyncKHR(display_, EGL_SYNC_FENCE_KHR, NULL);
|
| - glFlush();
|
| + if (flush)
|
| + glFlush();
|
| }
|
|
|
| virtual bool HasCompleted() OVERRIDE {
|
| @@ -96,6 +107,12 @@ class EGLFenceSync : public gfx::GLFence {
|
| eglClientWaitSyncKHR(display_, sync_, flags, time);
|
| }
|
|
|
| + virtual void ServerWait() OVERRIDE {
|
| + EGLint flags = 0;
|
| + eglWaitSyncKHR(display_, sync_, flags);
|
| + }
|
| +
|
| +
|
| private:
|
| virtual ~EGLFenceSync() {
|
| eglDestroySyncKHR(display_, sync_);
|
| @@ -106,6 +123,19 @@ class EGLFenceSync : public gfx::GLFence {
|
| };
|
| #endif // !OS_MACOSX
|
|
|
| +// static
|
| +gfx::GLFence* CreateFence(bool flush) {
|
| +#if !defined(OS_MACOSX)
|
| + if (gfx::g_driver_egl.ext.b_EGL_KHR_fence_sync)
|
| + return new EGLFenceSync(flush);
|
| +#endif
|
| + if (gfx::g_driver_gl.ext.b_GL_NV_fence)
|
| + return new GLFenceNVFence(flush);
|
| + if (gfx::g_driver_gl.ext.b_GL_ARB_sync)
|
| + return new GLFenceARBSync(flush);
|
| + return NULL;
|
| +}
|
| +
|
| } // namespace
|
|
|
| namespace gfx {
|
| @@ -116,17 +146,12 @@ GLFence::GLFence() {
|
| GLFence::~GLFence() {
|
| }
|
|
|
| -// static
|
| GLFence* GLFence::Create() {
|
| -#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();
|
| - if (gfx::g_driver_gl.ext.b_GL_ARB_sync)
|
| - return new GLFenceARBSync();
|
| - return NULL;
|
| + return CreateFence(true);
|
| +}
|
| +
|
| +GLFence* GLFence::CreateWithoutFlush() {
|
| + return CreateFence(false);
|
| }
|
|
|
| } // namespace gfx
|
|
|