static const GLubyte* (*gl_get_string)(GLenum);
static const GLubyte* (*gl_get_stringi)(GLenum, GLuint);
-static const void* (*gl_get_integerv)(GLenum, GLint*);
+static void (*gl_get_integerv)(GLenum, GLint*);
+static void (*gl_get_programiv)(GLuint, GLenum, GLint*);
+static void *(*glx_get_proc_address)(const unsigned char*);
/*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_integer64v)(GLenum, GLint64*);
-
static const void* (*gl_get_booleani_v)(GLenum, GLuint, GLboolean*);
static const void* (*gl_get_doublei_v)(GLenum, GLuint, GLdouble*);
static const void* (*gl_get_floati_v)(GLenum, GLuint, GLfloat*);
static struct cfgopt *cfglist;
-
static int init(void)
{
if(done_init) {
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");*/
+ gl_get_programiv = dlsym(RTLD_NEXT, "glGetProgramivARB");
+ glx_get_proc_address = dlsym(RTLD_NEXT, "glXGetProcAddress");
if(init_valid_extensions() == -1) {
fprintf(stderr, "GLIAR: failed to initialize the valid extension list, might end up with unavailable extensions!\n");
init();
+ if(!gl_get_string) {
+ fprintf(stderr, "Unable to fake the %s function. It is not supported by your OpenGL implementation.\n", __func__);
+ return 0;
+ }
+
switch(name) {
case GL_VENDOR:
key = "vendor";
init();
+ if(!gl_get_stringi) {
+ fprintf(stderr, "Unable to fake the %s function. It is not supported by your OpenGL implementation.\n", __func__);
+ return 0;
+ }
+
switch(name) {
case GL_EXTENSIONS:
key = "extensions";
init();
+ if(!gl_get_integerv) {
+ fprintf(stderr, "Unable to fake the %s function. It is not supported by your OpenGL implementation.\n", __func__);
+ return;
+ }
+
switch(name) {
case GL_NUM_EXTENSIONS:
if(1) {
gl_get_integerv(name, val);
}
+
+void glGetProgramivARB(GLuint program, GLenum pname, GLint *params)
+{
+ char *key;
+ const struct cfgopt *option;
+
+ init();
+
+ if(!gl_get_programiv) {
+ fprintf(stderr, "Unable to fake the %s function. It is not supported by your OpenGL implementation.\n", __func__);
+ return;
+ }
+
+ switch(pname) {
+ case GL_MAX_PROGRAM_INSTRUCTIONS_ARB:
+ key = "max program instructions arb";
+ break;
+
+ case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
+ key = "max program native instructions arb";
+ break;
+
+ case GL_MAX_PROGRAM_TEMPORARIES_ARB:
+ key = "max program temporaries arb";
+ break;
+
+ case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB:
+ key = "max program native temporaries arb";
+ break;
+
+ case GL_MAX_PROGRAM_PARAMETERS_ARB:
+ key = "max program parameters arb";
+ break;
+
+ case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB:
+ key = "max program native parameters arb";
+ break;
+
+ case GL_MAX_PROGRAM_ATTRIBS_ARB:
+ key = "max program attribs arb";
+ break;
+
+ case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB:
+ key = "max program native attribs arb";
+ break;
+
+ case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB:
+ key = "max program address registers arb";
+ break;
+
+ case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
+ key = "max program native address registers arb";
+ break;
+
+ case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB:
+ key = "max program local parameters arb";
+ break;
+
+ case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB:
+ key = "max program env parameters arb";
+ break;
+
+ case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB:
+ key = "max program alu instructions arb";
+ break;
+
+ case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
+ key = "max program native alu instructions arb";
+ break;
+
+ case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB:
+ key = "max program tex instructions arb";
+ break;
+
+ case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
+ key = "max program native tex instructions arb";
+ break;
+
+ default:
+ key = 0;
+ }
+
+ if(key) {
+ char buf[256];
+ if(program == GL_VERTEX_PROGRAM_ARB) {
+ sprintf(buf, "v %s", key);
+ }
+ else if(program == GL_FRAGMENT_PROGRAM_ARB) {
+ sprintf(buf, "f %s", key);
+ }
+ key = buf;
+
+ if((option = gliar_find_opt(cfglist, key)) && option->type == GLIAR_NUMBER) {
+ *params = option->num_val;
+ return;
+ }
+ }
+
+ gl_get_programiv(program, pname, params);
+
+}
+
+void *glXGetProcAddress(const unsigned char *procname)
+{
+ if(!glx_get_proc_address) {
+ glx_get_proc_address = dlsym(RTLD_NEXT, "glXGetProcAddress");
+ if(!glx_get_proc_address) {
+ return 0;
+ }
+ }
+
+ if(!strcmp((char*)procname, "glGetProgramivARB")) {
+ char *overr_name = "gl_get_programiv";
+ return glx_get_proc_address((unsigned char*)overr_name);
+ }
+
+ return glx_get_proc_address(procname);
+}