Enlightenment CVS committal

Author  : kwo
Project : e16
Module  : e

Dir     : e16/e/src


Modified Files:
        eglx.c 


Log Message:
Fix building with glx when glXBind/ReleaseTexImageEXT are not directly available
(based on patch by bene42).

===================================================================
RCS file: /cvs/e/e16/e/src/eglx.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- eglx.c      8 Apr 2007 20:24:06 -0000       1.2
+++ eglx.c      14 Jun 2007 22:38:22 -0000      1.3
@@ -48,6 +48,63 @@
 #define TEXTURE_TARGET GLX_TEXTURE_RECTANGLE_EXT
 #endif
 
+#ifdef HAVE_GLX_glXBindTexImageEXT
+
+#define _glXBindTexImageEXT    glXBindTexImageEXT
+#define _glXReleaseTexImageEXT glXReleaseTexImageEXT
+
+#else
+
+#include <dlfcn.h>
+
+/* GL functions and helper */
+typedef void        (*glXBindTexImageEXT_func) (Display * dpy,
+                                               GLXDrawable drawable,
+                                               int buffer,
+                                               const int *attrib_list);
+typedef void        (*glXReleaseTexImageEXT_func) (Display * dpy,
+                                                  GLXDrawable drawable,
+                                                  int buffer);
+typedef void        (*glXFuncPtr) (void);
+typedef             glXFuncPtr(*glXGetProcAddress_func) (const GLubyte *);
+
+static glXBindTexImageEXT_func _glXBindTexImageEXT;
+static glXReleaseTexImageEXT_func _glXReleaseTexImageEXT;
+static glXGetProcAddress_func glx_get_proc_address;
+
+static              glXFuncPtr
+get_func_addr(const char *name)
+{
+   glXFuncPtr          ret = NULL;
+
+   if (glx_get_proc_address)
+      ret = glx_get_proc_address((const GLubyte *)name);
+   if (!ret)
+      ret = (glXFuncPtr) dlsym(RTLD_DEFAULT, name);
+
+   return ret;
+}
+
+static int
+glx_funcs_init(void)
+{
+   glx_get_proc_address = (glXGetProcAddress_func)
+      get_func_addr("glXGetProcAddress");
+   if (!glx_get_proc_address)
+      glx_get_proc_address = (glXGetProcAddress_func)
+        get_func_addr("glXGetProcAddressARB");
+
+   _glXBindTexImageEXT = (glXBindTexImageEXT_func)
+      get_func_addr("glXBindTexImageEXT");
+
+   _glXReleaseTexImageEXT = (glXReleaseTexImageEXT_func)
+      get_func_addr("glXReleaseTexImageEXT");
+
+   return !_glXBindTexImageEXT || !_glXReleaseTexImageEXT;
+}
+
+#endif /* HAVE_GLX_glXBindTexImageEXT */
+
 static void         EobjTexturesFree(void);
 
 typedef struct
@@ -186,6 +243,14 @@
        return -1;
      }
 
+#ifndef HAVE_GLX_glXBindTexImageEXT
+   if (glx_funcs_init())
+     {
+       Eprintf("glXBindTexImageEXT or glXReleaseTexImageEXT not available\n");
+       return -1;
+     }
+#endif
+
    egl.vi = glXGetVisualFromFBConfig(disp, egl.fbc);
 
    egl.ctx = glXCreateNewContext(disp, egl.fbc, GLX_RGBA_TYPE, NULL, True);
@@ -376,12 +441,12 @@
    switch (mode & 0xff)
      {
      case 0:
-       glXBindTexImageEXT(disp, glxpixmap, GLX_FRONT_LEFT_EXT, NULL);
+       _glXBindTexImageEXT(disp, glxpixmap, GLX_FRONT_LEFT_EXT, NULL);
        glTexParameteri(et->target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(et->target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        break;
      case 1:
-       glXBindTexImageEXT(disp, glxpixmap, GLX_FRONT_LEFT_EXT, NULL);
+       _glXBindTexImageEXT(disp, glxpixmap, GLX_FRONT_LEFT_EXT, NULL);
        glTexParameteri(et->target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(et->target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        break;
@@ -413,7 +478,7 @@
      case ETEX_TYPE_PIXMAP:
        if (!et->glxpmap)
           break;
-       glXReleaseTexImageEXT(disp, et->glxpmap, GLX_FRONT_LEFT_EXT);
+       _glXReleaseTexImageEXT(disp, et->glxpmap, GLX_FRONT_LEFT_EXT);
        glBindTexture(et->target, 0);
        glDisable(et->target);
        glXDestroyPixmap(disp, et->glxpmap);



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to