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.
5 #include "ui/gl/gl_egl_api_implementation.h"
7 #include "base/command_line.h"
8 #include "base/strings/string_split.h"
9 #include "base/strings/string_util.h"
10 #include "ui/gl/gl_context.h"
11 #include "ui/gl/gl_implementation.h"
14 std::string
FilterExtensionList(
15 const char* extensions
,
16 const std::vector
<std::string
>& disabled_extensions
) {
17 if (extensions
== NULL
)
19 std::vector
<std::string
> extension_vec
;
20 base::SplitString(extensions
, ' ', &extension_vec
);
21 extension_vec
.erase(std::remove_if(
22 extension_vec
.begin(), extension_vec
.end(),
23 [&disabled_extensions
](const std::string
& ext
) {
24 return std::find(disabled_extensions
.begin(), disabled_extensions
.end(),
25 ext
) != disabled_extensions
.end();
26 }), extension_vec
.end());
27 return JoinString(extension_vec
, " ");
33 RealEGLApi
* g_real_egl
;
35 void InitializeStaticGLBindingsEGL() {
36 g_driver_egl
.InitializeStaticBindings();
38 g_real_egl
= new RealEGLApi();
40 g_real_egl
->Initialize(&g_driver_egl
);
41 g_current_egl_context
= g_real_egl
;
42 g_driver_egl
.InitializeExtensionBindings();
45 void InitializeDebugGLBindingsEGL() {
46 g_driver_egl
.InitializeDebugBindings();
49 void ClearGLBindingsEGL() {
54 g_current_egl_context
= NULL
;
55 g_driver_egl
.ClearBindings();
64 EGLApiBase::EGLApiBase()
68 EGLApiBase::~EGLApiBase() {
71 void EGLApiBase::InitializeBase(DriverEGL
* driver
) {
75 RealEGLApi::RealEGLApi() {
78 RealEGLApi::~RealEGLApi() {
81 void RealEGLApi::Initialize(DriverEGL
* driver
) {
82 InitializeWithCommandLine(driver
, base::CommandLine::ForCurrentProcess());
85 void RealEGLApi::InitializeWithCommandLine(DriverEGL
* driver
,
86 base::CommandLine
* command_line
) {
88 InitializeBase(driver
);
90 const std::string disabled_extensions
= command_line
->GetSwitchValueASCII(
91 switches::kDisableGLExtensions
);
92 disabled_exts_
.clear();
93 filtered_exts_
.clear();
94 if (!disabled_extensions
.empty()) {
95 Tokenize(disabled_extensions
, ", ;", &disabled_exts_
);
99 const char* RealEGLApi::eglQueryStringFn(EGLDisplay dpy
, EGLint name
) {
100 if (name
== EGL_EXTENSIONS
) {
101 auto it
= filtered_exts_
.find(dpy
);
102 if (it
== filtered_exts_
.end()) {
103 it
= filtered_exts_
.insert(std::make_pair(
104 dpy
, FilterExtensionList(EGLApiBase::eglQueryStringFn(dpy
, name
),
105 disabled_exts_
))).first
;
107 return (*it
).second
.c_str();
109 return EGLApiBase::eglQueryStringFn(dpy
, name
);
112 TraceEGLApi::~TraceEGLApi() {
115 bool GetGLWindowSystemBindingInfoEGL(GLWindowSystemBindingInfo
* info
) {
116 EGLDisplay display
= eglGetCurrentDisplay();
117 const char* vendor
= eglQueryString(display
, EGL_VENDOR
);
118 const char* version
= eglQueryString(display
, EGL_VERSION
);
119 const char* extensions
= eglQueryString(display
, EGL_EXTENSIONS
);
120 *info
= GLWindowSystemBindingInfo();
122 info
->vendor
= vendor
;
124 info
->version
= version
;
126 info
->extensions
= extensions
;