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