1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ui/gl/gl_fence.h" 6 7 #include "base/compiler_specific.h" 8 #include "build/build_config.h" 9 #include "ui/gl/gl_bindings.h" 10 #include "ui/gl/gl_context.h" 11 #include "ui/gl/gl_fence_arb.h" 12 #include "ui/gl/gl_fence_egl.h" 13 #include "ui/gl/gl_fence_nv.h" 14 #include "ui/gl/gl_implementation.h" 15 #include "ui/gl/gl_version_info.h" 16 17 #if defined(OS_MACOSX) 18 #include "ui/gl/gl_fence_apple.h" 19 #endif 20 21 #if defined(USE_EGL) && defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_FREEBSD) 22 #define USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC 23 #include "ui/gl/gl_fence_android_native_fence_sync.h" 24 #include "ui/gl/gl_surface_egl.h" 25 #endif 26 27 namespace gl { 28 GLFence()29GLFence::GLFence() { 30 } 31 ~GLFence()32GLFence::~GLFence() { 33 } 34 IsSupported()35bool GLFence::IsSupported() { 36 DCHECK(g_current_gl_version && g_current_gl_driver); 37 return g_current_gl_driver->ext.b_GL_ARB_sync || 38 g_current_gl_version->is_es3 || 39 g_current_gl_version->is_desktop_core_profile || 40 #if defined(OS_MACOSX) 41 g_current_gl_driver->ext.b_GL_APPLE_fence || 42 #else 43 g_driver_egl.ext.b_EGL_KHR_fence_sync || 44 #endif 45 g_current_gl_driver->ext.b_GL_NV_fence; 46 } 47 Create()48std::unique_ptr<GLFence> GLFence::Create() { 49 DCHECK(GLContext::GetCurrent()) 50 << "Trying to create fence with no context"; 51 52 std::unique_ptr<GLFence> fence; 53 #if !defined(OS_MACOSX) 54 if (g_driver_egl.ext.b_EGL_KHR_fence_sync && 55 g_driver_egl.ext.b_EGL_KHR_wait_sync) { 56 // Prefer GLFenceEGL which doesn't require GL context switching. 57 fence = GLFenceEGL::Create(); 58 DCHECK(fence); 59 } else 60 #endif 61 if (g_current_gl_driver->ext.b_GL_ARB_sync || 62 g_current_gl_version->is_es3 || 63 g_current_gl_version->is_desktop_core_profile) { 64 // Prefer ARB_sync which supports server-side wait. 65 fence = std::make_unique<GLFenceARB>(); 66 #if defined(OS_MACOSX) 67 } else if (g_current_gl_driver->ext.b_GL_APPLE_fence) { 68 fence = std::make_unique<GLFenceAPPLE>(); 69 #else 70 } else if (g_driver_egl.ext.b_EGL_KHR_fence_sync) { 71 fence = GLFenceEGL::Create(); 72 DCHECK(fence); 73 #endif 74 } else if (g_current_gl_driver->ext.b_GL_NV_fence) { 75 fence = std::make_unique<GLFenceNV>(); 76 } 77 78 DCHECK_EQ(!!fence.get(), GLFence::IsSupported()); 79 return fence; 80 } 81 ResetSupported()82bool GLFence::ResetSupported() { 83 // Resetting a fence to its original state isn't supported by default. 84 return false; 85 } 86 ResetState()87void GLFence::ResetState() { 88 NOTIMPLEMENTED(); 89 } 90 Invalidate()91void GLFence::Invalidate() { 92 NOTIMPLEMENTED(); 93 } 94 IsGpuFenceSupported()95bool GLFence::IsGpuFenceSupported() { 96 #if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC) 97 return gl::GLSurfaceEGL::IsAndroidNativeFenceSyncSupported(); 98 #else 99 return false; 100 #endif 101 } 102 103 // static CreateFromGpuFence(const gfx::GpuFence & gpu_fence)104std::unique_ptr<GLFence> GLFence::CreateFromGpuFence( 105 const gfx::GpuFence& gpu_fence) { 106 DCHECK(IsGpuFenceSupported()); 107 switch (gpu_fence.GetGpuFenceHandle().type) { 108 case gfx::GpuFenceHandleType::kAndroidNativeFenceSync: 109 #if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC) 110 return GLFenceAndroidNativeFenceSync::CreateFromGpuFence(gpu_fence); 111 #else 112 NOTREACHED(); 113 return nullptr; 114 #endif 115 default: 116 NOTREACHED(); 117 return nullptr; 118 } 119 } 120 121 // static CreateForGpuFence()122std::unique_ptr<GLFence> GLFence::CreateForGpuFence() { 123 DCHECK(IsGpuFenceSupported()); 124 #if defined(USE_GL_FENCE_ANDROID_NATIVE_FENCE_SYNC) 125 return GLFenceAndroidNativeFenceSync::CreateForGpuFence(); 126 #endif 127 NOTREACHED(); 128 return nullptr; 129 } 130 GetGpuFence()131std::unique_ptr<gfx::GpuFence> GLFence::GetGpuFence() { 132 return nullptr; 133 } 134 135 } // namespace gl 136