Home | History | Annotate | Download | only in gl
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/gl/gl_fence_arb.h"
      6 
      7 #include "ui/gl/gl_bindings.h"
      8 #include "ui/gl/gl_context.h"
      9 
     10 namespace gfx {
     11 
     12 GLFenceARB::GLFenceARB(bool flush) {
     13   sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
     14   DCHECK_EQ(GL_TRUE, glIsSync(sync_));
     15   if (flush) {
     16     glFlush();
     17   } else {
     18     flush_event_ = GLContext::GetCurrent()->SignalFlush();
     19   }
     20 }
     21 
     22 bool GLFenceARB::HasCompleted() {
     23   // Handle the case where FenceSync failed.
     24   if (!sync_)
     25     return true;
     26 
     27   DCHECK_EQ(GL_TRUE, glIsSync(sync_));
     28   // We could potentially use glGetSynciv here, but it doesn't work
     29   // on OSX 10.7 (always says the fence is not signaled yet).
     30   // glClientWaitSync works better, so let's use that instead.
     31   return glClientWaitSync(sync_, 0, 0) != GL_TIMEOUT_EXPIRED;
     32 }
     33 
     34 void GLFenceARB::ClientWait() {
     35   DCHECK_EQ(GL_TRUE, glIsSync(sync_));
     36   if (!flush_event_.get() || flush_event_->IsSignaled()) {
     37     glClientWaitSync(sync_, GL_SYNC_FLUSH_COMMANDS_BIT, GL_TIMEOUT_IGNORED);
     38   } else {
     39     LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping...";
     40   }
     41 }
     42 
     43 void GLFenceARB::ServerWait() {
     44   DCHECK_EQ(GL_TRUE, glIsSync(sync_));
     45   if (!flush_event_.get() || flush_event_->IsSignaled()) {
     46     glWaitSync(sync_, 0, GL_TIMEOUT_IGNORED);
     47   } else {
     48     LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping...";
     49   }
     50 }
     51 
     52 GLFenceARB::~GLFenceARB() {
     53   DCHECK_EQ(GL_TRUE, glIsSync(sync_));
     54   glDeleteSync(sync_);
     55 }
     56 
     57 }  // namespace gfx
     58