OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gl/gl_context_egl.h" | 5 #include "ui/gl/gl_context_egl.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
13 #include "third_party/khronos/EGL/egl.h" | 13 #include "third_party/khronos/EGL/egl.h" |
14 #include "third_party/khronos/EGL/eglext.h" | 14 #include "third_party/khronos/EGL/eglext.h" |
15 #include "ui/gl/egl_util.h" | 15 #include "ui/gl/egl_util.h" |
16 #include "ui/gl/gl_bindings.h" | 16 #include "ui/gl/gl_bindings.h" |
17 #include "ui/gl/gl_surface_egl.h" | 17 #include "ui/gl/gl_surface_egl.h" |
18 | 18 |
19 #if defined(USE_X11) | 19 #if defined(USE_X11) |
20 extern "C" { | 20 extern "C" { |
21 #include <X11/Xlib.h> | 21 #include <X11/Xlib.h> |
22 } | 22 } |
23 #endif | 23 #endif |
24 | 24 |
25 #ifndef EGL_CHROMIUM_create_context_bind_generates_resource | |
26 #define EGL_CHROMIUM_create_context_bind_generates_resource 1 | |
27 #define EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM 0x3AAD | |
28 #endif /* EGL_CHROMIUM_create_context_bind_generates_resource */ | |
29 | |
30 #ifndef EGL_ANGLE_create_context_webgl_compatibility | |
31 #define EGL_ANGLE_create_context_webgl_compatibility 1 | |
32 #define EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE 0x3AAC | |
33 #endif /* EGL_ANGLE_create_context_webgl_compatibility */ | |
34 | |
35 using ui::GetLastEGLErrorString; | 25 using ui::GetLastEGLErrorString; |
36 | 26 |
37 namespace gl { | 27 namespace gl { |
38 | 28 |
39 GLContextEGL::GLContextEGL(GLShareGroup* share_group) | 29 GLContextEGL::GLContextEGL(GLShareGroup* share_group) |
40 : GLContextReal(share_group), | 30 : GLContextReal(share_group), |
41 context_(nullptr), | 31 context_(nullptr), |
42 display_(nullptr), | 32 display_(nullptr), |
43 config_(nullptr), | 33 config_(nullptr), |
44 unbind_fbo_on_makecurrent_(false), | 34 unbind_fbo_on_makecurrent_(false), |
45 swap_interval_(1) { | 35 swap_interval_(1) { |
46 } | 36 } |
47 | 37 |
48 bool GLContextEGL::Initialize(GLSurface* compatible_surface, | 38 bool GLContextEGL::Initialize( |
49 const GLContextAttribs& attribs) { | 39 GLSurface* compatible_surface, GpuPreference gpu_preference) { |
50 DCHECK(compatible_surface); | 40 DCHECK(compatible_surface); |
51 DCHECK(!context_); | 41 DCHECK(!context_); |
52 | 42 |
53 display_ = compatible_surface->GetDisplay(); | 43 display_ = compatible_surface->GetDisplay(); |
54 config_ = compatible_surface->GetConfig(); | 44 config_ = compatible_surface->GetConfig(); |
55 | 45 |
56 EGLint config_renderable_type = 0; | 46 EGLint config_renderable_type = 0; |
57 if (!eglGetConfigAttrib(display_, config_, EGL_RENDERABLE_TYPE, | 47 if (!eglGetConfigAttrib(display_, config_, EGL_RENDERABLE_TYPE, |
58 &config_renderable_type)) { | 48 &config_renderable_type)) { |
59 LOG(ERROR) << "eglGetConfigAttrib failed with error " | 49 LOG(ERROR) << "eglGetConfigAttrib failed with error " |
60 << GetLastEGLErrorString(); | 50 << GetLastEGLErrorString(); |
61 return false; | 51 return false; |
62 } | 52 } |
63 | 53 |
64 EGLint context_client_version = 2; | 54 EGLint context_client_version = 2; |
65 if ((config_renderable_type & EGL_OPENGL_ES3_BIT) != 0 && | 55 if ((config_renderable_type & EGL_OPENGL_ES3_BIT) != 0 && |
66 !base::CommandLine::ForCurrentProcess()->HasSwitch( | 56 !base::CommandLine::ForCurrentProcess()->HasSwitch( |
67 switches::kDisableES3GLContext)) { | 57 switches::kDisableES3GLContext)) { |
68 context_client_version = 3; | 58 context_client_version = 3; |
69 } | 59 } |
70 | 60 |
71 std::vector<EGLint> context_attributes; | 61 const EGLint kContextAttributes[] = { |
72 context_attributes.push_back(EGL_CONTEXT_CLIENT_VERSION); | 62 EGL_CONTEXT_CLIENT_VERSION, context_client_version, |
73 context_attributes.push_back(context_client_version); | 63 EGL_NONE |
| 64 }; |
| 65 const EGLint kContextRobustnessAttributes[] = { |
| 66 EGL_CONTEXT_CLIENT_VERSION, context_client_version, |
| 67 EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT, |
| 68 EGL_LOSE_CONTEXT_ON_RESET_EXT, |
| 69 EGL_NONE |
| 70 }; |
74 | 71 |
| 72 const EGLint* context_attributes = nullptr; |
75 if (GLSurfaceEGL::IsCreateContextRobustnessSupported()) { | 73 if (GLSurfaceEGL::IsCreateContextRobustnessSupported()) { |
76 DVLOG(1) << "EGL_EXT_create_context_robustness supported."; | 74 DVLOG(1) << "EGL_EXT_create_context_robustness supported."; |
| 75 context_attributes = kContextRobustnessAttributes; |
77 } else { | 76 } else { |
78 // At some point we should require the presence of the robustness | 77 // At some point we should require the presence of the robustness |
79 // extension and remove this code path. | 78 // extension and remove this code path. |
80 DVLOG(1) << "EGL_EXT_create_context_robustness NOT supported."; | 79 DVLOG(1) << "EGL_EXT_create_context_robustness NOT supported."; |
81 context_attributes.push_back( | 80 context_attributes = kContextAttributes; |
82 EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT); | |
83 context_attributes.push_back(EGL_LOSE_CONTEXT_ON_RESET_EXT); | |
84 } | 81 } |
85 | 82 |
86 if (!eglBindAPI(EGL_OPENGL_ES_API)) { | 83 if (!eglBindAPI(EGL_OPENGL_ES_API)) { |
87 LOG(ERROR) << "eglBindApi failed with error " | 84 LOG(ERROR) << "eglBindApi failed with error " |
88 << GetLastEGLErrorString(); | 85 << GetLastEGLErrorString(); |
89 return false; | 86 return false; |
90 } | 87 } |
91 | 88 |
92 if (GLSurfaceEGL::IsCreateContextBindGeneratesResourceSupported()) { | |
93 context_attributes.push_back(EGL_CONTEXT_BIND_GENERATES_RESOURCE_CHROMIUM); | |
94 context_attributes.push_back(attribs.bind_generates_resource ? EGL_TRUE | |
95 : EGL_FALSE); | |
96 } else { | |
97 DCHECK(attribs.bind_generates_resource); | |
98 } | |
99 | |
100 if (GLSurfaceEGL::IsCreateContextWebGLCompatabilitySupported()) { | |
101 context_attributes.push_back(EGL_CONTEXT_WEBGL_COMPATIBILITY_ANGLE); | |
102 context_attributes.push_back( | |
103 attribs.webgl_compatibility_context ? EGL_TRUE : EGL_FALSE); | |
104 } else { | |
105 DCHECK(!attribs.webgl_compatibility_context); | |
106 } | |
107 | |
108 // Append final EGL_NONE to signal the context attributes are finished | |
109 context_attributes.push_back(EGL_NONE); | |
110 context_attributes.push_back(EGL_NONE); | |
111 | |
112 context_ = eglCreateContext( | 89 context_ = eglCreateContext( |
113 display_, config_, share_group() ? share_group()->GetHandle() : nullptr, | 90 display_, |
114 context_attributes.data()); | 91 config_, |
| 92 share_group() ? share_group()->GetHandle() : nullptr, |
| 93 context_attributes); |
115 | 94 |
116 if (!context_) { | 95 if (!context_) { |
117 LOG(ERROR) << "eglCreateContext failed with error " | 96 LOG(ERROR) << "eglCreateContext failed with error " |
118 << GetLastEGLErrorString(); | 97 << GetLastEGLErrorString(); |
119 return false; | 98 return false; |
120 } | 99 } |
121 | 100 |
122 return true; | 101 return true; |
123 } | 102 } |
124 | 103 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 | 223 |
245 bool GLContextEGL::WasAllocatedUsingRobustnessExtension() { | 224 bool GLContextEGL::WasAllocatedUsingRobustnessExtension() { |
246 return GLSurfaceEGL::IsCreateContextRobustnessSupported(); | 225 return GLSurfaceEGL::IsCreateContextRobustnessSupported(); |
247 } | 226 } |
248 | 227 |
249 GLContextEGL::~GLContextEGL() { | 228 GLContextEGL::~GLContextEGL() { |
250 Destroy(); | 229 Destroy(); |
251 } | 230 } |
252 | 231 |
253 } // namespace gl | 232 } // namespace gl |
OLD | NEW |