Index: ui/gfx/gl/gl_context_glx.cc |
diff --git a/ui/gfx/gl/gl_context_glx.cc b/ui/gfx/gl/gl_context_glx.cc |
deleted file mode 100644 |
index 8cb65dbe81886b94794e9bd9055445b7d806ba77..0000000000000000000000000000000000000000 |
--- a/ui/gfx/gl/gl_context_glx.cc |
+++ /dev/null |
@@ -1,253 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-extern "C" { |
-#include <X11/Xlib.h> |
-} |
- |
-#include "ui/gfx/gl/gl_context_glx.h" |
- |
-#include "base/debug/trace_event.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "third_party/mesa/MesaLib/include/GL/osmesa.h" |
-#include "ui/gfx/gl/gl_bindings.h" |
-#include "ui/gfx/gl/gl_implementation.h" |
-#include "ui/gfx/gl/gl_surface_glx.h" |
- |
-namespace gfx { |
- |
-namespace { |
- |
-// scoped_ptr functor for XFree(). Use as follows: |
-// scoped_ptr_malloc<XVisualInfo, ScopedPtrXFree> foo(...); |
-// where "XVisualInfo" is any X type that is freed with XFree. |
-class ScopedPtrXFree { |
- public: |
- void operator()(void* x) const { |
- ::XFree(x); |
- } |
-}; |
- |
-} // namespace anonymous |
- |
-GLContextGLX::GLContextGLX(GLShareGroup* share_group) |
- : GLContext(share_group), |
- context_(NULL), |
- display_(NULL) { |
-} |
- |
-GLContextGLX::~GLContextGLX() { |
- Destroy(); |
-} |
- |
-Display* GLContextGLX::display() { |
- return display_; |
-} |
- |
-bool GLContextGLX::Initialize( |
- GLSurface* compatible_surface, GpuPreference gpu_preference) { |
- display_ = static_cast<Display*>(compatible_surface->GetDisplay()); |
- |
- GLXContext share_handle = static_cast<GLXContext>( |
- share_group() ? share_group()->GetHandle() : NULL); |
- |
- if (GLSurfaceGLX::IsCreateContextRobustnessSupported()) { |
- DLOG(INFO) << "GLX_ARB_create_context_robustness supported."; |
- |
- std::vector<int> attribs; |
- 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_, |
- static_cast<GLXFBConfig>(compatible_surface->GetConfig()), |
- share_handle, |
- True, |
- &attribs.front()); |
- if (context_) { |
- DLOG(INFO) << " 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_) { |
- // 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. |
- 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); |
- } |
- } |
- |
- if (!context_) { |
- LOG(ERROR) << "Couldn't create GL context."; |
- return false; |
- } |
- |
- DLOG(INFO) << (compatible_surface->IsOffscreen() ? "Offscreen" : "Onscreen") |
- << " context was " |
- << (glXIsDirect(display_, |
- static_cast<GLXContext>(context_)) |
- ? "direct" : "indirect") |
- << "."; |
- |
- return true; |
-} |
- |
-void GLContextGLX::Destroy() { |
- if (context_) { |
- glXDestroyContext(display_, |
- static_cast<GLXContext>(context_)); |
- context_ = NULL; |
- } |
-} |
- |
-bool GLContextGLX::MakeCurrent(GLSurface* surface) { |
- DCHECK(context_); |
- if (IsCurrent(surface)) |
- return true; |
- |
- TRACE_EVENT0("gpu", "GLContextGLX::MakeCurrent"); |
- if (!glXMakeCurrent( |
- display_, |
- reinterpret_cast<GLXDrawable>(surface->GetHandle()), |
- static_cast<GLXContext>(context_))) { |
- LOG(ERROR) << "Couldn't make context current with X drawable."; |
- Destroy(); |
- return false; |
- } |
- |
- SetCurrent(this, surface); |
- if (!InitializeExtensionBindings()) { |
- ReleaseCurrent(surface); |
- Destroy(); |
- return false; |
- } |
- |
- if (!surface->OnMakeCurrent(this)) { |
- LOG(ERROR) << "Could not make current."; |
- ReleaseCurrent(surface); |
- Destroy(); |
- return false; |
- } |
- |
- return true; |
-} |
- |
-void GLContextGLX::ReleaseCurrent(GLSurface* surface) { |
- if (!IsCurrent(surface)) |
- return; |
- |
- SetCurrent(NULL, NULL); |
- if (!glXMakeCurrent(display_, 0, 0)) |
- LOG(ERROR) << "glXMakeCurrent failed in ReleaseCurrent"; |
-} |
- |
-bool GLContextGLX::IsCurrent(GLSurface* surface) { |
- bool native_context_is_current = |
- glXGetCurrentContext() == static_cast<GLXContext>(context_); |
- |
- // If our context is current then our notion of which GLContext is |
- // current must be correct. On the other hand, third-party code |
- // using OpenGL might change the current context. |
- DCHECK(!native_context_is_current || (GetCurrent() == this)); |
- |
- if (!native_context_is_current) |
- return false; |
- |
- if (surface) { |
- if (glXGetCurrentDrawable() != |
- reinterpret_cast<GLXDrawable>(surface->GetHandle())) { |
- return false; |
- } |
- } |
- |
- return true; |
-} |
- |
-void* GLContextGLX::GetHandle() { |
- return context_; |
-} |
- |
-void GLContextGLX::SetSwapInterval(int interval) { |
- DCHECK(IsCurrent(NULL)); |
- if (HasExtension("GLX_EXT_swap_control") && glXSwapIntervalEXT) { |
- glXSwapIntervalEXT( |
- display_, |
- glXGetCurrentDrawable(), |
- interval); |
- } else { |
- if(interval == 0) |
- LOG(WARNING) << |
- "Could not disable vsync: driver does not " |
- "support GLX_EXT_swap_control"; |
- } |
-} |
- |
-std::string GLContextGLX::GetExtensions() { |
- DCHECK(IsCurrent(NULL)); |
- const char* extensions = GLSurfaceGLX::GetGLXExtensions(); |
- if (extensions) { |
- return GLContext::GetExtensions() + " " + extensions; |
- } |
- |
- return GLContext::GetExtensions(); |
-} |
- |
-bool GLContextGLX::WasAllocatedUsingARBRobustness() { |
- return GLSurfaceGLX::IsCreateContextRobustnessSupported(); |
-} |
- |
-} // namespace gfx |