add option for newer Linux demos to dynamically load X11, glX and OpenGL 1 functions
(and avoid having to link against X, glx and GL) -DGLEW_INIT_OPENGL11_FUNCTIONS -DGLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS -DDYNAMIC_LOAD_X11_FUNCTIONS and link against libdl (for example usingi -ldl)
This commit is contained in:
@@ -4,24 +4,24 @@
|
||||
** Copyright (C) 2002-2008, Marcelo E. Magallon <mmagallo[]debian org>
|
||||
** Copyright (C) 2002, Lev Povalahev
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
** modification, are permitted provided that the following conditions are met:
|
||||
**
|
||||
** * Redistributions of source code must retain the above copyright notice,
|
||||
**
|
||||
** * Redistributions of source code must retain the above copyright notice,
|
||||
** this list of conditions and the following disclaimer.
|
||||
** * Redistributions in binary form must reproduce the above copyright notice,
|
||||
** this list of conditions and the following disclaimer in the documentation
|
||||
** * Redistributions in binary form must reproduce the above copyright notice,
|
||||
** this list of conditions and the following disclaimer in the documentation
|
||||
** and/or other materials provided with the distribution.
|
||||
** * The name of the author may be used to endorse or promote products
|
||||
** * The name of the author may be used to endorse or promote products
|
||||
** derived from this software without specific prior written permission.
|
||||
**
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
@@ -34,7 +34,38 @@
|
||||
#if defined(_WIN32)
|
||||
# include <GL/wglew.h>
|
||||
#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
|
||||
# include <GL/glxew.h>
|
||||
# include "GL/glxew.h"
|
||||
|
||||
#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void* dlglXGetProcAddressARB(const GLubyte* name)
|
||||
{
|
||||
static void* h = NULL;
|
||||
static void* gpa;
|
||||
|
||||
if (h == NULL)
|
||||
{
|
||||
if ((h = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL)) == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
gpa = dlsym(h, "glXGetProcAddressARB");
|
||||
}
|
||||
|
||||
if (gpa != NULL)
|
||||
return ((void*(*)(const GLubyte*))gpa)(name);
|
||||
else
|
||||
return dlsym(h, (const char*)name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -102,7 +133,7 @@ void* NSGLGetProcAddress (const GLubyte *name)
|
||||
{
|
||||
static void* image = NULL;
|
||||
void* addr;
|
||||
if (NULL == image)
|
||||
if (NULL == image)
|
||||
{
|
||||
#ifdef GLEW_REGAL
|
||||
image = dlopen("libRegal.dylib", RTLD_LAZY);
|
||||
@@ -169,7 +200,11 @@ void* NSGLGetProcAddress (const GLubyte *name)
|
||||
#elif defined(__native_client__)
|
||||
# define glewGetProcAddress(name) NULL /* TODO */
|
||||
#else /* __linux */
|
||||
#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
# define glewGetProcAddress(name) dlglXGetProcAddressARB(name)
|
||||
#else//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
# define glewGetProcAddress(name) (*glXGetProcAddressARB)(name)
|
||||
#endif//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -9469,7 +9504,7 @@ static GLboolean _glewInit_GL_WIN_swap_hint (GLEW_CONTEXT_ARG_DEF_INIT)
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
GLboolean GLEWAPIENTRY glewGetExtension (const char* name)
|
||||
{
|
||||
{
|
||||
const GLubyte* start;
|
||||
const GLubyte* end;
|
||||
start = (const GLubyte*)glGetString(GL_EXTENSIONS);
|
||||
@@ -9496,7 +9531,7 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
|
||||
dot = _glewStrCLen(s, '.');
|
||||
if (dot == 0)
|
||||
return GLEW_ERROR_NO_GL_VERSION;
|
||||
|
||||
|
||||
major = s[dot-1]-'0';
|
||||
minor = s[dot+1]-'0';
|
||||
|
||||
@@ -9504,7 +9539,7 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
|
||||
minor = 0;
|
||||
if (major<0 || major>9)
|
||||
return GLEW_ERROR_NO_GL_VERSION;
|
||||
|
||||
|
||||
|
||||
if (major == 1 && minor == 0)
|
||||
{
|
||||
@@ -9521,12 +9556,12 @@ GLenum GLEWAPIENTRY glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
|
||||
CONST_CAST(GLEW_VERSION_3_2) = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_3_1) = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_3_0) = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_2_0) = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_1_5) = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_1_4) = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_1_3) = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_1_2_1) = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_1_2_1) = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
|
||||
CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
|
||||
}
|
||||
@@ -12099,7 +12134,7 @@ static PFNWGLGETEXTENSIONSSTRINGARBPROC _wglewGetExtensionsStringARB = NULL;
|
||||
static PFNWGLGETEXTENSIONSSTRINGEXTPROC _wglewGetExtensionsStringEXT = NULL;
|
||||
|
||||
GLboolean GLEWAPIENTRY wglewGetExtension (const char* name)
|
||||
{
|
||||
{
|
||||
const GLubyte* start;
|
||||
const GLubyte* end;
|
||||
if (_wglewGetExtensionsStringARB == NULL)
|
||||
@@ -12326,6 +12361,24 @@ GLenum GLEWAPIENTRY wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
|
||||
|
||||
#elif !defined(__ANDROID__) && !defined(__native_client__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
|
||||
|
||||
|
||||
#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
PFNGLXGETPROCADDRESSARBPROC __glewXGetProcAddressARB = NULL;
|
||||
PFNGLXQUERYEXTENSION __glewXQueryExtension=NULL;
|
||||
PFNGLXQUERYVERSION __glewXQueryVersion=NULL;
|
||||
PFNGLXGETCONFIG __glewXGetConfig=NULL;
|
||||
PFNGLXCHOOSEVISUAL __glewXChooseVisual=NULL;
|
||||
PFNGLXCREATECONTEXT __glewXCreateContext=NULL;
|
||||
PFNGLXDESTROYCONTEXT __glewXDestroyContext=NULL;
|
||||
PFNGLXISDIRECT __glewXIsDirect=NULL;
|
||||
PFNGLXMAKECURRENT __glewXMakeCurrent=NULL;
|
||||
PFNGLXQUERYEXTENSIONSSTRING __glewXQueryExtensionsString=NULL;
|
||||
PFNGLXGETCLIENTSTRING __glewXGetClientString=NULL;
|
||||
PFNGLXQUERYSERVERSTRING __glewXQueryServerString=NULL;
|
||||
PFNGLXSWAPBUFFERS __glewXSwapBuffers=NULL;
|
||||
|
||||
#endif//GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
|
||||
PFNGLXGETCURRENTDISPLAYPROC __glewXGetCurrentDisplay = NULL;
|
||||
|
||||
PFNGLXCHOOSEFBCONFIGPROC __glewXChooseFBConfig = NULL;
|
||||
@@ -13164,7 +13217,7 @@ static GLboolean _glewInit_GLX_SUN_video_resize (GLXEW_CONTEXT_ARG_DEF_INIT)
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
GLboolean glxewGetExtension (const char* name)
|
||||
{
|
||||
{
|
||||
const GLubyte* start;
|
||||
const GLubyte* end;
|
||||
|
||||
@@ -13476,6 +13529,34 @@ extern GLenum GLEWAPIENTRY wglewContextInit (void);
|
||||
extern GLenum GLEWAPIENTRY glxewContextInit (void);
|
||||
#endif /* _WIN32 */
|
||||
|
||||
#ifdef GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
GLboolean GLEWAPIENTRY glewXInit(void)
|
||||
{
|
||||
GLboolean r = GL_FALSE;
|
||||
r = ((glXGetProcAddressARB = (PFNGLXGETPROCADDRESSARBPROC)dlglXGetProcAddressARB((const GLubyte*)"glXGetProcAddressARB")) == NULL) || r;
|
||||
r = ((glXQueryExtension = (PFNGLXQUERYEXTENSION)dlglXGetProcAddressARB((const GLubyte*)"glXQueryExtension")) == NULL) || r;
|
||||
r = ((glXQueryVersion = (PFNGLXQUERYVERSION)dlglXGetProcAddressARB((const GLubyte*)"glXQueryVersion")) == NULL) || r;
|
||||
r = ((glXGetConfig = (PFNGLXGETCONFIG)dlglXGetProcAddressARB((const GLubyte*)"glXGetConfig")) == NULL) || r;
|
||||
r = ((glXChooseVisual = (PFNGLXCHOOSEVISUAL)dlglXGetProcAddressARB((const GLubyte*)"glXChooseVisual")) == NULL) || r;
|
||||
r = ((glXCreateContext = (PFNGLXCREATECONTEXT)dlglXGetProcAddressARB((const GLubyte*)"glXCreateContext")) == NULL) || r;
|
||||
r = ((glXDestroyContext = (PFNGLXDESTROYCONTEXT)dlglXGetProcAddressARB((const GLubyte*)"glXDestroyContext")) == NULL) || r;
|
||||
r = ((glXDestroyContext = (PFNGLXDESTROYCONTEXT)dlglXGetProcAddressARB((const GLubyte*)"glXDestroyContext")) == NULL) || r;
|
||||
r = ((glXIsDirect = (PFNGLXISDIRECT)dlglXGetProcAddressARB((const GLubyte*)"glXIsDirect")) == NULL) || r;
|
||||
r = ((glXMakeCurrent = (PFNGLXMAKECURRENT)dlglXGetProcAddressARB((const GLubyte*)"glXMakeCurrent")) == NULL) || r;
|
||||
r = ((glXQueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRING)dlglXGetProcAddressARB((const GLubyte*)"glXQueryExtensionsString")) == NULL) || r;
|
||||
r = ((glXGetClientString = (PFNGLXGETCLIENTSTRING)dlglXGetProcAddressARB((const GLubyte*)"glXGetClientString")) == NULL) || r;
|
||||
r = ((glXQueryServerString = (PFNGLXQUERYSERVERSTRING)dlglXGetProcAddressARB((const GLubyte*)"glXQueryServerString")) == NULL) || r;
|
||||
r = ((glXSwapBuffers = (PFNGLXSWAPBUFFERS)dlglXGetProcAddressARB((const GLubyte*)"glXSwapBuffers")) == NULL) || r;
|
||||
//glxewContextInit();
|
||||
_glewInit_GLX_VERSION_1_3();
|
||||
|
||||
if (r==0)
|
||||
{
|
||||
printf("glewXInit dynamically loaded using dlopen/dlsym OK\n");
|
||||
}
|
||||
return r;
|
||||
}
|
||||
#endif //GLEW_DYNAMIC_LOAD_ALL_GLX_FUNCTIONS
|
||||
|
||||
#ifdef GLEW_INIT_OPENGL11_FUNCTIONS
|
||||
|
||||
@@ -14160,6 +14241,10 @@ GLboolean GLEWAPIENTRY glewOpenGL11Init(void)
|
||||
r = ((glVertexPointer = (PFNGLVERTEXPOINTERPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glVertexPointer"))) == NULL) || r;
|
||||
r = ((glViewport = (PFNGLVIEWPORTPROC)glewGetProcAddress(fqn_from_convention(glew_convention, "glViewport"))) == NULL) || r;
|
||||
|
||||
if (r==0)
|
||||
{
|
||||
printf("glewOpenGL11Init dynamically loaded using dlopen/dlsym OK\n");
|
||||
}
|
||||
return r;
|
||||
}
|
||||
#endif //GLEW_INIT_OPENGL11_FUNCTIONS
|
||||
|
||||
Reference in New Issue
Block a user