From d07382b1c19d46072ea1a16efb94bab5f78d1acb Mon Sep 17 00:00:00 2001 From: Eleni Maria Stea Date: Fri, 8 Mar 2013 18:05:12 +0200 Subject: [PATCH] added support for: 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 | 122 +++++++++++++++++++++++++++++++++++++++++++------ tests/glinfo/Makefile | 2 +- tests/glinfo/glinfo.c | 37 +++++++++++++++ 3 files changed, 146 insertions(+), 15 deletions(-) diff --git a/src/gliar.c b/src/gliar.c index b291af2..e83d5cd 100644 --- a/src/gliar.c +++ b/src/gliar.c @@ -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); + +} diff --git a/tests/glinfo/Makefile b/tests/glinfo/Makefile index 9b96a9a..a460731 100644 --- a/tests/glinfo/Makefile +++ b/tests/glinfo/Makefile @@ -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) diff --git a/tests/glinfo/glinfo.c b/tests/glinfo/glinfo.c index e272e84..e24c798 100644 --- a/tests/glinfo/glinfo.c +++ b/tests/glinfo/glinfo.c @@ -21,9 +21,12 @@ Author: Eleni Maria Stea */ #include +#include #include #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; } -- 1.7.10.4