added support for:
authorEleni Maria Stea <elene.mst@gmail.com>
Fri, 8 Mar 2013 16:05:12 +0000 (18:05 +0200)
committerEleni Maria Stea <elene.mst@gmail.com>
Fri, 8 Mar 2013 16:05:12 +0000 (18:05 +0200)
glProgramivARB:
GL_MAX_PROGRAM_INSTRUCTIONS_ARB
GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB
GL_MAX_PROGRAM_TEMPORARIES_ARB
GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB
GL_MAX_PROGRAM_PARAMETERS_ARB
GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB
GL_MAX_PROGRAM_ATTRIBS_ARB
GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB
GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB
GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB
GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB
GL_MAX_PROGRAM_ENV_PARAMETERS_ARB
GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB
GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB
GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB
GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB

the problem: the glProgramiv uses dynamic loading so my gliar.conf won't
fake anything! BUT! I can override the dlsym so that my functions are
loaded :) and when i need to call the function dlsym myself I ll just call
the internal function that dlsym calls (I have to check which function is
this in glibc :)

src/gliar.c
tests/glinfo/Makefile
tests/glinfo/glinfo.c

index b291af2..e83d5cd 100644 (file)
@@ -40,13 +40,13 @@ static int done_init;
 
 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 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*);
@@ -55,7 +55,6 @@ static const void* (*gl_get_integer64i_v)(GLenum, GLuint, GLint64*);*/
 
 static struct cfgopt *cfglist;
 
-
 static int init(void)
 {
        if(done_init) {
@@ -65,17 +64,7 @@ static int init(void)
        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");
 
        if(init_valid_extensions() == -1) {
                fprintf(stderr, "GLIAR: failed to initialize the valid extension list, might end up with unavailable extensions!\n");
@@ -161,6 +150,11 @@ const GLubyte *glGetString(GLenum name)
 
        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";
@@ -200,6 +194,11 @@ const GLubyte *glGetStringi(GLenum name, GLuint index)
 
        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";
@@ -227,6 +226,11 @@ void glGetIntegerv(GLenum name, GLint *val)
 
        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) {
@@ -312,3 +316,93 @@ void glGetIntegerv(GLenum name, GLint *val)
 
        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 && (option = gliar_find_opt(cfglist, key)) && option->type == GLIAR_NUMBER) {
+               *params = option->num_val;
+               return;
+       }
+
+       gl_get_programiv(program, pname, params);
+
+}
index 9b96a9a..a460731 100644 (file)
@@ -2,7 +2,7 @@ obj = glinfo.o
 bin = glinfo
 
 CFLAGS = -pedantic -Wall -g
-LDFLAGS = -lGL -lglut
+LDFLAGS = -lGL -lglut -lGLEW
 
 $(bin): $(obj)
        $(CC) -o $@ $(obj) $(LDFLAGS)
index e272e84..e24c798 100644 (file)
@@ -21,9 +21,12 @@ Author: Eleni Maria Stea <elene.mst@gmail.com>
 */
 
 #include <stdio.h>
+#include <GL/glew.h>
 #include <GL/glut.h>
 
 #define GET_INTEGER(x) (glGetIntegerv(x, &val), val)
+#define GET_PROGRAMIV_ARB_V(x) (glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, x, &val), val)
+#define GET_PROGRAMIV_ARB_F(x) (glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, x, &val), val)
 
 int main(int argc, char **argv)
 {
@@ -32,10 +35,13 @@ int main(int argc, char **argv)
        glutInit(&argc, argv);
        glutCreateWindow("glinfo");
 
+       glewInit();
+
        printf("vendor: %s\n", glGetString(GL_VENDOR));
        printf("renderer: %s\n", glGetString(GL_RENDERER));
        printf("version: %s\n", glGetString(GL_VERSION));
        printf("shading language version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
+
        printf("major version: %d\n", GET_INTEGER(GL_MAJOR_VERSION));
        printf("minor version: %d\n", GET_INTEGER(GL_MINOR_VERSION));
        printf("max texture units: %d\n", GET_INTEGER(GL_MAX_TEXTURE_UNITS));
@@ -51,5 +57,36 @@ int main(int argc, char **argv)
        printf("max varying vectors: %d\n", GET_INTEGER(GL_MAX_VARYING_VECTORS));
        printf("max color attachments: %d\n", GET_INTEGER(GL_MAX_COLOR_ATTACHMENTS_EXT));
        printf("max renderbuffer size ext: %d\n", GET_INTEGER(GL_MAX_RENDERBUFFER_SIZE_EXT));
+       
+       printf("V max program instructions arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_INSTRUCTIONS_ARB));
+       printf("V max program native instructions arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB));
+       printf("V max program temporaries arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_TEMPORARIES_ARB));
+       printf("V max program native temporaries arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB));
+       printf("V max program program parameters arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_PARAMETERS_ARB));
+       printf("V max program native parameters arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB));
+       printf("V max program attribs arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_ATTRIBS_ARB));
+       printf("V max program native attribs arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB));
+       printf("V max program address registers arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB));
+       printf("V max program native address registers arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB));
+       printf("V max program local parameters arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB));
+       printf("V max program env parameters arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_ENV_PARAMETERS_ARB));
+       printf("V max program alu instructions arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB));
+       printf("V max program native alu instructions arb: %d\n", GET_PROGRAMIV_ARB_V(GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB));
+       
+       printf("F max program instructions arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_INSTRUCTIONS_ARB));
+       printf("F max program native instructions arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB));
+       printf("F max program temporaries arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_TEMPORARIES_ARB));
+       printf("F max program native temporaries arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB));
+       printf("F max program program parameters arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_PARAMETERS_ARB));
+       printf("F max program native parameters arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB));
+       printf("F max program attribs arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_ATTRIBS_ARB));
+       printf("F max program native attribs arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB));
+       printf("F max program address registers arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB));
+       printf("F max program native address registers arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB));
+       printf("F max program local parameters arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB));
+       printf("F max program env parameters arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_ENV_PARAMETERS_ARB));
+       printf("F max program alu instructions arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB));
+       printf("F max program native alu instructions arb: %d\n", GET_PROGRAMIV_ARB_F(GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB));
+
        return 0;
 }