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

Unified Diff: ui/gfx/gl/gl_context_cgl.cc

Issue 8233027: Support dynamic switching between integrated and discrete GPUs on Mac OS X. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: ui/gfx/gl/gl_context_cgl.cc
===================================================================
--- ui/gfx/gl/gl_context_cgl.cc (revision 105158)
+++ ui/gfx/gl/gl_context_cgl.cc (working copy)
@@ -4,6 +4,8 @@
#include "ui/gfx/gl/gl_context_cgl.h"
+#include <vector>
+
#include "base/logging.h"
#include "ui/gfx/gl/gl_bindings.h"
#include "ui/gfx/gl/gl_surface_cgl.h"
@@ -12,27 +14,64 @@
GLContextCGL::GLContextCGL(GLShareGroup* share_group)
: GLContext(share_group),
- context_(NULL) {
+ context_(NULL),
+ gpu_preference_(PreferIntegratedGpu) {
}
GLContextCGL::~GLContextCGL() {
Destroy();
}
-bool GLContextCGL::Initialize(GLSurface* compatible_surface) {
+bool GLContextCGL::Initialize(
+ GLSurface* compatible_surface, GpuPreference gpu_preference) {
DCHECK(compatible_surface);
+ // Ensure the GPU preference is compatible with contexts already in the
+ // share group.
+ GLContextCGL* share_context = share_group() ?
+ static_cast<GLContextCGL*>(share_group()->GetContext()) : NULL;
+ if (share_context && gpu_preference != share_context->GetGpuPreference())
+ return false;
+
+ std::vector<CGLPixelFormatAttribute> attribs;
+ attribs.push_back(kCGLPFAPBuffer);
+ bool using_offline_renderer =
+ SupportsDualGpus() && gpu_preference == PreferIntegratedGpu;
+ if (using_offline_renderer) {
+ attribs.push_back(kCGLPFAAllowOfflineRenderers);
+ }
+ attribs.push_back((CGLPixelFormatAttribute) 0);
+
+ CGLPixelFormatObj format;
+ GLint num_pixel_formats;
+ if (CGLChoosePixelFormat(&attribs.front(),
+ &format,
+ &num_pixel_formats) != kCGLNoError) {
+ LOG(ERROR) << "Error choosing pixel format.";
+ return false;
+ }
+ if (num_pixel_formats == 0) {
+ LOG(ERROR) << "num_pixel_formats == 0.";
+ return false;
+ }
+ if (!format) {
Mark Mentovai 2011/10/13 03:50:33 This is similar to the other maybe-I-leak-format t
Ken Russell (switch to Gerrit) 2011/10/13 20:09:32 I reviewed the documentation for CGLChoosePixelFor
+ LOG(ERROR) << "pixel_format == 0.";
+ return false;
+ }
+
CGLError res = CGLCreateContext(
- static_cast<CGLPixelFormatObj>(GLSurfaceCGL::GetPixelFormat()),
- share_group() ?
- static_cast<CGLContextObj>(share_group()->GetHandle()) : NULL,
+ format,
+ share_context ?
+ static_cast<CGLContextObj>(share_context->GetHandle()) : NULL,
reinterpret_cast<CGLContextObj*>(&context_));
+ CGLReleasePixelFormat(format);
if (res != kCGLNoError) {
LOG(ERROR) << "Error creating context.";
Destroy();
return false;
}
+ gpu_preference_ = gpu_preference;
return true;
}
@@ -115,4 +154,8 @@
LOG(WARNING) << "GLContex: GLContextCGL::SetSwapInterval is ignored.";
}
+GpuPreference GLContextCGL::GetGpuPreference() {
+ return gpu_preference_;
+}
+
} // namespace gfx

Powered by Google App Engine
This is Rietveld 408576698