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