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_nv.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 MurdochGLFenceNV::GLFenceNV(bool flush) { 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // What if either of these GL calls fails? TestFenceNV will return true. 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // See spec: 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // http://www.opengl.org/registry/specs/NV/fence.txt 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // What should happen if TestFenceNV is called for a name before SetFenceNV 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // is called? 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We generate an INVALID_OPERATION error, and return TRUE. 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This follows the semantics for texture object names before 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // they are bound, in that they acquire their state upon binding. 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We will arbitrarily return TRUE for consistency. 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch glGenFencesNV(1, &fence_); 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch glSetFenceNV(fence_, GL_ALL_COMPLETED_NV); 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(glIsFenceNV(fence_)); 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (flush) { 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch glFlush(); 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch flush_event_ = GLContext::GetCurrent()->SignalFlush(); 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool GLFenceNV::HasCompleted() { 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(glIsFenceNV(fence_)); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return !!glTestFenceNV(fence_); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLFenceNV::ClientWait() { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(glIsFenceNV(fence_)); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!flush_event_.get() || flush_event_->IsSignaled()) { 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch glFinishFenceNV(fence_); 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LOG(ERROR) << "Trying to wait for uncommitted fence. Skipping..."; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid GLFenceNV::ServerWait() { 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(glIsFenceNV(fence_)); 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ClientWait(); 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 52116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGLFenceNV::~GLFenceNV() { 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(glIsFenceNV(fence_)); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch glDeleteFencesNV(1, &fence_); 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace gfx 58