1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gl/gl_fence_egl.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gl/gl_bindings.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gl/gl_context.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace gfx { 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGLFenceEGL::GLFenceEGL(bool flush) { 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch display_ = eglGetCurrentDisplay(); 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch sync_ = eglCreateSyncKHR(display_, EGL_SYNC_FENCE_KHR, NULL); 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(sync_ != EGL_NO_SYNC_KHR); 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flush) { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch glFlush(); 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flush_event_ = GLContext::GetCurrent()->SignalFlush(); 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool GLFenceEGL::HasCompleted() { 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EGLint value = 0; 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (eglGetSyncAttribKHR(display_, sync_, EGL_SYNC_STATUS_KHR, &value) != 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EGL_TRUE) { 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return true; 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(value == EGL_SIGNALED_KHR || value == EGL_UNSIGNALED_KHR); 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return !value || value == EGL_SIGNALED_KHR; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLFenceEGL::ClientWait() { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!flush_event_.get() || flush_event_->IsSignaled()) { 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EGLint flags = 0; 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EGLTimeKHR time = EGL_FOREVER_KHR; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch eglClientWaitSyncKHR(display_, sync_, flags, time); 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLFenceEGL::ServerWait() { 458fd87632b6d48cb96d825bb68d4f1fd457262f36boliu if (!gfx::g_driver_egl.ext.b_EGL_KHR_wait_sync) { 468fd87632b6d48cb96d825bb68d4f1fd457262f36boliu ClientWait(); 478fd87632b6d48cb96d825bb68d4f1fd457262f36boliu return; 488fd87632b6d48cb96d825bb68d4f1fd457262f36boliu } 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!flush_event_.get() || flush_event_->IsSignaled()) { 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EGLint flags = 0; 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch eglWaitSyncKHR(display_, sync_, flags); 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 57116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGLFenceEGL::~GLFenceEGL() { 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch eglDestroySyncKHR(display_, sync_); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace gfx 62