blob: b85434685a579a464b9503b621b8d056bccf0326 [file] [log] [blame]
// 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