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

Side by Side Diff: ui/gl/gl_context_cgl.cc

Issue 2629633003: Refactor GL bindings so there is no global GLApi or DriverGL. (Closed)
Patch Set: rebase Created 3 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
« no previous file with comments | « ui/gl/gl_context.cc ('k') | ui/gl/gl_context_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_context_cgl.h" 5 #include "ui/gl/gl_context_cgl.h"
6 6
7 #include <OpenGL/CGLRenderers.h> 7 #include <OpenGL/CGLRenderers.h>
8 #include <OpenGL/CGLTypes.h> 8 #include <OpenGL/CGLTypes.h>
9 9
10 #include <memory> 10 #include <memory>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/location.h" 13 #include "base/location.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/message_loop/message_loop.h" 15 #include "base/message_loop/message_loop.h"
16 #include "base/single_thread_task_runner.h" 16 #include "base/single_thread_task_runner.h"
17 #include "base/threading/thread_task_runner_handle.h" 17 #include "base/threading/thread_task_runner_handle.h"
18 #include "base/trace_event/trace_event.h" 18 #include "base/trace_event/trace_event.h"
19 #include "ui/gl/gl_bindings.h" 19 #include "ui/gl/gl_bindings.h"
20 #include "ui/gl/gl_gl_api_implementation.h"
20 #include "ui/gl/gl_implementation.h" 21 #include "ui/gl/gl_implementation.h"
21 #include "ui/gl/gl_surface.h" 22 #include "ui/gl/gl_surface.h"
22 #include "ui/gl/gpu_switching_manager.h" 23 #include "ui/gl/gpu_switching_manager.h"
23 #include "ui/gl/scoped_cgl.h" 24 #include "ui/gl/scoped_cgl.h"
24 #include "ui/gl/yuv_to_rgb_converter.h" 25 #include "ui/gl/yuv_to_rgb_converter.h"
25 26
26 namespace gl { 27 namespace gl {
27 28
28 namespace { 29 namespace {
29 30
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 // Contexts that prefer integrated gpu are known to use only the subset of GL 143 // Contexts that prefer integrated gpu are known to use only the subset of GL
143 // that can be safely migrated between the iGPU and the dGPU. Mark those 144 // that can be safely migrated between the iGPU and the dGPU. Mark those
144 // contexts as safe to forcibly transition between the GPUs by default. 145 // contexts as safe to forcibly transition between the GPUs by default.
145 // http://crbug.com/180876, http://crbug.com/227228 146 // http://crbug.com/180876, http://crbug.com/227228
146 safe_to_force_gpu_switch_ = gpu_preference == PreferIntegratedGpu; 147 safe_to_force_gpu_switch_ = gpu_preference == PreferIntegratedGpu;
147 return true; 148 return true;
148 } 149 }
149 150
150 void GLContextCGL::Destroy() { 151 void GLContextCGL::Destroy() {
151 if (yuv_to_rgb_converter_) { 152 if (yuv_to_rgb_converter_) {
153 // If this context is not current, bind this context's API so that the YUV
154 // converter can safely destruct
155 GLContext* current_context = GetRealCurrent();
156 if (current_context != this) {
157 SetCurrentGL(GetCurrentGL());
158 }
159
152 ScopedCGLSetCurrentContext(static_cast<CGLContextObj>(context_)); 160 ScopedCGLSetCurrentContext(static_cast<CGLContextObj>(context_));
153 yuv_to_rgb_converter_.reset(); 161 yuv_to_rgb_converter_.reset();
162
163 // Rebind the current context's API if needed.
164 if (current_context && current_context != this) {
165 SetCurrentGL(current_context->GetCurrentGL());
166 }
154 } 167 }
155 if (discrete_pixelformat_) { 168 if (discrete_pixelformat_) {
156 if (base::MessageLoop::current() != nullptr) { 169 if (base::MessageLoop::current() != nullptr) {
157 // Delay releasing the pixel format for 10 seconds to reduce the number of 170 // Delay releasing the pixel format for 10 seconds to reduce the number of
158 // unnecessary GPU switches. 171 // unnecessary GPU switches.
159 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 172 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
160 FROM_HERE, base::Bind(&CGLReleasePixelFormat, discrete_pixelformat_), 173 FROM_HERE, base::Bind(&CGLReleasePixelFormat, discrete_pixelformat_),
161 base::TimeDelta::FromSeconds(10)); 174 base::TimeDelta::FromSeconds(10));
162 } else { 175 } else {
163 CGLReleasePixelFormat(discrete_pixelformat_); 176 CGLReleasePixelFormat(discrete_pixelformat_);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 ScopedReleaseCurrent release_current; 242 ScopedReleaseCurrent release_current;
230 TRACE_EVENT0("gpu", "GLContextCGL::MakeCurrent"); 243 TRACE_EVENT0("gpu", "GLContextCGL::MakeCurrent");
231 244
232 if (CGLSetCurrentContext( 245 if (CGLSetCurrentContext(
233 static_cast<CGLContextObj>(context_)) != kCGLNoError) { 246 static_cast<CGLContextObj>(context_)) != kCGLNoError) {
234 LOG(ERROR) << "Unable to make gl context current."; 247 LOG(ERROR) << "Unable to make gl context current.";
235 return false; 248 return false;
236 } 249 }
237 250
238 // Set this as soon as the context is current, since we might call into GL. 251 // Set this as soon as the context is current, since we might call into GL.
239 SetRealGLApi(); 252 BindGLApi();
240 253
241 SetCurrent(surface); 254 SetCurrent(surface);
242 InitializeDynamicBindings(); 255 InitializeDynamicBindings();
243 256
244 if (!surface->OnMakeCurrent(this)) { 257 if (!surface->OnMakeCurrent(this)) {
245 LOG(ERROR) << "Unable to make gl context current."; 258 LOG(ERROR) << "Unable to make gl context current.";
246 return false; 259 return false;
247 } 260 }
248 261
249 release_current.Cancel(); 262 release_current.Cancel();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 300
288 GLContextCGL::~GLContextCGL() { 301 GLContextCGL::~GLContextCGL() {
289 Destroy(); 302 Destroy();
290 } 303 }
291 304
292 GpuPreference GLContextCGL::GetGpuPreference() { 305 GpuPreference GLContextCGL::GetGpuPreference() {
293 return gpu_preference_; 306 return gpu_preference_;
294 } 307 }
295 308
296 } // namespace gl 309 } // namespace gl
OLDNEW
« no previous file with comments | « ui/gl/gl_context.cc ('k') | ui/gl/gl_context_egl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698