summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/x_utils.cc
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/command_buffer/service/x_utils.cc
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/command_buffer/service/x_utils.cc')
-rw-r--r--gpu/command_buffer/service/x_utils.cc38
1 files changed, 38 insertions, 0 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;
}