1
0
Fork 0
mutter-performance-source/tests/tools/disable-npots.c
Neil Roberts e5543a658f Make libdisable-npots a bit more portable
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).
2009-01-05 17:11:44 +00:00

91 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;
}