| Index: ui/gl/gl_context_cgl.cc
|
| diff --git a/ui/gl/gl_context_cgl.cc b/ui/gl/gl_context_cgl.cc
|
| index 7d5a92317cd91d87baaa6bcd59a57709f3c0d666..b2683ef0d9d5f47b8735dd12a978c4e6c4bef663 100644
|
| --- a/ui/gl/gl_context_cgl.cc
|
| +++ b/ui/gl/gl_context_cgl.cc
|
| @@ -19,6 +19,8 @@ namespace gfx {
|
|
|
| bool g_support_renderer_switching;
|
|
|
| +bool g_force_cgl_set_virtual_screen = false;
|
| +
|
| static CGLPixelFormatObj GetPixelFormat() {
|
| static CGLPixelFormatObj format;
|
| if (format)
|
| @@ -125,36 +127,41 @@ void GLContextCGL::Destroy() {
|
|
|
| bool GLContextCGL::MakeCurrent(GLSurface* surface) {
|
| DCHECK(context_);
|
| - int renderer_id = share_group()->GetRendererID();
|
| - int screen;
|
| - CGLGetVirtualScreen(static_cast<CGLContextObj>(context_), &screen);
|
| -
|
| - if (g_support_renderer_switching &&
|
| - !discrete_pixelformat_ && renderer_id != -1 &&
|
| - (screen != screen_ || renderer_id != renderer_id_)) {
|
| - // Attempt to find a virtual screen that's using the requested renderer,
|
| - // and switch the context to use that screen. Don't attempt to switch if
|
| - // the context requires the discrete GPU.
|
| - CGLPixelFormatObj format = GetPixelFormat();
|
| - int virtual_screen_count;
|
| - if (CGLDescribePixelFormat(format, 0, kCGLPFAVirtualScreenCount,
|
| - &virtual_screen_count) != kCGLNoError)
|
| - return false;
|
|
|
| - for (int i = 0; i < virtual_screen_count; ++i) {
|
| - int screen_renderer_id;
|
| - if (CGLDescribePixelFormat(format, i, kCGLPFARendererID,
|
| - &screen_renderer_id) != kCGLNoError)
|
| + // The call to CGLSetVirtualScreen can hang on some AMD drivers
|
| + // http://crbug.com/227228
|
| + if (g_force_cgl_set_virtual_screen) {
|
| + int renderer_id = share_group()->GetRendererID();
|
| + int screen;
|
| + CGLGetVirtualScreen(static_cast<CGLContextObj>(context_), &screen);
|
| +
|
| + if (g_support_renderer_switching &&
|
| + !discrete_pixelformat_ && renderer_id != -1 &&
|
| + (screen != screen_ || renderer_id != renderer_id_)) {
|
| + // Attempt to find a virtual screen that's using the requested renderer,
|
| + // and switch the context to use that screen. Don't attempt to switch if
|
| + // the context requires the discrete GPU.
|
| + CGLPixelFormatObj format = GetPixelFormat();
|
| + int virtual_screen_count;
|
| + if (CGLDescribePixelFormat(format, 0, kCGLPFAVirtualScreenCount,
|
| + &virtual_screen_count) != kCGLNoError)
|
| return false;
|
|
|
| - screen_renderer_id &= kCGLRendererIDMatchingMask;
|
| - if (screen_renderer_id == renderer_id) {
|
| - CGLSetVirtualScreen(static_cast<CGLContextObj>(context_), i);
|
| - screen_ = i;
|
| - break;
|
| + for (int i = 0; i < virtual_screen_count; ++i) {
|
| + int screen_renderer_id;
|
| + if (CGLDescribePixelFormat(format, i, kCGLPFARendererID,
|
| + &screen_renderer_id) != kCGLNoError)
|
| + return false;
|
| +
|
| + screen_renderer_id &= kCGLRendererIDMatchingMask;
|
| + if (screen_renderer_id == renderer_id) {
|
| + CGLSetVirtualScreen(static_cast<CGLContextObj>(context_), i);
|
| + screen_ = i;
|
| + break;
|
| + }
|
| }
|
| + renderer_id_ = renderer_id;
|
| }
|
| - renderer_id_ = renderer_id;
|
| }
|
|
|
| if (IsCurrent(surface))
|
| @@ -267,6 +274,11 @@ bool GLContextCGL::GetTotalGpuMemory(size_t* bytes) {
|
| return false;
|
| }
|
|
|
| +// static
|
| +void GLContextCGL::ForceCGLSetVirtualScreen() {
|
| + g_force_cgl_set_virtual_screen = true;
|
| +}
|
| +
|
| GLContextCGL::~GLContextCGL() {
|
| Destroy();
|
| }
|
|
|