浏览代码

add glx-get-proc-address, glx-os-proc-address

David Rose 20 年之前
父节点
当前提交
87d34eaed1

+ 15 - 0
panda/src/glxdisplay/config_glxdisplay.cxx

@@ -38,6 +38,21 @@ ConfigVariableString display_cfg
 ConfigVariableBool glx_error_abort
 ("glx-error-abort", false);
 
+ConfigVariableBool glx_get_proc_address
+("glx-get-proc-address", true,
+ PRC_DESC("Set this to true to allow the use of glxGetProcAddress(), if "
+	  "it is available, to query the OpenGL extension functions.  This "
+	  "is the standard way to query extension functions."));
+
+
+ConfigVariableBool glx_get_os_address
+("glx-get-os-address", true,
+ PRC_DESC("Set this to true to allow Panda to query the OpenGL library "
+	  "directly using standard operating system calls to locate "
+	  "addresses of extension functions.  This will be done only "
+	  "if glxGetProcAddress() cannot be used for some reason."));
+	  
+
 ////////////////////////////////////////////////////////////////////
 //     Function: init_libglxdisplay
 //  Description: Initializes the library.  This must be called at

+ 2 - 0
panda/src/glxdisplay/config_glxdisplay.h

@@ -30,5 +30,7 @@ extern EXPCL_PANDAGL void init_libglxdisplay();
 
 extern ConfigVariableString display_cfg;
 extern ConfigVariableBool glx_error_abort;
+extern ConfigVariableBool glx_get_proc_address;
+extern ConfigVariableBool glx_get_os_address;
 
 #endif /* __CONFIG_GLXDISPLAY_H__ */

+ 32 - 26
panda/src/glxdisplay/glxGraphicsStateGuardian.cxx

@@ -228,39 +228,45 @@ get_extra_extensions() {
 ////////////////////////////////////////////////////////////////////
 void *glxGraphicsStateGuardian::
 get_extension_func(const char *prefix, const char *name) {
-  if (!_checked_get_proc_address) {
-    // First, check if we have glxGetProcAddress available.  This will
-    // be superior if we can get it.
-    const char *funcName = NULL;
-
-    if (glx_is_at_least_version(1, 4)) {
-      funcName = "glXGetProcAddress";
-
-    } else if (has_extension("GLX_ARB_get_proc_address")) {
-      funcName = "glXGetProcAddressARB";
-    }
+  string fullname = string(prefix) + string(name);
 
-    if (funcName != NULL) {
-      _glxGetProcAddress = (PFNGLXGETPROCADDRESSPROC)get_system_func(funcName);
-      if (_glxGetProcAddress == NULL) {
-        glxdisplay_cat.warning()
-          << "Couldn't load function " << funcName
-          << ", GL extensions may be unavailable.\n";
+  if (glx_get_proc_address) {
+    if (!_checked_get_proc_address) {
+      // First, check if we have glxGetProcAddress available.  This will
+      // be superior if we can get it.
+      const char *funcName = NULL;
+      
+      if (glx_is_at_least_version(1, 4)) {
+	funcName = "glXGetProcAddress";
+	
+      } else if (has_extension("GLX_ARB_get_proc_address")) {
+	funcName = "glXGetProcAddressARB";
+      }
+      
+      if (funcName != NULL) {
+	_glxGetProcAddress = (PFNGLXGETPROCADDRESSPROC)get_system_func(funcName);
+	if (_glxGetProcAddress == NULL) {
+	  glxdisplay_cat.warning()
+	    << "Couldn't load function " << funcName
+	    << ", GL extensions may be unavailable.\n";
+	}
       }
+      
+      _checked_get_proc_address = true;
+    }
+    
+    // Use glxGetProcAddress() if we've got it; it should be more robust.
+    if (_glxGetProcAddress != NULL) {
+      return (void *)_glxGetProcAddress((const GLubyte *)fullname.c_str());
     }
-
-    _checked_get_proc_address = true;
   }
 
-  string fullname = string(prefix) + string(name);
-
-  // Use glxGetProcAddress() if we've got it; it should be more robust.
-  if (_glxGetProcAddress != NULL) {
-    return (void *)_glxGetProcAddress((const GLubyte *)fullname.c_str());
+  if (glx_get_os_address) {
+    // Otherwise, fall back to the OS-provided calls.
+    return get_system_func(fullname.c_str());
   }
 
-  // Otherwise, fall back to the OS-provided calls.
-  return get_system_func(fullname.c_str());
+  return NULL;
 }
 
 ////////////////////////////////////////////////////////////////////