Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: trunk/src/ui/gl/gl_surface.cc

Issue 149953003: Revert 247793 "Ensure GL initialization only happens once, and p..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « trunk/src/ui/gl/gl_surface.h ('k') | trunk/src/ui/gl/gl_surface_egl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_surface.h" 5 #include "ui/gl/gl_surface.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/debug/trace_event.h" 11 #include "base/debug/trace_event.h"
12 #include "base/lazy_instance.h" 12 #include "base/lazy_instance.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/threading/thread_local.h" 14 #include "base/threading/thread_local.h"
15 #include "ui/gl/gl_context.h" 15 #include "ui/gl/gl_context.h"
16 #include "ui/gl/gl_implementation.h" 16 #include "ui/gl/gl_implementation.h"
17 #include "ui/gl/gl_switches.h"
18 17
19 namespace gfx { 18 namespace gfx {
20 19
21 namespace { 20 namespace {
22 base::LazyInstance<base::ThreadLocalPointer<GLSurface> >::Leaky 21 base::LazyInstance<base::ThreadLocalPointer<GLSurface> >::Leaky
23 current_surface_ = LAZY_INSTANCE_INITIALIZER; 22 current_surface_ = LAZY_INSTANCE_INITIALIZER;
24 } // namespace 23 } // namespace
25 24
26 // static 25 // static
27 bool GLSurface::InitializeOneOff() { 26 bool GLSurface::InitializeOneOff() {
28 DCHECK_EQ(kGLImplementationNone, GetGLImplementation()); 27 static bool initialized = false;
28 if (initialized)
29 return true;
29 30
30 TRACE_EVENT0("gpu", "GLSurface::InitializeOneOff"); 31 TRACE_EVENT0("gpu", "GLSurface::InitializeOneOff");
31 32
32 std::vector<GLImplementation> allowed_impls; 33 std::vector<GLImplementation> allowed_impls;
33 GetAllowedGLImplementations(&allowed_impls); 34 GetAllowedGLImplementations(&allowed_impls);
34 DCHECK(!allowed_impls.empty()); 35 DCHECK(!allowed_impls.empty());
35 36
36 CommandLine* cmd = CommandLine::ForCurrentProcess();
37
38 // The default implementation is always the first one in list. 37 // The default implementation is always the first one in list.
39 GLImplementation impl = allowed_impls[0]; 38 GLImplementation impl = allowed_impls[0];
40 bool fallback_to_osmesa = false; 39 bool fallback_to_osmesa = false;
41 if (cmd->HasSwitch(switches::kUseGL)) { 40 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL)) {
42 std::string requested_implementation_name = 41 std::string requested_implementation_name =
43 cmd->GetSwitchValueASCII(switches::kUseGL); 42 CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switches::kUseGL);
44 if (requested_implementation_name == "any") { 43 if (requested_implementation_name == "any") {
45 fallback_to_osmesa = true; 44 fallback_to_osmesa = true;
46 } else if (requested_implementation_name == "swiftshader") { 45 } else if (requested_implementation_name == "swiftshader") {
47 impl = kGLImplementationEGLGLES2; 46 impl = kGLImplementationEGLGLES2;
48 } else { 47 } else {
49 impl = GetNamedGLImplementation(requested_implementation_name); 48 impl = GetNamedGLImplementation(requested_implementation_name);
50 if (std::find(allowed_impls.begin(), 49 if (std::find(allowed_impls.begin(),
51 allowed_impls.end(), 50 allowed_impls.end(),
52 impl) == allowed_impls.end()) { 51 impl) == allowed_impls.end()) {
53 LOG(ERROR) << "Requested GL implementation is not available."; 52 LOG(ERROR) << "Requested GL implementation is not available.";
54 return false; 53 return false;
55 } 54 }
56 } 55 }
57 } 56 }
58 57
59 bool gpu_service_logging = cmd->HasSwitch(switches::kEnableGPUServiceLogging); 58 initialized = InitializeStaticGLBindings(impl) && InitializeOneOffInternal();
60 bool disable_gl_drawing = cmd->HasSwitch(switches::kDisableGLDrawingForTests);
61
62 return InitializeOneOffImplementation(
63 impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing);
64 }
65
66 // static
67 bool GLSurface::InitializeOneOffImplementation(GLImplementation impl,
68 bool fallback_to_osmesa,
69 bool gpu_service_logging,
70 bool disable_gl_drawing) {
71 bool initialized =
72 InitializeStaticGLBindings(impl) && InitializeOneOffInternal();
73 if (!initialized && fallback_to_osmesa) { 59 if (!initialized && fallback_to_osmesa) {
74 ClearGLBindings(); 60 ClearGLBindings();
75 initialized = InitializeStaticGLBindings(kGLImplementationOSMesaGL) && 61 initialized = InitializeStaticGLBindings(kGLImplementationOSMesaGL) &&
76 InitializeOneOffInternal(); 62 InitializeOneOffInternal();
77 } 63 }
78 if (!initialized)
79 ClearGLBindings();
80 64
81 if (initialized) { 65 if (initialized) {
82 DVLOG(1) << "Using " 66 DVLOG(1) << "Using "
83 << GetGLImplementationName(GetGLImplementation()) 67 << GetGLImplementationName(GetGLImplementation())
84 << " GL implementation."; 68 << " GL implementation.";
85 if (gpu_service_logging) 69 if (CommandLine::ForCurrentProcess()->HasSwitch(
70 switches::kEnableGPUServiceLogging))
86 InitializeDebugGLBindings(); 71 InitializeDebugGLBindings();
87 if (disable_gl_drawing) 72 if (CommandLine::ForCurrentProcess()->HasSwitch(
73 switches::kDisableGLDrawingForTests))
88 InitializeNullDrawGLBindings(); 74 InitializeNullDrawGLBindings();
89 } 75 }
90 return initialized; 76 return initialized;
91 } 77 }
92 78
93 // static
94 void GLSurface::InitializeOneOffForTests() {
95 bool use_osmesa = true;
96
97 #if defined(OS_ANDROID)
98 // On Android we always use hardware GL.
99 use_osmesa = false;
100 #endif
101
102 std::vector<GLImplementation> allowed_impls;
103 GetAllowedGLImplementations(&allowed_impls);
104 DCHECK(!allowed_impls.empty());
105
106 GLImplementation impl = allowed_impls[0];
107 if (use_osmesa)
108 impl = kGLImplementationOSMesaGL;
109
110 DCHECK(!CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL))
111 << "kUseGL has not effect in tests";
112
113 bool fallback_to_osmesa = false;
114 bool gpu_service_logging = false;
115 bool disable_gl_drawing = false;
116 // TODO(danakj): Unit tests do not produce pixel output by default.
117 // bool disable_gl_drawing = true;
118
119 CHECK(InitializeOneOffImplementation(
120 impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing));
121 }
122
123 // static
124 void GLSurface::InitializeOneOffWithMockBindingsForTests() {
125 DCHECK(!CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL))
126 << "kUseGL has not effect in tests";
127
128 // This method may be called multiple times in the same process to set up
129 // mock bindings in different ways.
130 ClearGLBindings();
131
132 bool fallback_to_osmesa = false;
133 bool gpu_service_logging = false;
134 bool disable_gl_drawing = false;
135
136 CHECK(InitializeOneOffImplementation(kGLImplementationMockGL,
137 fallback_to_osmesa,
138 gpu_service_logging,
139 disable_gl_drawing));
140 }
141
142 // static
143 void GLSurface::InitializeDynamicMockBindingsForTests(GLContext* context) {
144 CHECK(InitializeDynamicGLBindings(kGLImplementationMockGL, context));
145 }
146
147 GLSurface::GLSurface() {} 79 GLSurface::GLSurface() {}
148 80
149 bool GLSurface::Initialize() { 81 bool GLSurface::Initialize() {
150 return true; 82 return true;
151 } 83 }
152 84
153 bool GLSurface::Resize(const gfx::Size& size) { 85 bool GLSurface::Resize(const gfx::Size& size) {
154 NOTIMPLEMENTED(); 86 NOTIMPLEMENTED();
155 return false; 87 return false;
156 } 88 }
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 return surface_->GetFormat(); 257 return surface_->GetFormat();
326 } 258 }
327 259
328 VSyncProvider* GLSurfaceAdapter::GetVSyncProvider() { 260 VSyncProvider* GLSurfaceAdapter::GetVSyncProvider() {
329 return surface_->GetVSyncProvider(); 261 return surface_->GetVSyncProvider();
330 } 262 }
331 263
332 GLSurfaceAdapter::~GLSurfaceAdapter() {} 264 GLSurfaceAdapter::~GLSurfaceAdapter() {}
333 265
334 } // namespace gfx 266 } // namespace gfx
OLDNEW
« no previous file with comments | « trunk/src/ui/gl/gl_surface.h ('k') | trunk/src/ui/gl/gl_surface_egl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698