15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_fence.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_bindings.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_context.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gl/gl_fence_arb.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gl/gl_fence_egl.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gl/gl_fence_nv.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/gl/gl_gl_api_implementation.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/gl/gl_version_info.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace gfx {
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// static
21116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGLFence* CreateFence(bool flush) {
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(GLContext::GetCurrent())
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      << "Trying to create fence with no context";
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<GLFence> fence;
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Prefer ARB_sync which supports server-side wait.
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (g_driver_gl.ext.b_GL_ARB_sync ||
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetGLVersionInfo()->is_es3) {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    fence.reset(new GLFenceARB(flush));
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if !defined(OS_MACOSX)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (g_driver_egl.ext.b_EGL_KHR_fence_sync) {
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    fence.reset(new GLFenceEGL(flush));
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (g_driver_gl.ext.b_GL_NV_fence) {
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    fence.reset(new GLFenceNV(flush));
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK_EQ(!!fence.get(), GLFence::IsSupported());
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return fence.release();
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLFence::GLFence() {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLFence::~GLFence() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool GLFence::IsSupported() {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(GetGLVersionInfo());
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return g_driver_gl.ext.b_GL_ARB_sync || GetGLVersionInfo()->is_es3 ||
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if !defined(OS_MACOSX)
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         g_driver_egl.ext.b_EGL_KHR_fence_sync ||
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         g_driver_gl.ext.b_GL_NV_fence;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GLFence* GLFence::Create() {
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return CreateFence(true);
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GLFence* GLFence::CreateWithoutFlush() {
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return CreateFence(false);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace gfx
68