Chromium Code Reviews| Index: ui/gl/gl_context_glx.cc |
| diff --git a/ui/gl/gl_context_glx.cc b/ui/gl/gl_context_glx.cc |
| index c6752634a19a640c253bf7dd1e81eb720b8753fa..a6b97872eb1c5e4b13d92ae2f7aa9ff67d1615ac 100644 |
| --- a/ui/gl/gl_context_glx.cc |
| +++ b/ui/gl/gl_context_glx.cc |
| @@ -49,12 +49,14 @@ bool GLContextGLX::Initialize( |
| GLXContext share_handle = static_cast<GLXContext>( |
| share_group() ? share_group()->GetHandle() : NULL); |
| - if (GLSurfaceGLX::IsCreateContextRobustnessSupported()) { |
| - DVLOG(1) << "GLX_ARB_create_context_robustness supported."; |
| - |
| + if (GLSurfaceGLX::IsCreateContextSupported()) { |
| + DVLOG(1) << "GLX_ARB_create_context supported."; |
| std::vector<int> attribs; |
| - attribs.push_back(GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB); |
| - attribs.push_back(GLX_LOSE_CONTEXT_ON_RESET_ARB); |
| + if (GLSurfaceGLX::IsCreateContextRobustnessSupported()) { |
| + DVLOG(1) << "GLX_ARB_create_context_robustness supported."; |
| + attribs.push_back(GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB); |
| + attribs.push_back(GLX_LOSE_CONTEXT_ON_RESET_ARB); |
| + } |
| attribs.push_back(0); |
| context_ = glXCreateContextAttribsARB( |
| display_, |
| @@ -62,75 +64,29 @@ bool GLContextGLX::Initialize( |
| share_handle, |
| True, |
| &attribs.front()); |
| - if (context_) { |
| - DVLOG(1) << " Successfully allocated " |
| - << (compatible_surface->IsOffscreen() ? |
| - "offscreen" : "onscreen") |
| - << " GL context with LOSE_CONTEXT_ON_RESET_ARB"; |
| - } else { |
| - // TODO(kbr): it is not expected that things will work properly |
| - // in this case, since we will likely allocate our offscreen |
| - // contexts with this bit set and the onscreen contexts without, |
| - // and won't be able to put them in the same share group. |
| - // Consider what to do here; force loss of all contexts and |
| - // reallocation without ARB_robustness? |
| - LOG(ERROR) << |
| - " FAILED to allocate GL context with LOSE_CONTEXT_ON_RESET_ARB"; |
| + if (!context_) { |
| + LOG(ERROR) << "Failed to create GL context with " |
| + << "glXCreateContextAttribsARB."; |
| + return false; |
| } |
| - } |
| - |
| - if (!context_) { |
| - // The means by which the context is created depends on whether |
| - // the drawable type works reliably with GLX 1.3. If it does not |
| - // then fall back to GLX 1.2. |
| - if (compatible_surface->IsOffscreen()) { |
| - context_ = glXCreateNewContext( |
| - display_, |
| - static_cast<GLXFBConfig>(compatible_surface->GetConfig()), |
| - GLX_RGBA_TYPE, |
| - share_handle, |
| - True); |
| - } else { |
| - // Get the visuals for the X drawable. |
|
Ken Russell (switch to Gerrit)
2012/12/08 20:10:57
If the last patch didn't work on all clients then
ccameron
2012/12/10 00:28:06
For the failures that we looked into, they were al
Ken Russell (switch to Gerrit)
2012/12/10 18:44:51
My concern was whether GLSurface::GetConfig worked
|
| - XWindowAttributes attributes; |
| - if (!XGetWindowAttributes( |
| - display_, |
| - reinterpret_cast<GLXDrawable>(compatible_surface->GetHandle()), |
| - &attributes)) { |
| - LOG(ERROR) << "XGetWindowAttributes failed for window " << |
| - reinterpret_cast<GLXDrawable>( |
| - compatible_surface->GetHandle()) << "."; |
| - return false; |
| - } |
| - |
| - XVisualInfo visual_info_template; |
| - visual_info_template.visualid = XVisualIDFromVisual(attributes.visual); |
| - |
| - int visual_info_count = 0; |
| - scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> visual_info_list( |
| - XGetVisualInfo(display_, VisualIDMask, |
| - &visual_info_template, |
| - &visual_info_count)); |
| - |
| - DCHECK(visual_info_list.get()); |
| - if (visual_info_count == 0) { |
| - LOG(ERROR) << "No visual info for visual ID."; |
| - return false; |
| - } |
| - |
| - // Attempt to create a context with each visual in turn until one works. |
| - context_ = glXCreateContext( |
| - display_, |
| - visual_info_list.get(), |
| - share_handle, |
| - True); |
| + } else { |
| + DVLOG(1) << "GLX_ARB_create_context not supported."; |
| + context_ = glXCreateNewContext( |
| + display_, |
| + static_cast<GLXFBConfig>(compatible_surface->GetConfig()), |
| + GLX_RGBA_TYPE, |
| + share_handle, |
| + True); |
| + if (!context_) { |
| + LOG(ERROR) << "Failed to create GL context with glXCreateNewContext."; |
| + return false; |
| } |
| } |
| - |
| - if (!context_) { |
| - LOG(ERROR) << "Couldn't create GL context."; |
| - return false; |
| - } |
| + DCHECK(context_); |
| + DVLOG(1) << " Successfully allocated " |
| + << (compatible_surface->IsOffscreen() ? |
| + "offscreen" : "onscreen") |
| + << " GL context with LOSE_CONTEXT_ON_RESET_ARB"; |
| DVLOG(1) << (compatible_surface->IsOffscreen() ? "Offscreen" : "Onscreen") |
| << " context was " |
| @@ -156,9 +112,10 @@ bool GLContextGLX::MakeCurrent(GLSurface* surface) { |
| return true; |
| TRACE_EVENT0("gpu", "GLContextGLX::MakeCurrent"); |
| - if (!glXMakeCurrent( |
| + if (!glXMakeContextCurrent( |
| display_, |
| reinterpret_cast<GLXDrawable>(surface->GetHandle()), |
| + reinterpret_cast<GLXDrawable>(surface->GetHandle()), |
| static_cast<GLXContext>(context_))) { |
| LOG(ERROR) << "Couldn't make context current with X drawable."; |
| Destroy(); |
| @@ -188,7 +145,7 @@ void GLContextGLX::ReleaseCurrent(GLSurface* surface) { |
| return; |
| SetCurrent(NULL, NULL); |
| - if (!glXMakeCurrent(display_, 0, 0)) |
| + if (!glXMakeContextCurrent(display_, 0, 0, 0)) |
| LOG(ERROR) << "glXMakeCurrent failed in ReleaseCurrent"; |
| } |