summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-09 02:45:56 +0000
committerpiman@chromium.org <piman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-01-09 02:45:56 +0000
commit7684ec15c2aa4f08465784468189e316fb0ec79d (patch)
tree7aadda06fe250e6a1bdd353087539ce967c65fb7 /gpu
parent4151d45b12283276609749e857724849100f753c (diff)
downloadchromium_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.cc38
-rw-r--r--gpu/command_buffer/service/x_utils.h2
-rw-r--r--gpu/gpu.gyp2
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',
]
},