| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/gl/gl_fence_arb.h" |
| |
| #include "ui/gl/gl_bindings.h" |
| #include "ui/gl/gl_context.h" |
| |
| namespace gfx { |
| |
| GLFenceARB::GLFenceARB(bool flush) { |
| sync_ = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); |
| DCHECK_EQ(GL_TRUE, glIsSync(sync_)); |
| if (flush) { |
| glFlush(); |
| } else { |
| flush_event_ = GLContext::GetCurrent()->SignalFlush(); |
| } |
| } |
| |
| bool GLFenceARB::HasCompleted() { |
| // Handle the case where FenceSync failed. |
| if (!sync_) |
| return true; |
| |
| DCHECK_EQ(GL_TRUE, glIsSync(sync_)); |
| // We could potentially use glGetSynciv here, but it doesn't work |
| // on OSX 10.7 (always says the fence is not signaled yet). |
| // glClientWaitSync works better, so let's use that instead. |
| return glClientWaitSync(sync_, 0, 0) != GL_TIMEOUT_EXPIRED; |
| } |
| |
| void GLFenceARB::ClientWait() { |
| DCHECK_EQ(GL_TRUE, glIsSync(sync_)); |
| 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..."; |
| } |
| } |
| |
| void GLFenceARB::ServerWait() { |
| DCHECK_EQ(GL_TRUE, glIsSync(sync_)); |
| if (!flush_event_ || flush_event_->IsSignaled()) { |
| glWaitSync(sync_, 0, GL_TIMEOUT_IGNORED); |
| } else { |
| LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; |
| } |
| } |
| |
| GLFenceARB::~GLFenceARB() { |
| DCHECK_EQ(GL_TRUE, glIsSync(sync_)); |
| glDeleteSync(sync_); |
| } |
| |
| } // namespace gfx |