| Index: ui/gfx/gl/gl_surface_glx.cc
|
| diff --git a/ui/gfx/gl/gl_surface_glx.cc b/ui/gfx/gl/gl_surface_glx.cc
|
| deleted file mode 100644
|
| index 1440e5c9b73a7797e501dbd2f76dd2a5a5b992e7..0000000000000000000000000000000000000000
|
| --- a/ui/gfx/gl/gl_surface_glx.cc
|
| +++ /dev/null
|
| @@ -1,326 +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_surface_glx.h"
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/process_util.h"
|
| -#include "third_party/mesa/MesaLib/include/GL/osmesa.h"
|
| -#include "ui/base/x/x11_util.h"
|
| -#include "ui/gfx/gl/gl_bindings.h"
|
| -#include "ui/gfx/gl/gl_implementation.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);
|
| - }
|
| -};
|
| -
|
| -Display* g_display;
|
| -const char* g_glx_extensions = NULL;
|
| -bool g_glx_create_context_robustness_supported = false;
|
| -
|
| -} // namespace anonymous
|
| -
|
| -GLSurfaceGLX::GLSurfaceGLX() {
|
| -}
|
| -
|
| -GLSurfaceGLX::~GLSurfaceGLX() {
|
| -}
|
| -
|
| -bool GLSurfaceGLX::InitializeOneOff() {
|
| - static bool initialized = false;
|
| - if (initialized)
|
| - return true;
|
| -
|
| - g_display = base::MessagePumpForUI::GetDefaultXDisplay();
|
| - if (!g_display) {
|
| - LOG(ERROR) << "XOpenDisplay failed.";
|
| - return false;
|
| - }
|
| -
|
| - int major, minor;
|
| - if (!glXQueryVersion(g_display, &major, &minor)) {
|
| - LOG(ERROR) << "glxQueryVersion failed";
|
| - return false;
|
| - }
|
| -
|
| - if (major == 1 && minor < 3) {
|
| - LOG(ERROR) << "GLX 1.3 or later is required.";
|
| - return false;
|
| - }
|
| -
|
| - g_glx_extensions = glXQueryExtensionsString(g_display, 0);
|
| - g_glx_create_context_robustness_supported =
|
| - HasGLXExtension("GLX_ARB_create_context_robustness");
|
| -
|
| - initialized = true;
|
| - return true;
|
| -}
|
| -
|
| -// static
|
| -const char* GLSurfaceGLX::GetGLXExtensions() {
|
| - return g_glx_extensions;
|
| -}
|
| -
|
| -// static
|
| -bool GLSurfaceGLX::HasGLXExtension(const char* name) {
|
| - DCHECK(name);
|
| - const char* c_extensions = GetGLXExtensions();
|
| - if (!c_extensions)
|
| - return false;
|
| - std::string extensions(c_extensions);
|
| - extensions += " ";
|
| -
|
| - std::string delimited_name(name);
|
| - delimited_name += " ";
|
| -
|
| - return extensions.find(delimited_name) != std::string::npos;
|
| -}
|
| -
|
| -// static
|
| -bool GLSurfaceGLX::IsCreateContextRobustnessSupported() {
|
| - return g_glx_create_context_robustness_supported;
|
| -}
|
| -
|
| -void* GLSurfaceGLX::GetDisplay() {
|
| - return g_display;
|
| -}
|
| -
|
| -NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX(gfx::AcceleratedWidget window)
|
| - : window_(window),
|
| - config_(NULL) {
|
| -}
|
| -
|
| -NativeViewGLSurfaceGLX::NativeViewGLSurfaceGLX()
|
| - : window_(0),
|
| - config_(NULL) {
|
| -}
|
| -
|
| -NativeViewGLSurfaceGLX::~NativeViewGLSurfaceGLX() {
|
| - Destroy();
|
| -}
|
| -
|
| -bool NativeViewGLSurfaceGLX::Initialize() {
|
| - XWindowAttributes attributes;
|
| - if (!XGetWindowAttributes(g_display, window_, &attributes)) {
|
| - LOG(ERROR) << "XGetWindowAttributes failed for window " << window_ << ".";
|
| - return false;
|
| - }
|
| - size_ = gfx::Size(attributes.width, attributes.height);
|
| - return true;
|
| -}
|
| -
|
| -void NativeViewGLSurfaceGLX::Destroy() {
|
| -}
|
| -
|
| -bool NativeViewGLSurfaceGLX::Resize(const gfx::Size& size) {
|
| - // On Intel drivers, the frame buffer won't be resize until the next swap. If
|
| - // we only do PostSubBuffer, then we're stuck in the old size. Force a swap
|
| - // now.
|
| - if (gfx::g_GLX_MESA_copy_sub_buffer && size_ != size)
|
| - SwapBuffers();
|
| - size_ = size;
|
| - return true;
|
| -}
|
| -
|
| -bool NativeViewGLSurfaceGLX::IsOffscreen() {
|
| - return false;
|
| -}
|
| -
|
| -bool NativeViewGLSurfaceGLX::SwapBuffers() {
|
| - glXSwapBuffers(g_display, window_);
|
| - return true;
|
| -}
|
| -
|
| -gfx::Size NativeViewGLSurfaceGLX::GetSize() {
|
| - return size_;
|
| -}
|
| -
|
| -void* NativeViewGLSurfaceGLX::GetHandle() {
|
| - return reinterpret_cast<void*>(window_);
|
| -}
|
| -
|
| -std::string NativeViewGLSurfaceGLX::GetExtensions() {
|
| - std::string extensions = GLSurface::GetExtensions();
|
| - if (g_GLX_MESA_copy_sub_buffer) {
|
| - extensions += extensions.empty() ? "" : " ";
|
| - extensions += "GL_CHROMIUM_post_sub_buffer";
|
| - }
|
| - return extensions;
|
| -}
|
| -
|
| -void* NativeViewGLSurfaceGLX::GetConfig() {
|
| - if (!config_) {
|
| - // This code path is expensive, but we only take it when
|
| - // attempting to use GLX_ARB_create_context_robustness, in which
|
| - // case we need a GLXFBConfig for the window in order to create a
|
| - // context for it.
|
| - //
|
| - // TODO(kbr): this is not a reliable code path. On platforms which
|
| - // support it, we should use glXChooseFBConfig in the browser
|
| - // process to choose the FBConfig and from there the X Visual to
|
| - // use when creating the window in the first place. Then we can
|
| - // pass that FBConfig down rather than attempting to reconstitute
|
| - // it.
|
| -
|
| - XWindowAttributes attributes;
|
| - if (!XGetWindowAttributes(
|
| - g_display,
|
| - reinterpret_cast<GLXDrawable>(GetHandle()),
|
| - &attributes)) {
|
| - LOG(ERROR) << "XGetWindowAttributes failed for window " <<
|
| - reinterpret_cast<GLXDrawable>(GetHandle()) << ".";
|
| - return NULL;
|
| - }
|
| -
|
| - int visual_id = XVisualIDFromVisual(attributes.visual);
|
| -
|
| - int num_elements = 0;
|
| - scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> configs(
|
| - glXGetFBConfigs(g_display,
|
| - DefaultScreen(g_display),
|
| - &num_elements));
|
| - if (!configs.get()) {
|
| - LOG(ERROR) << "glXGetFBConfigs failed.";
|
| - return NULL;
|
| - }
|
| - if (!num_elements) {
|
| - LOG(ERROR) << "glXGetFBConfigs returned 0 elements.";
|
| - return NULL;
|
| - }
|
| - bool found = false;
|
| - int i;
|
| - for (i = 0; i < num_elements; ++i) {
|
| - int value;
|
| - if (glXGetFBConfigAttrib(
|
| - g_display, configs.get()[i], GLX_VISUAL_ID, &value)) {
|
| - LOG(ERROR) << "glXGetFBConfigAttrib failed.";
|
| - return NULL;
|
| - }
|
| - if (value == visual_id) {
|
| - found = true;
|
| - break;
|
| - }
|
| - }
|
| - if (found) {
|
| - config_ = configs.get()[i];
|
| - }
|
| - }
|
| -
|
| - return config_;
|
| -}
|
| -
|
| -bool NativeViewGLSurfaceGLX::PostSubBuffer(
|
| - int x, int y, int width, int height) {
|
| - DCHECK(g_GLX_MESA_copy_sub_buffer);
|
| - glXCopySubBufferMESA(g_display, window_, x, y, width, height);
|
| - return true;
|
| -}
|
| -
|
| -PbufferGLSurfaceGLX::PbufferGLSurfaceGLX(const gfx::Size& size)
|
| - : size_(size),
|
| - config_(NULL),
|
| - pbuffer_(0) {
|
| -}
|
| -
|
| -PbufferGLSurfaceGLX::~PbufferGLSurfaceGLX() {
|
| - Destroy();
|
| -}
|
| -
|
| -bool PbufferGLSurfaceGLX::Initialize() {
|
| - DCHECK(!pbuffer_);
|
| -
|
| - static const int config_attributes[] = {
|
| - GLX_BUFFER_SIZE, 32,
|
| - GLX_ALPHA_SIZE, 8,
|
| - GLX_BLUE_SIZE, 8,
|
| - GLX_GREEN_SIZE, 8,
|
| - GLX_RED_SIZE, 8,
|
| - GLX_RENDER_TYPE, GLX_RGBA_BIT,
|
| - GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
|
| - GLX_DOUBLEBUFFER, False,
|
| - 0
|
| - };
|
| -
|
| - int num_elements = 0;
|
| - scoped_ptr_malloc<GLXFBConfig, ScopedPtrXFree> configs(
|
| - glXChooseFBConfig(g_display,
|
| - DefaultScreen(g_display),
|
| - config_attributes,
|
| - &num_elements));
|
| - if (!configs.get()) {
|
| - LOG(ERROR) << "glXChooseFBConfig failed.";
|
| - return false;
|
| - }
|
| - if (!num_elements) {
|
| - LOG(ERROR) << "glXChooseFBConfig returned 0 elements.";
|
| - return false;
|
| - }
|
| -
|
| - config_ = configs.get()[0];
|
| -
|
| - const int pbuffer_attributes[] = {
|
| - GLX_PBUFFER_WIDTH, size_.width(),
|
| - GLX_PBUFFER_HEIGHT, size_.height(),
|
| - 0
|
| - };
|
| - pbuffer_ = glXCreatePbuffer(g_display,
|
| - static_cast<GLXFBConfig>(config_),
|
| - pbuffer_attributes);
|
| - if (!pbuffer_) {
|
| - Destroy();
|
| - LOG(ERROR) << "glXCreatePbuffer failed.";
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void PbufferGLSurfaceGLX::Destroy() {
|
| - if (pbuffer_) {
|
| - glXDestroyPbuffer(g_display, pbuffer_);
|
| - pbuffer_ = 0;
|
| - }
|
| -
|
| - config_ = NULL;
|
| -}
|
| -
|
| -bool PbufferGLSurfaceGLX::IsOffscreen() {
|
| - return true;
|
| -}
|
| -
|
| -bool PbufferGLSurfaceGLX::SwapBuffers() {
|
| - NOTREACHED() << "Attempted to call SwapBuffers on a pbuffer.";
|
| - return false;
|
| -}
|
| -
|
| -gfx::Size PbufferGLSurfaceGLX::GetSize() {
|
| - return size_;
|
| -}
|
| -
|
| -void* PbufferGLSurfaceGLX::GetHandle() {
|
| - return reinterpret_cast<void*>(pbuffer_);
|
| -}
|
| -
|
| -void* PbufferGLSurfaceGLX::GetConfig() {
|
| - return config_;
|
| -}
|
| -
|
| -} // namespace gfx
|
|
|