X-Git-Url: https://eleni.mutantstargoat.com/git/?p=libgliar;a=blobdiff_plain;f=src%2Fgliar.c;h=5fe944d02fdec3bc506f0a3cfb23ca0f209f23b4;hp=1173a43bceae6e455ad512c2462b394a8a965407;hb=42163e269cceab08031b949a2f7e2c92ca081cbb;hpb=5f0b3ca4e21db7b0f0de939e956bd5f34fec3746 diff --git a/src/gliar.c b/src/gliar.c index 1173a43..5fe944d 100644 --- a/src/gliar.c +++ b/src/gliar.c @@ -23,21 +23,28 @@ Author: Eleni Maria Stea #include #include #include +#include #include #include #include #include #include "cfg.h" +#ifndef GL_NUM_SHADING_LANGUAGE_VERSIONS +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#endif + +static int init_valid_extensions(void); + static int done_init; static const GLubyte* (*gl_get_string)(GLenum); -/*static const GLubyte* (*gl_get_stringi)(GLenum, GLuint); +static const GLubyte* (*gl_get_stringi)(GLenum, GLuint); +static const void* (*gl_get_integerv)(GLenum, GLint*); -static const void* (*gl_get_booleanv)(GLenum, GLboolean*); +/*static const void* (*gl_get_booleanv)(GLenum, GLboolean*); static const void* (*gl_get_doublev)(GLenum, GLdouble*); static const void* (*gl_get_floatv)(GLenum, GLfloat*); -static const void* (*gl_get_integerv)(GLenum, GLint*); static const void* (*gl_get_integer64v)(GLenum, GLint64*); static const void* (*gl_get_booleani_v)(GLenum, GLuint, GLboolean*); @@ -48,12 +55,32 @@ static const void* (*gl_get_integer64i_v)(GLenum, GLuint, GLint64*);*/ static struct cfgopt *cfglist; + static int init(void) { if(done_init) { return 0; } + gl_get_string = dlsym(RTLD_NEXT, "glGetString"); + gl_get_stringi = dlsym(RTLD_NEXT, "glGetStringi"); + gl_get_integerv = dlsym(RTLD_NEXT, "glGetIntegerv"); + + /*gl_get_booleanv = dlsym(RTLD_NEXT, "glGetBooleanv"); + gl_get_doublev = dlsym(RTLD_NEXT, "glGetDoublev"); + gl_get_floatv = dlsym(RTLD_NEXT, "glGetFloatv"); + gl_get_integer64v = dlsym(RTLD_NEXT, "glGetInteger64v"); + + gl_get_booleani_v = dlsym(RTLD_NEXT, "glGetBooleani_v"); + gl_get_doublei_v = dlsym(RTLD_NEXT, "glGetDoublei_v"); + gl_get_floati_v = dlsym(RTLD_NEXT, "glGetFloati_v"); + gl_get_integeri_v = dlsym(RTLD_NEXT, "glGetIntegeri_v"); + gl_get_integer64i_v = dlsym(RTLD_NEXT, "glGetInteger64i_v");*/ + + if(init_valid_extensions() == -1) { + fprintf(stderr, "GLIAR: failed to initialize the valid extension list, might end up with unavailable extensions!\n"); + } + if(!(cfglist = gliar_load_cfg("gliar.conf"))) { struct passwd *pw; char *homedir, *path; @@ -72,22 +99,58 @@ static int init(void) } } - gl_get_string = dlsym(RTLD_NEXT, "glGetString"); -/* gl_get_stringi = dlsym(RTLD_NEXT, "glGetStringi"); + done_init = 1; + return 0; +} - gl_get_booleanv = dlsym(RTLD_NEXT, "glGetBooleanv"); - gl_get_doublev = dlsym(RTLD_NEXT, "glGetDoublev"); - gl_get_floatv = dlsym(RTLD_NEXT, "glGetFloatv"); - gl_get_integerv = dlsym(RTLD_NEXT, "glGetIntegerv"); - gl_get_integer64v = dlsym(RTLD_NEXT, "glGetInteger64v"); +static int init_valid_extensions(void) +{ + int i, num_ext, prev_space = 0; + const char *gl_ext_str; + char *ext_str, *tok, *ptr, **ext_table; - gl_get_booleani_v = dlsym(RTLD_NEXT, "glGetBooleani_v"); - gl_get_doublei_v = dlsym(RTLD_NEXT, "glGetDoublei_v"); - gl_get_floati_v = dlsym(RTLD_NEXT, "glGetFloati_v"); - gl_get_integeri_v = dlsym(RTLD_NEXT, "glGetIntegeri_v"); - gl_get_integer64i_v = dlsym(RTLD_NEXT, "glGetInteger64i_v");*/ + /* initialize the list of valid extensions */ + if(!(gl_ext_str = (const char*)gl_get_string(GL_EXTENSIONS))) { + return -1; + } - done_init = 1; + if(!(ext_str = malloc(strlen(gl_ext_str) + 1))) { + return -1; + } + strcpy(ext_str, gl_ext_str); + + /* count the extensions */ + num_ext = 0; + ptr = ext_str; + while(*ptr) { + if(isspace(*ptr) && prev_space == 0) { + prev_space = 1; + num_ext++; + } else { + prev_space = 0; + } + ptr++; + } + + /* allocate extension table */ + if(!(ext_table = malloc(num_ext * sizeof *ext_table))) { + free(ext_str); + return -1; + } + + /* setup the ext_table slots to point to the start of each substring (extension) */ + for(i=0; istr_val[index]; + } + + return gl_get_stringi(name, index); +} + +void glGetIntegerv(GLenum name, GLint *val) +{ + char *key; + const struct cfgopt *option; + + init(); + + switch(name) { + case GL_NUM_EXTENSIONS: + if(1) { + key = "extensions"; + } else { + case GL_NUM_SHADING_LANGUAGE_VERSIONS: + key = "sl version"; + } + if(key && (option = gliar_find_opt(cfglist, key))) { + *val = option->str_count; + return; + } + break; + + case GL_MAX_TEXTURE_UNITS: + key = "max texture units"; + break; + + case GL_MAX_TEXTURE_SIZE: + key = "max texture size"; + break; + + default: + key = 0; + } + + if(key && (option = gliar_find_opt(cfglist, key)) && option->type == GLIAR_NUMBER) { + *val = option->num_val; + return; + } + + gl_get_integerv(name, val); +}