/* * Parse gl.h et glx.h to auto-generate source code * * Copyright (c) 2006,2007 Even Rouault * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* gcc -g parse_gl_h.c -o parse_gl_h && ./parse_gl_h */ #include #include #include #include int isExtByName(const char* name) { return (strstr(name, "ARB") != NULL) || (strstr(name, "IBM") != NULL) || (strstr(name, "EXT") != NULL) || (strstr(name, "ATI") != NULL) || (strstr(name, "NV") != NULL) || (strstr(name, "MESA") != NULL) || (strstr(name, "APPLE") != NULL) || (strstr(name, "SUN") != NULL) || (strstr(name, "SGI") != NULL); } char* get_arg_type(char* s) { while(*s == ' ' || *s == '\t') s++; char* n = s; char* c = strstr(n, "const"); if (c) n += 6; char* t = strstr(n, " "); if (t) { if (t[1] == '*') t += 2; t[0] = 0; char* ori = t; t = strstr(t+1, "["); if (t) { memmove(ori, t, strlen(t)); strstr(ori, "]")[1] = 0; } } return strdup(s); } typedef struct { char* type; char* name; int nargs; char** args; int ok; int just_for_server_side; int has_out_parameters; int isExt; } FuncDesc; int isExt(FuncDesc* func) { return func->isExt; } char* get_type_string(char* type) { if (strstr(type, "[16]")) { if (strstr(type, "float")) return ("TYPE_16FLOAT"); else if (strstr(type, "double")) return ("TYPE_16DOUBLE"); else { printf("inconnu %s\n", type); exit(-1); } } else if (strstr(type, "[128]") && strstr(type, "GLubyte")) return strstr(type, "const") ? "TYPE_128UCHAR" : "TYPE_OUT_128UCHAR"; else if (strstr(type, "const GLvoid *")) return "TYPE_ARRAY_VOID"; else if (strstr(type, "const GLchar *") || strstr(type, "const GLcharARB *")) return "TYPE_NULL_TERMINATED_STRING"; else if (strstr(type, "const GLbyte *")) return "TYPE_ARRAY_SIGNED_CHAR"; else if (strstr(type, "const GLubyte *")) return "TYPE_ARRAY_UNSIGNED_CHAR"; else if (strstr(type, "const GLshort *")) return "TYPE_ARRAY_SHORT"; else if (strstr(type, "const GLushort *") || strstr(type, "const GLhalfNV *")) return "TYPE_ARRAY_UNSIGNED_SHORT"; else if (strstr(type, "const GLint *")) return "TYPE_ARRAY_INT"; else if (strstr(type, "const GLuint *") || strstr(type, "const GLenum *")) return "TYPE_ARRAY_UNSIGNED_INT"; else if (strstr(type, "const GLfloat *") || strstr(type, "const GLclampf *")) return "TYPE_ARRAY_FLOAT"; else if (strstr(type, "const GLdouble *")) return "TYPE_ARRAY_DOUBLE"; else if (strstr(type, "GLvoid *")) return "TYPE_OUT_ARRAY_VOID"; else if (strstr(type, "GLboolean *") || strstr(type, "GLubyte *")) return "TYPE_OUT_ARRAY_UNSIGNED_CHAR"; else if (strstr(type, "GLcharARB *") || strstr(type, "GLchar *")) return "TYPE_OUT_ARRAY_CHAR"; else if (strstr(type, "GLshort *")) return "TYPE_OUT_ARRAY_SHORT"; else if (strstr(type, "GLushort *")) return "TYPE_OUT_ARRAY_UNSIGNED_SHORT"; else if (strstr(type, "GLint *")|| strstr(type, "GLsizei *")) return "TYPE_OUT_ARRAY_INT"; else if (strstr(type, "GLuint *") || strstr(type, "GLenum *") || strstr(type, "GLhandleARB *")) return "TYPE_OUT_ARRAY_UNSIGNED_INT"; else if (strstr(type, "GLfloat *")) return "TYPE_OUT_ARRAY_FLOAT"; else if (strstr(type, "GLdouble *")) return "TYPE_OUT_ARRAY_DOUBLE"; else if (strcmp(type, "void") == 0) return("TYPE_NONE"); else if (strcmp(type, "GLbyte") == 0) return("TYPE_CHAR"); else if (strcmp(type, "GLubyte") == 0 || strcmp(type, "GLboolean") == 0) return("TYPE_UNSIGNED_CHAR"); else if (strcmp(type, "GLshort") == 0) return("TYPE_SHORT"); else if (strcmp(type, "GLushort") == 0 || strcmp(type, "GLhalfNV") == 0) return("TYPE_UNSIGNED_SHORT"); else if (strcmp(type, "GLint") == 0 || strcmp(type, "GLsizei") == 0 || strcmp(type, "GLintptr") == 0 || strcmp(type, "GLsizeiptr") == 0 || strcmp(type, "GLintptrARB") == 0 || strcmp(type, "GLsizeiptrARB") == 0) return("TYPE_INT"); else if (strcmp(type, "GLenum") == 0 || strcmp(type, "GLuint") == 0 || strcmp(type, "GLhandleARB") == 0 || strcmp(type, "GLbitfield") == 0) return("TYPE_UNSIGNED_INT"); else if (strcmp(type, "GLfloat") == 0 || strcmp(type, "GLclampf") == 0) return("TYPE_FLOAT"); else if (strcmp(type, "GLdouble") == 0 || strcmp(type, "GLclampd") == 0) return("TYPE_DOUBLE"); else { printf("inconnu %s\n", type); exit(-1); } } typedef struct { char* letter; char* signature_type_name; char* gl_c_type_name; char* c_type_name; } ForIsKnownArgVector; #define N_ELEMENTS(x) (sizeof(x)/sizeof(x[0])) #define N_FIELDS_IN_ARG_VECTOR 4 typedef struct { char* func_name; char* signature_type_name; } KnownLastArgFunc; static KnownLastArgFunc knownLastArgFuncs[] = { {"glFogCoordfv", "TYPE_1FLOAT"}, {"glFogCoorddv", "TYPE_1DOUBLE"}, {"glFogCoordfvEXT", "TYPE_1FLOAT"}, {"glFogCoorddvEXT", "TYPE_1DOUBLE"}, {"glFogCoordhvNV", "TYPE_1USHORT"}, {"glGetFenceivNV", "TYPE_OUT_1INT"}, {"glGetTexLevelParameteriv", "TYPE_OUT_1INT" }, {"glGetTexLevelParameterfv", "TYPE_OUT_1FLOAT" }, {"glGetRenderbufferParameterivEXT", "TYPE_OUT_1INT"}, {"glGetFramebufferAttachmentParameterivEXT", "TYPE_OUT_1INT"}, {"glGetFinalCombinerInputParameterivNV", "TYPE_OUT_1INT"}, {"glGetCombinerOutputParameterivNV", "TYPE_OUT_1INT"}, {"glGetCombinerInputParameterivNV", "TYPE_OUT_1INT"}, {"glGetOcclusionQueryivNV", "TYPE_OUT_1INT"}, {"glGetOcclusionQueryuivNV", "TYPE_OUT_1UINT"}, {"glGetObjectParameterivARB", "TYPE_OUT_1INT"}, {"glGetQueryivARB", "TYPE_OUT_1INT"}, {"glGetQueryiv", "TYPE_OUT_1INT"}, {"glGetQueryObjectivARB", "TYPE_OUT_1INT"}, {"glGetQueryObjectiv", "TYPE_OUT_1INT"}, {"glGetQueryObjectuivARB", "TYPE_OUT_1UINT"}, {"glGetQueryObjectuiv", "TYPE_OUT_1UINT"}, {"glGetProgramivARB", "TYPE_OUT_1INT"}, {"glGetProgramiv", "TYPE_OUT_1INT"}, {"glGetProgramivNV", "TYPE_OUT_1INT"}, {"glGetShaderiv", "TYPE_OUT_1INT"}, {"glCombinerParameterfvNV", "TYPE_1FLOAT"}, {"glCombinerParameterivNV", "TYPE_1INT"}, {"glGetFinalCombinerInputParameterfvNV", "TYPE_OUT_1FLOAT"}, {"glGetCombinerOutputParameterfvNV", "TYPE_OUT_1FLOAT"}, {"glGetCombinerInputParameterfvNV", "TYPE_OUT_1FLOAT"}, {"glGetObjectParameterfvARB", "TYPE_OUT_1FLOAT"}, {"glCombinerStageParameterfvNV", "TYPE_4FLOAT"}, {"glGetCombinerStageParameterfvNV", "TYPE_OUT_4FLOAT"}, {"glTexBumpParameterivATI", "TYPE_1INT"}, {"glTexBumpParameterfvATI", "TYPE_1FLOAT"}, {"glGetTexBumpParameterivATI", "TYPE_OUT_1INT"}, {"glGetTexBumpParameterfvATI", "TYPE_OUT_1FLOAT"}, {"glGetProgramLocalParameterfvARB", "TYPE_OUT_4FLOAT"}, {"glGetProgramLocalParameterdvARB", "TYPE_OUT_4DOUBLE"}, {"glGetProgramEnvParameterfvARB", "TYPE_OUT_4FLOAT"}, {"glGetProgramEnvParameterdvARB", "TYPE_OUT_4DOUBLE"}, {"glGetProgramLocalParameterIivNV", "TYPE_OUT_1INT"}, {"glGetProgramLocalParameterIuivNV", "TYPE_OUT_1UINT"}, {"glGetProgramEnvParameterIivNV", "TYPE_OUT_1INT"}, {"glGetProgramEnvParameterIuivNV", "TYPE_OUT_1UINT"}, {"glGetProgramParameterfvNV", "TYPE_OUT_4FLOAT"}, {"glGetProgramParameterdvNV", "TYPE_OUT_4DOUBLE"}, {"glGetProgramNamedParameterfvNV", "TYPE_OUT_4FLOAT"}, {"glGetProgramNamedParameterdvNV", "TYPE_OUT_4DOUBLE"}, {"glCullParameterfvEXT", "TYPE_4FLOAT"}, {"glCullParameterdvEXT", "TYPE_4DOUBLE"}, {"glGetTrackMatrixivNV", "TYPE_OUT_1INT"}, {"glExecuteProgramNV", "TYPE_4FLOAT"}, {"glEdgeFlagv", "TYPE_1UCHAR"}, {"glClipPlane", "TYPE_4DOUBLE"}, {"glGetClipPlane", "TYPE_OUT_4DOUBLE"}, {"glSetFragmentShaderConstantATI", "TYPE_4FLOAT"}, {"glGetObjectBufferfvATI", "TYPE_OUT_1FLOAT"}, {"glGetObjectBufferivATI", "TYPE_OUT_1INT"}, {"glGetArrayObjectfvATI", "TYPE_OUT_1FLOAT"}, {"glGetArrayObjectivATI", "TYPE_OUT_1INT"}, {"glGetVariantArrayObjectfvATI", "TYPE_OUT_1FLOAT"}, {"glGetVariantArrayObjectivATI", "TYPE_OUT_1INT"}, {"glGetVertexAttribArrayObjectfvATI", "TYPE_OUT_1FLOAT"}, {"glGetVertexAttribArrayObjectivATI", "TYPE_OUT_1INT"}, {"glPixelTransformParameterivEXT", "TYPE_1INT"}, {"glPixelTransformParameterfvEXT", "TYPE_1FLOAT"}, {"glGetPixelTransformParameterivEXT", "TYPE_OUT_1INT"}, {"glGetPixelTransformParameterfvEXT", "TYPE_OUT_1FLOAT"}, {"glColorTableParameterfv", "TYPE_4FLOAT"}, {"glColorTableParameteriv", "TYPE_4INT"}, {"glGetColorTableParameterfv", "TYPE_OUT_4FLOAT"}, {"glGetColorTableParameteriv", "TYPE_OUT_4INT"}, {"glColorTableParameterfvEXT", "TYPE_4FLOAT"}, {"glColorTableParameterivEXT", "TYPE_4INT"}, {"glGetColorTableParameterfvEXT", "TYPE_OUT_4FLOAT"}, {"glGetColorTableParameterivEXT", "TYPE_OUT_4INT"}, {"glGetMinmaxParameterfv", "TYPE_OUT_1FLOAT"}, {"glGetMinmaxParameteriv", "TYPE_OUT_1INT"}, {"glGetHistogramParameterfv", "TYPE_OUT_1FLOAT"}, {"glGetHistogramParameteriv", "TYPE_OUT_1INT"}, {"glGetMinmaxParameterfvEXT", "TYPE_OUT_1FLOAT"}, {"glGetMinmaxParameterivEXT", "TYPE_OUT_1INT"}, {"glGetHistogramParameterfvEXT", "TYPE_OUT_1FLOAT"}, {"glGetHistogramParameterivEXT", "TYPE_OUT_1INT"}, /* Not sure at all for the 2 followingo ones ! */ {"glGetBooleanIndexedvEXT", "TYPE_OUT_4UCHAR"}, {"glGetIntegerIndexedvEXT", "TYPE_OUT_4INT"}, {"glReferencePlaneSGIX", "TYPE_4DOUBLE"}, {"glGetTransformFeedbackVaryingNV", "TYPE_OUT_1INT"}, }; int is_known_arg_vector(FuncDesc* desc, char** p_signature_type_name, char** p_c_type_name) { static ForIsKnownArgVector my_tab[] = { { "b", "CHAR", "GLbyte", "signed char" }, { "Boolean", "CHAR", "GLboolean", "unsigned char" }, { "s", "SHORT", "GLshort", "short" }, { "i", "INT", "GLint", "int" }, { "Integer", "INT", "GLint", "int" }, { "ub", "CHAR", "GLubyte", "unsigned char" }, { "h", "SHORT", "GLhalf", "unsigned short" }, { "us", "SHORT", "GLushort", "unsigned short" }, { "ui", "INT", "GLuint", "unsigned int" }, { "Nb", "CHAR", "GLbyte", "signed char" }, { "Ns", "SHORT", "GLshort", "short" }, { "Ni", "INT", "GLint", "int" }, { "Nub", "CHAR", "GLubyte", "unsigned char" }, { "Nus", "SHORT", "GLushort", "unsigned short" }, { "Nui", "INT", "GLuint", "unsigned int" }, { "f", "FLOAT", "GLfloat", "float" }, { "Float", "FLOAT", "GLfloat", "float" }, { "d", "DOUBLE", "GLdouble", "double" }, }; if (desc->nargs == 0) return 0; int i , j; if (strstr(desc->name, "glVertexAttribs") || strstr(desc->name, "glProgramParameters") || strstr(desc->name, "glProgramEnvParameters") || strstr(desc->name, "glProgramLocalParameters") || (strstr(desc->name, "glUniform") && (strstr(desc->name, "iv") || strstr(desc->name, "fv")))) return 0; static char signatures[N_ELEMENTS(my_tab)][N_FIELDS_IN_ARG_VECTOR][20] = {0}; char signature[10]; for(i=0;iname, knownLastArgFuncs[i].func_name) == 0) { if (p_signature_type_name) { *p_signature_type_name = knownLastArgFuncs[i].signature_type_name; } if (p_c_type_name) { if (strstr(knownLastArgFuncs[i].signature_type_name, "FLOAT")) *p_c_type_name = "float"; else if (strstr(knownLastArgFuncs[i].signature_type_name, "DOUBLE")) *p_c_type_name = "double"; else if (strstr(knownLastArgFuncs[i].signature_type_name, "UINT")) *p_c_type_name = "unsigned int"; else if (strstr(knownLastArgFuncs[i].signature_type_name, "INT")) *p_c_type_name = "int"; else if (strstr(knownLastArgFuncs[i].signature_type_name, "USHORT")) *p_c_type_name = "unsigned short"; else if (strstr(knownLastArgFuncs[i].signature_type_name, "SHORT")) *p_c_type_name = "short"; else if (strstr(knownLastArgFuncs[i].signature_type_name, "UCHAR")) *p_c_type_name = "unsigned char"; else if (strstr(knownLastArgFuncs[i].signature_type_name, "CHAR")) *p_c_type_name = "char"; else assert(0); } return 1; } } for(i=0;iname, "glIndex") && strstr(desc->name, "v")) sprintf(signature, "%sv", my_tab[i].letter); else sprintf(signature, "%d%sv", j, my_tab[i].letter); if (strstr(desc->name, signature) && strstr(desc->args[desc->nargs - 1], my_tab[i].gl_c_type_name) && strstr(desc->args[desc->nargs - 1], "*")) { if (p_signature_type_name) { if (signatures[i][j-1][0] == 0) sprintf(signatures[i][j-1], "TYPE_%d%s", j, my_tab[i].signature_type_name); *p_signature_type_name = signatures[i][j-1]; } if (p_c_type_name) *p_c_type_name = my_tab[i].c_type_name; return 1; } } } return 0; } static void print_server_side_argument(FILE* server_stub, int j, char* glType) { const char* symbolic_type = get_type_string(glType); if (strcmp(symbolic_type, "TYPE_CHAR") == 0) fprintf(server_stub, "ARG_TO_CHAR(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_UNSIGNED_CHAR") == 0) fprintf(server_stub, "ARG_TO_UNSIGNED_CHAR(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_SHORT") == 0) fprintf(server_stub, "ARG_TO_SHORT(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_UNSIGNED_SHORT") == 0) fprintf(server_stub, "ARG_TO_UNSIGNED_SHORT(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_INT") == 0) fprintf(server_stub, "ARG_TO_INT(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_UNSIGNED_INT") == 0) fprintf(server_stub, "ARG_TO_UNSIGNED_INT(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_FLOAT") == 0) fprintf(server_stub, "ARG_TO_FLOAT(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_16FLOAT") == 0) fprintf(server_stub, "(const float*)(args[%d])", j); else if (strcmp(symbolic_type, "TYPE_DOUBLE") == 0) fprintf(server_stub, "ARG_TO_DOUBLE(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_16DOUBLE") == 0) fprintf(server_stub, "(const double*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_128UCHAR") == 0) fprintf(server_stub, "(unsigned char*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_128UCHAR") == 0) fprintf(server_stub, "(const unsigned char*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_NULL_TERMINATED_STRING") == 0) fprintf(server_stub, "(const char*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_SHORT") == 0) fprintf(server_stub, "(const short*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_UNSIGNED_SHORT") == 0) fprintf(server_stub, "(const unsigned short*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_INT") == 0) fprintf(server_stub, "(const int*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_UNSIGNED_INT") == 0) fprintf(server_stub, "(const unsigned int*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_FLOAT") == 0) fprintf(server_stub, "(const float*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_DOUBLE") == 0) fprintf(server_stub, "(const double*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_CHAR") == 0) fprintf(server_stub, "(const char*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_SIGNED_CHAR") == 0) fprintf(server_stub, "(const signed char*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_VOID") == 0) fprintf(server_stub, "(const void*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_ARRAY_UNSIGNED_CHAR") == 0) fprintf(server_stub, "(const unsigned char*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_SHORT") == 0) fprintf(server_stub, "(short*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_UNSIGNED_SHORT") == 0) fprintf(server_stub, "(unsigned short*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_INT") == 0) fprintf(server_stub, "(int*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_UNSIGNED_INT") == 0) fprintf(server_stub, "(unsigned int*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_FLOAT") == 0) fprintf(server_stub, "(float*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_DOUBLE") == 0) fprintf(server_stub, "(double*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_VOID") == 0) fprintf(server_stub, "(void*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_CHAR") == 0) fprintf(server_stub, "(char*)(args[%d])", j); else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_UNSIGNED_CHAR") == 0) fprintf(server_stub, "(unsigned char*)(args[%d])", j); else { fprintf(stderr, "Unknown : %s\n", symbolic_type); assert(0); } } static const char* func_dealt_by_hand[500] = { NULL }; static const char* ignore_func[] = { "glGetPointerv", "glRectdv", "glRectfv", "glRectiv", "glRectsv", "glMultiDrawArrays", "glMultiDrawArraysEXT", "glMultiDrawElements", "glMultiDrawElementsEXT", "glUnmapBuffer", "glUnmapBufferARB", "glLoadTransposeMatrixf", "glLoadTransposeMatrixd", "glMultTransposeMatrixf", "glMultTransposeMatrixd", "glLoadTransposeMatrixfARB", "glLoadTransposeMatrixdARB", "glMultTransposeMatrixfARB", "glMultTransposeMatrixdARB", "glPixelDataRangeNV", "glFlushPixelDataRangeNV", "glVertexArrayRangeNV", "glFlushVertexArrayRangeNV", "glVertexWeightfEXT", "glGetBufferPointerv", "glGetBufferPointervARB", "glGetVertexAttribPointerv", "glGetVertexAttribPointervARB", "glVertexAttribPointer", "glVertexAttribPointerARB", "glGetVariantPointervEXT", NULL, }; void get_func_dealt_by_hand() { FILE* f = fopen("gl_func_perso.h", "r"); char buffer[256]; int i = 0; char* c; while(fgets(buffer, 256, f)) { if (strstr(buffer, "MAGIC_MACRO(")) { func_dealt_by_hand[i] = strdup(strstr(buffer, "MAGIC_MACRO(") + strlen("MAGIC_MACRO(")); * strstr(func_dealt_by_hand[i], ")") = 0; c = strstr(func_dealt_by_hand[i], "_"); if (c && c != func_dealt_by_hand[i]) *c = 0; i ++; } } fclose(f); int j = 0; while(ignore_func[j]) { func_dealt_by_hand[i] = ignore_func[j]; i++; j++; } } static const char* just_for_server_side_list[] = { "glEnableClientState", "glDisableClientState", "glPushClientAttrib", "glPopClientAttrib", "glPixelStorei", "glPixelStoref", "glClientActiveTexture", "glClientActiveTextureARB", "glEnableVertexAttribArray", "glEnableVertexAttribArrayARB", "glDisableVertexAttribArray", "glDisableVertexAttribArrayARB", "glDrawElementArrayATI", "glDrawRangeElementArrayATI", "glGenSymbolsEXT", "glFreeObjectBufferATI", "glUnmapObjectBufferATI", "glLockArraysEXT", "glUnlockArraysEXT", "glDepthFunc", "glFogf", "glFogi", "glClipPlane", "glGetClipPlane", /* begin of openquartz optimization */ #if 1 "glMatrixMode", "glOrtho", "glFrustum", "glPushMatrix", "glPopMatrix", "glLoadIdentity", "glLoadMatrixd", "glLoadMatrixf", "glMultMatrixd", "glMultMatrixf", "glRotated", "glRotatef", "glScaled", "glScalef", "glTranslated", "glTranslatef", #endif /* end of openquartz optimization */ "glGetError", "glActiveTextureARB", "glViewport", "glScissor", "glBindBufferARB", "glDeleteBuffersARB", "glGenBuffersARB", "glBufferDataARB", "glBufferSubDataARB", "glGetBufferSubDataARB", "glGetBufferParameterivARB", "glBindBuffer", "glDeleteBuffers", "glGenBuffers", "glBufferData", "glBufferSubData", "glGetBufferSubData", "glGetBufferParameteriv", "glPushAttrib", "glPopAttrib", "glEnable", "glDisable", "glIsEnabled", "glBindTexture", "glBindTextureEXT", "glFogfv", "glFogiv", "glBitmap", "glGetTexImage", "glReadPixels", "glDrawPixels", "glSelectBuffer", "glFeedbackBuffer", "glTexImage1D", "glTexImage2D", "glTexImage3D", "glTexSubImage1D", "glTexSubImage2D", "glTexSubImage3D", "glTexImage3DEXT", "glTexSubImage1DEXT", "glTexSubImage2DEXT", "glTexSubImage3DEXT", "glGetCompressedTexImage", "glCompressedTexImage1D", "glCompressedTexImage2D", "glCompressedTexImage3D", "glCompressedTexSubImage1D", "glCompressedTexSubImage2D", "glCompressedTexSubImage3D", "glGetCompressedTexImageARB", "glCompressedTexImage1DARB", "glCompressedTexImage2DARB", "glCompressedTexImage3DARB", "glCompressedTexSubImage1DARB", "glCompressedTexSubImage2DARB", "glCompressedTexSubImage3DARB", "glCallLists", "glNewList", "glDeleteLists", "glGenLists", "glGenTextures", "glDeleteTextures", "glDeleteTexturesEXT", "glMap1f", "glMap1d", "glMap2f", "glMap2d", "glGetMapdv", "glGetMapfv", "glGetMapiv", "glGetBooleanv", "glGetIntegerv", "glGetFloatv", "glGetDoublev", "glGetPixelMapfv", "glGetPixelMapuiv", "glGetPixelMapusv", "glGetProgramStringARB", "glGetProgramStringNV", "glArrayElement", "glDrawArrays", "glDrawElements", "glDrawRangeElements", "glDrawRangeElementsEXT", "glGetProgramInfoLog", "glGetTexLevelParameteriv", "glGetInfoLogARB", "glGetShaderInfoLog", "glGetAttachedObjectsARB", "glGetAttachedShaders", "glGetActiveUniformARB", "glGetActiveUniform", "glGetUniformLocationARB", "glGetUniformLocation", "glGetUniformfvARB", "glGetUniformfv", "glGetUniformivARB", "glGetUniformiv", "glGetUniformuivEXT", "glGetShaderSourceARB", "glGetShaderSource", "glGetActiveAttribARB", "glGetActiveAttrib", "glGetAttribLocationARB", "glGetAttribLocation", "glNewObjectBufferATI", "glUpdateObjectBufferATI", "glSetLocalConstantEXT", "glSetInvariantEXT", "glVariantbvEXT", "glVariantsvEXT", "glVariantivEXT", "glVariantfvEXT", "glVariantdvEXT", "glVariantubvEXT", "glVariantusvEXT", "glVariantuivEXT", "glGetVariantBooleanvEXT", "glGetVariantIntegervEXT", "glGetVariantFloatvEXT", "glGetInvariantBooleanvEXT", "glGetInvariantIntegervEXT", "glGetInvariantFloatvEXT", "glGetLocalConstantBooleanvEXT", "glGetLocalConstantIntegervEXT", "glGetLocalConstantFloatvEXT", "glMatrixIndexubvARB", "glMatrixIndexusvARB", "glMatrixIndexuivARB", "glColorTable", "glColorSubTable", "glGetColorTable", "glConvolutionFilter1D", "glConvolutionFilter2D", "glGetConvolutionFilter", "glSeparableFilter2D", "glGetSeparableFilter", "glGetHistogram", "glGetMinmax", "glColorTableEXT", "glColorSubTableEXT", "glGetColorTableEXT", "glConvolutionFilter1DEXT", "glConvolutionFilter2DEXT", "glGetConvolutionFilterEXT", "glSeparableFilter2DEXT", "glGetSeparableFilterEXT", "glGetHistogramEXT", "glGetMinmaxEXT", "glGetTexParameterfv", "glGetVertexAttribivARB", "glGetVertexAttribfvARB", "glGetVertexAttribdvARB", "glGetVertexAttribiv", "glGetVertexAttribfv", "glGetVertexAttribdv", "glGetDetailTexFuncSGIS", "glGetSharpenTexFuncSGIS", "fake_gluBuild2DMipmaps", "glRenderMode", "glEnableVariantClientStateEXT", "glDisableVariantClientStateEXT", "glGetActiveVaryingNV", NULL, }; static int just_for_server_side_func(char* funcname) { int i; for(i=0;just_for_server_side_list[i];i++) { if (strcmp(just_for_server_side_list[i], funcname) == 0) return 1; } return 0; } int parse(FILE* f, FuncDesc* funcDesc, int funcDescCount, int ignoreEXT) { char buffer[256]; while(fgets(buffer, 256, f)) { if (strncmp(buffer, "GLAPI", 5) == 0 && strstr(buffer, "APIENTRY") && strstr(buffer, "(")) { int i = 0; int skip = 0; if (func_dealt_by_hand[0] == 0) { get_func_dealt_by_hand(); } while (func_dealt_by_hand[i]) { if (strstr(buffer, func_dealt_by_hand[i])) { skip = 1; break; } i++; } if (skip) continue; char** args = malloc(15 * sizeof(char*)); int narg = 0; char* type = buffer + 6; char* n = strstr(type, "GLAPIENTRY") ? strstr(type, "GLAPIENTRY") : strstr(type, "APIENTRY"); int skip_length = strstr(type, "GLAPIENTRY") ? 11 : 9; n[-1] = 0; type = strdup(type); n += skip_length; char* fonc = n; n = strstr(n, "("); if (n[-1] == ' ') n[-1] = 0; n[0] = 0; fonc = strdup(fonc); /*if (strstr(fonc, "glLockArraysEXT") || strstr(fonc, "glUnlockArraysEXT")) { } else*/ if (ignoreEXT == 1 && isExtByName(fonc)) { free(type); free(fonc); continue; } n++; while(1) { char* virg = strstr(n, ","); if (virg) { args[narg] = n; virg[0] = 0; args[narg] = get_arg_type(args[narg]); narg++; n = virg+1; } else break; } while (strstr(n, ")") == 0) { fgets(buffer, 256, f); n = buffer; while(1) { char* virg = strstr(n, ","); if (virg) { args[narg] = n; virg[0] = 0; args[narg] = get_arg_type(args[narg]); narg++; n = virg+1; } else break; } } char* par = strstr(n, ")"); args[narg] = n; par[0] = 0; args[narg] = get_arg_type(args[narg]); narg++; /*printf("%s %s (", type, fonc); for(i=0;iargs[j], "*") == NULL) return 0; for(i=0;i< N_ELEMENTS(argDependingOnPreviousArgTab); i++) { if (strstr(funcDesc->name, argDependingOnPreviousArgTab[i].str) && j == argDependingOnPreviousArgTab[i].i) return 1; } return 0; } static void fprintf_prototype_args(FILE* f, FuncDesc* funcDesc) { int j; for(j=0;jnargs;j++) { if (j != 0) fprintf(f,", "); if (strstr(funcDesc->args[j], "[16]")) { if (strstr(funcDesc->args[j], "float")) { fprintf(f, "const GLfloat arg_%d[16]", j); } else if (strstr(funcDesc->args[j], "double")) { fprintf(f, "const GLdouble arg_%d[16]", j); } else { exit(-1); } } else if (strstr(funcDesc->args[j], "[128]") && strstr(funcDesc->args[j], "GLubyte")) fprintf(f, (strstr(funcDesc->args[j], "const")) ? "const GLubyte* arg_%d" : "GLubyte* arg_%d", j); else fprintf(f, "%s arg_%d", funcDesc->args[j], j); } } int main(int argc, char* argv[]) { FuncDesc funcDesc[3000]; int funcDescCount = 0; FILE* f; f = fopen("mesa_gl.h", "r"); assert(f); /*if (!f) f = fopen("/usr/include/GL/gl.h", "r");*/ funcDescCount = parse(f, funcDesc, 0, 1); fclose(f); f = fopen("mesa_glext.h", "r"); assert(f); /*if (!f) f = fopen("/usr/include/GL/glext.h", "r");*/ funcDescCount = parse(f, funcDesc, funcDescCount, 0); fclose(f); FILE* header = fopen("gl_func.h", "w"); FILE* client_stub = fopen("client_stub.c", "w"); FILE* server_stub = fopen("server_stub.c", "w"); fprintf(header, "/* This is a generated file. DO NOT EDIT ! */\n\n"); fprintf(header, "#define COMPOSE(x,y) x##y\n"); fprintf(header, "#define MAGIC_MACRO(x) COMPOSE(x,_func)\n"); fprintf(header, "enum {\n" "#include \"gl_func_perso.h\"\n"); fprintf(client_stub, "/* This is a generated file. DO NOT EDIT ! */\n\n"); fprintf(server_stub, "/* This is a generated file. DO NOT EDIT ! */\n\n"); int i; for(i=0;i= 0) { j = funcDesc[i].nargs-1; if (!is_arg_of_length_depending_on_previous_args(&funcDesc[i], j) && strstr(funcDesc[i].args[j], "const GLchar") == NULL && strstr(funcDesc[i].args[j], "[16]") == NULL) { pointer_of_unknown_size |= strstr(funcDesc[i].args[j], "*") != NULL; pointer_of_unknown_size |= strstr(funcDesc[i].args[j], "[") != NULL; } } } } if (pointer_of_unknown_size && funcDesc[i].nargs == 1) { if (strstr(funcDesc[i].name, "Matrixf") || strstr(funcDesc[i].name, "Matrixd")) { free(funcDesc[i].args[0]); if (strstr(funcDesc[i].name, "Matrixf")) funcDesc[i].args[0] = strdup("GLfloat m[16]"); else funcDesc[i].args[0] = strdup("GLdouble m[16]"); pointer_of_unknown_size = 0; } else if (strcmp(funcDesc[i].name, "glPolygonStipple") == 0) { free(funcDesc[i].args[0]); funcDesc[i].args[0] = strdup("const GLubyte mask[128]"); pointer_of_unknown_size = 0; } else if (strcmp(funcDesc[i].name, "glGetPolygonStipple") == 0) { free(funcDesc[i].args[0]); funcDesc[i].args[0] = strdup("GLubyte mask[128]"); funcDesc[i].has_out_parameters = 1; pointer_of_unknown_size = 0; } } if (just_for_server_side_func(name) || pointer_of_unknown_size == 0) { fprintf(header, " %s_func,\n", funcDesc[i].name); funcDesc[i].ok = 1; if (just_for_server_side_func(name)) funcDesc[i].just_for_server_side = 1; for(j=0;j 0) fprintf(client_stub, ", "); if (strstr(funcDesc[i].args[j], "*")) { fprintf(client_stub, "POINTER_TO_ARG(arg_%d)", j); } else { const char* symbolic_type = get_type_string(funcDesc[i].args[j]); if (strcmp(symbolic_type, "TYPE_CHAR") == 0) fprintf(client_stub, "CHAR_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_UNSIGNED_CHAR") == 0) fprintf(client_stub, "UNSIGNED_CHAR_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_SHORT") == 0) fprintf(client_stub, "SHORT_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_UNSIGNED_SHORT") == 0) fprintf(client_stub, "UNSIGNED_SHORT_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_INT") == 0) fprintf(client_stub, "INT_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_UNSIGNED_INT") == 0) fprintf(client_stub, "UNSIGNED_INT_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_FLOAT") == 0) fprintf(client_stub, "FLOAT_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_16FLOAT") == 0) fprintf(client_stub, "POINTER_TO_ARG"); else if (strcmp(symbolic_type, "TYPE_DOUBLE") == 0) fprintf(client_stub, "DOUBLE_TO_ARG"); else if ( strcmp(symbolic_type, "TYPE_16DOUBLE") == 0) fprintf(client_stub, "POINTER_TO_ARG"); else if ( strcmp(symbolic_type, "TYPE_128UCHAR") == 0 || strcmp(symbolic_type, "TYPE_OUT_128UCHAR") == 0) fprintf(client_stub, "POINTER_TO_ARG"); else { fprintf(stderr, "Unknown : %s\n", symbolic_type); assert(0); } fprintf(client_stub, "(arg_%d)", j); } } fprintf(client_stub, "};\n"); } fprintf(client_stub, " do_opengl_call(%s_func, %s, %s, NULL);\n", funcDesc[i].name, (strcmp(funcDesc[i].type, "void") == 0) ? "NULL" : "&ret", (funcDesc[i].nargs) ? "args" : "NULL"); if (strcmp(funcDesc[i].type, "void") != 0) { fprintf(client_stub, " return ret;\n"); } fprintf(client_stub, "}\n\n"); } fprintf(server_stub, " case %s_func:\n", funcDesc[i].name); fprintf(server_stub, " {\n"); if (isExt(&funcDesc[i])) { fprintf(server_stub, " GET_EXT_PTR(%s, %s, (", funcDesc[i].type, funcDesc[i].name); fprintf_prototype_args(server_stub, &funcDesc[i]); fprintf(server_stub, "));\n"); } fprintf(server_stub, " "); if (strcmp(funcDesc[i].type, "void") == 0) ; else if (strcmp(get_type_string(funcDesc[i].type), "TYPE_INT") == 0 || strcmp(get_type_string(funcDesc[i].type), "TYPE_UNSIGNED_INT") == 0) fprintf(server_stub, "*pret_int = "); else if (strcmp(get_type_string(funcDesc[i].type), "TYPE_CHAR") == 0 || strcmp(get_type_string(funcDesc[i].type), "TYPE_UNSIGNED_CHAR") == 0) fprintf(server_stub, "*pret_char = "); else { fprintf(stderr, "unknown ret type = %s\n", get_type_string(funcDesc[i].type)); exit(-1); } /*if (strstr(funcDesc[i].name, "EXT")) { char* dup = strdup(funcDesc[i].name); *strstr(dup, "EXT") = 0; fprintf(server_stub, "%s(", dup); free(dup); } else*/ { if (isExt(&funcDesc[i])) fprintf(server_stub, "ptr_func_%s(", funcDesc[i].name); else fprintf(server_stub, "%s(", funcDesc[i].name); } char* c_type_name; if (is_known_arg_vector(&funcDesc[i], NULL, &c_type_name)) { for(j=0;j