diff --git a/Makefile b/Makefile index 59a5360..b0059f4 100644 --- a/Makefile +++ b/Makefile @@ -80,7 +80,7 @@ ifeq ($(patsubst IRIX%,IRIX,$(SYSTEM)), IRIX) CC = cc EXTRA_CCFLAGS = EXTRA_LDFALGS = -EXTRA_CPPFLAGS = +EXTRA_CPPFLAGS = -DGLEW_NEEDS_CUSTOM_GET_PROCADDRESS=1 -DGLEW_OPENGL_LIB_PATH=\"libGL.so\" NAME = GLEW P.BIN = WARN = -fullwarn diff --git a/auto/src/glew_pre.c b/auto/src/glew_pre.c index a8fc34c..ddfa077 100644 --- a/auto/src/glew_pre.c +++ b/auto/src/glew_pre.c @@ -34,10 +34,44 @@ #include #ifdef _WIN32 -#define glewGetProcAddress(name) wglGetProcAddress(name) +# define glewGetProcAddress(name) wglGetProcAddress(name) #else -#define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) -#endif +# ifdef GLEW_NEEDS_CUSTOM_GET_PROCADDRESS +# define glewGetProcAddress(name) __dlopenGetProcAddress(name) +# else +# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name) +# endif /* GLEW_NEEDS_CUSTOM_GET_PROCADDRESS */ +#endif /* _WIN32 */ + +#ifdef GLEW_NEEDS_CUSTOM_GET_PROCADDRESS +#include +#include +#include + +static void * __dlopenGetProcAddress(const GLubyte *procName) +{ + static void *h = NULL; + static void *gpa; + + if (!h) + { + if (!(h = dlopen(GLEW_OPENGL_LIB_PATH, RTLD_LAZY | RTLD_LOCAL))) + { + fprintf(stderr, + "E: GLEW failed to dlopen %s: %s.\nAbort.\n", + GLEW_OPENGL_LIB_PATH, dlerror()); + exit(100); + } + + gpa = dlsym(h, "glXGetProcAddress"); + } + + if (gpa != NULL) + return ((void* (*)(const GLubyte*))gpa)(procName); + else + return dlsym(h, (const char *)procName); +} +#endif /* GLEW_NEEDS_CUSTOM_GET_PROCADDRESS */ /* ----------------------------- GL_VERSION_1_1 ---------------------------- */