diff options
author | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-09 02:45:56 +0000 |
---|---|---|
committer | piman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-09 02:45:56 +0000 |
commit | 7684ec15c2aa4f08465784468189e316fb0ec79d (patch) | |
tree | 7aadda06fe250e6a1bdd353087539ce967c65fb7 /gpu | |
parent | 4151d45b12283276609749e857724849100f753c (diff) | |
download | chromium_src-7684ec15c2aa4f08465784468189e316fb0ec79d.zip chromium_src-7684ec15c2aa4f08465784468189e316fb0ec79d.tar.gz chromium_src-7684ec15c2aa4f08465784468189e316fb0ec79d.tar.bz2 |
linux: dynamically load libGL.so.1, and use glew to dynamically resolve symbols
This is to workaround NVIDIA's broken dlsym hook.
BUG=16800
Review URL: http://codereview.chromium.org/525109
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35863 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/x_utils.cc | 38 | ||||
-rw-r--r-- | gpu/command_buffer/service/x_utils.h | 2 | ||||
-rw-r--r-- | gpu/gpu.gyp | 2 |
3 files changed, 40 insertions, 2 deletions
diff --git a/gpu/command_buffer/service/x_utils.cc b/gpu/command_buffer/service/x_utils.cc index 78570de..d763755 100644 --- a/gpu/command_buffer/service/x_utils.cc +++ b/gpu/command_buffer/service/x_utils.cc @@ -4,13 +4,36 @@ // This class implements the XWindowWrapper class. +#include <dlfcn.h> + #include "gpu/command_buffer/service/precompile.h" #include "gpu/command_buffer/common/logging.h" #include "gpu/command_buffer/service/x_utils.h" namespace gpu { +// Some versions of NVIDIA's GL libGL.so include a broken version of +// dlopen/dlsym, and so linking it into chrome breaks it. So we dynamically +// load it, and use glew to dynamically resolve symbols. +// See http://code.google.com/p/chromium/issues/detail?id=16800 + +static bool g_glew_initialized = false; + bool XWindowWrapper::Initialize() { + if (!g_glew_initialized) { + void* handle = dlopen("libGL.so.1", RTLD_LAZY | RTLD_GLOBAL); + if (!handle) { + LOG(ERROR) << "Could not find libGL.so.1"; + return false; + } + + // Initializes context-independent parts of GLEW + if (glxewInit() != GLEW_OK) { + LOG(ERROR) << "GLXEW failed initialization"; + return false; + } + g_glew_initialized = true; + } XWindowAttributes attributes; XGetWindowAttributes(display_, window_, &attributes); XVisualInfo visual_info_template; @@ -32,6 +55,21 @@ bool XWindowWrapper::Initialize() { DLOG(ERROR) << "Couldn't create GL context."; return false; } + if (!MakeCurrent()) { + return false; + } + + // Initializes context-dependent parts of GLEW + if (glewInit() != GLEW_OK) { + LOG(ERROR) << "GLEW failed initialization"; + return false; + } + + if (!glewIsSupported("GL_VERSION_2_0")) { + LOG(ERROR) << "GL implementation doesn't support GL version 2.0"; + return false; + } + return true; } diff --git a/gpu/command_buffer/service/x_utils.h b/gpu/command_buffer/service/x_utils.h index ea478a6..5a4b517 100644 --- a/gpu/command_buffer/service/x_utils.h +++ b/gpu/command_buffer/service/x_utils.h @@ -7,7 +7,7 @@ #ifndef GPU_COMMAND_BUFFER_SERVICE_X_UTILS_H_ #define GPU_COMMAND_BUFFER_SERVICE_X_UTILS_H_ -#include <GL/glx.h> +#include <GL/glxew.h> #include "base/basictypes.h" #include "gpu/command_buffer/common/logging.h" diff --git a/gpu/gpu.gyp b/gpu/gpu.gyp index ee00088..8a51c05 100644 --- a/gpu/gpu.gyp +++ b/gpu/gpu.gyp @@ -54,7 +54,6 @@ '-L<(PRODUCT_DIR)', ], 'libraries': [ - '-lGL', '-lX11', ], }, @@ -255,6 +254,7 @@ 'command_buffer/service/x_utils.h', ], 'dependencies': [ + 'gl_libs', '../build/linux/system.gyp:gtk', ] }, |