e5543a658f
Instead of including GL/gl.h directly it now includes cogl/cogl.h instead which should include the right GL header. Instead of using dlopen to specifically open libGL it now tries to use dlsym with RTLD_NEXT. This requires defining _GNU_SOURCE on GNU systems. If RTLD_NEXT is not available it will try passing NULL which is unlikely to work but it will at least catch the case where it returns the wrapper version of glGetString to prevent infinite recursion. This should hopefully make it work on OS X where the name of the header and library are different (although this is currently untested).
92 lines
1.9 KiB
C
92 lines
1.9 KiB
C
/*
|
|
* This file can be build as a shared library and then used as an
|
|
* LD_PRELOAD to fake a system where NPOTs is not supported. It simply
|
|
* overrides glGetString and removes the extension strings.
|
|
*/
|
|
|
|
/* This is just included to get the right GL header */
|
|
#include <cogl/cogl.h>
|
|
|
|
#include <dlfcn.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <ctype.h>
|
|
|
|
/* If RTLD_NEXT isn't available then try just using NULL */
|
|
#ifdef RTLD_NEXT
|
|
#define LIB_HANDLE RTLD_NEXT
|
|
#else
|
|
#define LIB_HANDLE NULL
|
|
#endif
|
|
|
|
typedef const GLubyte * (* GetStringFunc) (GLenum name);
|
|
|
|
static const char * const bad_strings[]
|
|
= { "GL_ARB_texture_non_power_of_two",
|
|
"GL_ARB_texture_rectangle",
|
|
"GL_EXT_texture_rectangle",
|
|
NULL };
|
|
|
|
const GLubyte *
|
|
glGetString (GLenum name)
|
|
{
|
|
const GLubyte *ret = NULL;
|
|
static GetStringFunc func = NULL;
|
|
static GLubyte *extensions = NULL;
|
|
|
|
if (func == NULL
|
|
&& (func = (GetStringFunc) dlsym (LIB_HANDLE, "glGetString")) == NULL)
|
|
fprintf (stderr, "dlsym: %s\n", dlerror ());
|
|
else if (func == glGetString)
|
|
fprintf (stderr, "dlsym returned the wrapper of glGetString\n");
|
|
else
|
|
{
|
|
ret = (* func) (name);
|
|
|
|
if (name == GL_EXTENSIONS)
|
|
{
|
|
if (extensions == NULL)
|
|
{
|
|
if ((extensions = (GLubyte *) strdup ((char *) ret)) == NULL)
|
|
fprintf (stderr, "strdup: %s\n", strerror (errno));
|
|
else
|
|
{
|
|
GLubyte *dst = extensions, *src = extensions;
|
|
|
|
while (1)
|
|
{
|
|
const char * const *str = bad_strings;
|
|
GLubyte *end;
|
|
|
|
while (isspace (*src))
|
|
*(dst++) = *(src++);
|
|
|
|
if (*src == 0)
|
|
break;
|
|
|
|
for (end = src + 1; *end && !isspace (*end); end++);
|
|
|
|
while (*str && strncmp ((char *) src, *str, end - src))
|
|
str++;
|
|
|
|
if (*str == NULL)
|
|
{
|
|
memcpy (dst, src, end - src);
|
|
dst += end - src;
|
|
}
|
|
|
|
src = end;
|
|
}
|
|
|
|
*dst = '\0';
|
|
}
|
|
}
|
|
|
|
ret = extensions;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|