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()29 GLFence::GLFence() {
30 }
31 
~GLFence()32 GLFence::~GLFence() {
33 }
34 
IsSupported()35 bool 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()48 std::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()82 bool GLFence::ResetSupported() {
83   // Resetting a fence to its original state isn't supported by default.
84   return false;
85 }
86 
ResetState()87 void GLFence::ResetState() {
88   NOTIMPLEMENTED();
89 }
90 
Invalidate()91 void GLFence::Invalidate() {
92   NOTIMPLEMENTED();
93 }
94 
IsGpuFenceSupported()95 bool 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)104 std::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()122 std::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()131 std::unique_ptr<gfx::GpuFence> GLFence::GetGpuFence() {
132   return nullptr;
133 }
134 
135 }  // namespace gl
136