2 * Parse gl.h et glx.h to auto-generate source code
4 * Copyright (c) 2006,2007 Even Rouault
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 /* gcc -g parse_gl_h.c -o parse_gl_h && ./parse_gl_h */
31 #define GL_INCLUDE_PATH "../tizen/src/hw/"
34 int isExtByName(const char* name)
36 return (strstr(name, "ARB") != NULL) ||
37 (strstr(name, "IBM") != NULL) ||
38 (strstr(name, "EXT") != NULL) ||
39 (strstr(name, "ATI") != NULL) ||
40 (strstr(name, "NV") != NULL) ||
41 (strstr(name, "MESA") != NULL) ||
42 (strstr(name, "APPLE") != NULL) ||
43 (strstr(name, "SUN") != NULL) ||
44 (strstr(name, "SGI") != NULL);
47 char* get_arg_type(char* s)
49 while(*s == ' ' || *s == '\t') s++;
51 char* c = strstr(n, "const");
55 char* t = strstr(n, " ");
65 memmove(ori, t, strlen(t));
66 strstr(ori, "]")[1] = 0;
79 int just_for_server_side;
80 int has_out_parameters;
84 int isExt(FuncDesc* func)
89 char* get_type_string(char* type)
91 if (strstr(type, "[16]"))
93 if (strstr(type, "float"))
94 return ("TYPE_16FLOAT");
95 else if (strstr(type, "double"))
96 return ("TYPE_16DOUBLE");
99 printf("inconnu %s\n", type);
103 else if (strstr(type, "[128]") && strstr(type, "GLubyte"))
104 return strstr(type, "const") ? "TYPE_128UCHAR" : "TYPE_OUT_128UCHAR";
105 else if (strstr(type, "const GLvoid *"))
106 return "TYPE_ARRAY_VOID";
107 else if (strstr(type, "const GLchar *") ||
108 strstr(type, "const GLcharARB *"))
109 return "TYPE_NULL_TERMINATED_STRING";
110 else if (strstr(type, "const GLbyte *"))
111 return "TYPE_ARRAY_SIGNED_CHAR";
112 else if (strstr(type, "const GLubyte *"))
113 return "TYPE_ARRAY_UNSIGNED_CHAR";
114 else if (strstr(type, "const GLshort *"))
115 return "TYPE_ARRAY_SHORT";
116 else if (strstr(type, "const GLushort *") ||
117 strstr(type, "const GLhalfNV *"))
118 return "TYPE_ARRAY_UNSIGNED_SHORT";
119 else if (strstr(type, "const GLint *"))
120 return "TYPE_ARRAY_INT";
121 else if (strstr(type, "const GLuint *") ||
122 strstr(type, "const GLenum *"))
123 return "TYPE_ARRAY_UNSIGNED_INT";
124 else if (strstr(type, "const GLfloat *") ||
125 strstr(type, "const GLclampf *"))
126 return "TYPE_ARRAY_FLOAT";
127 else if (strstr(type, "const GLdouble *"))
128 return "TYPE_ARRAY_DOUBLE";
129 else if (strstr(type, "GLvoid *"))
130 return "TYPE_OUT_ARRAY_VOID";
131 else if (strstr(type, "GLboolean *") ||
132 strstr(type, "GLubyte *"))
133 return "TYPE_OUT_ARRAY_UNSIGNED_CHAR";
134 else if (strstr(type, "GLcharARB *") ||
135 strstr(type, "GLchar *"))
136 return "TYPE_OUT_ARRAY_CHAR";
137 else if (strstr(type, "GLshort *"))
138 return "TYPE_OUT_ARRAY_SHORT";
139 else if (strstr(type, "GLushort *"))
140 return "TYPE_OUT_ARRAY_UNSIGNED_SHORT";
141 else if (strstr(type, "GLint *")||
142 strstr(type, "GLsizei *"))
143 return "TYPE_OUT_ARRAY_INT";
144 else if (strstr(type, "GLuint *") ||
145 strstr(type, "GLenum *") ||
146 strstr(type, "GLhandleARB *"))
147 return "TYPE_OUT_ARRAY_UNSIGNED_INT";
148 else if (strstr(type, "GLfloat *"))
149 return "TYPE_OUT_ARRAY_FLOAT";
150 else if (strstr(type, "GLdouble *"))
151 return "TYPE_OUT_ARRAY_DOUBLE";
152 else if (strcmp(type, "void") == 0)
154 else if (strcmp(type, "GLbyte") == 0)
156 else if (strcmp(type, "GLubyte") == 0 ||
157 strcmp(type, "GLboolean") == 0)
158 return("TYPE_UNSIGNED_CHAR");
159 else if (strcmp(type, "GLshort") == 0)
160 return("TYPE_SHORT");
161 else if (strcmp(type, "GLushort") == 0 ||
162 strcmp(type, "GLhalfNV") == 0)
163 return("TYPE_UNSIGNED_SHORT");
164 else if (strcmp(type, "GLint") == 0 ||
165 strcmp(type, "GLsizei") == 0 ||
166 strcmp(type, "GLintptr") == 0 ||
167 strcmp(type, "GLsizeiptr") == 0 ||
168 strcmp(type, "GLintptrARB") == 0 ||
169 strcmp(type, "GLsizeiptrARB") == 0)
171 else if (strcmp(type, "GLenum") == 0 ||
172 strcmp(type, "GLuint") == 0 ||
173 strcmp(type, "GLhandleARB") == 0 ||
174 strcmp(type, "GLbitfield") == 0)
175 return("TYPE_UNSIGNED_INT");
176 else if (strcmp(type, "GLfloat") == 0 ||
177 strcmp(type, "GLclampf") == 0)
178 return("TYPE_FLOAT");
179 else if (strcmp(type, "GLdouble") == 0 ||
180 strcmp(type, "GLclampd") == 0)
181 return("TYPE_DOUBLE");
184 printf("inconnu %s\n", type);
192 char* signature_type_name;
193 char* gl_c_type_name;
195 } ForIsKnownArgVector;
197 #define N_ELEMENTS(x) (sizeof(x)/sizeof(x[0]))
198 #define N_FIELDS_IN_ARG_VECTOR 4
204 char* signature_type_name;
207 static KnownLastArgFunc knownLastArgFuncs[] =
209 {"glFogCoordfv", "TYPE_1FLOAT"},
210 {"glFogCoorddv", "TYPE_1DOUBLE"},
211 {"glFogCoordfvEXT", "TYPE_1FLOAT"},
212 {"glFogCoorddvEXT", "TYPE_1DOUBLE"},
213 {"glFogCoordhvNV", "TYPE_1USHORT"},
215 {"glGetFenceivNV", "TYPE_OUT_1INT"},
217 {"glGetTexLevelParameteriv", "TYPE_OUT_1INT" },
218 {"glGetTexLevelParameterfv", "TYPE_OUT_1FLOAT" },
220 {"glGetRenderbufferParameterivEXT", "TYPE_OUT_1INT"},
221 {"glGetFramebufferAttachmentParameterivEXT", "TYPE_OUT_1INT"},
222 {"glGetFinalCombinerInputParameterivNV", "TYPE_OUT_1INT"},
223 {"glGetCombinerOutputParameterivNV", "TYPE_OUT_1INT"},
224 {"glGetCombinerInputParameterivNV", "TYPE_OUT_1INT"},
225 {"glGetOcclusionQueryivNV", "TYPE_OUT_1INT"},
226 {"glGetOcclusionQueryuivNV", "TYPE_OUT_1UINT"},
227 {"glGetObjectParameterivARB", "TYPE_OUT_1INT"},
228 {"glGetQueryivARB", "TYPE_OUT_1INT"},
229 {"glGetQueryiv", "TYPE_OUT_1INT"},
230 {"glGetQueryObjectivARB", "TYPE_OUT_1INT"},
231 {"glGetQueryObjectiv", "TYPE_OUT_1INT"},
232 {"glGetQueryObjectuivARB", "TYPE_OUT_1UINT"},
233 {"glGetQueryObjectuiv", "TYPE_OUT_1UINT"},
234 {"glGetProgramivARB", "TYPE_OUT_1INT"},
235 {"glGetProgramiv", "TYPE_OUT_1INT"},
236 {"glGetProgramivNV", "TYPE_OUT_1INT"},
237 {"glGetShaderiv", "TYPE_OUT_1INT"},
239 {"glCombinerParameterfvNV", "TYPE_1FLOAT"},
240 {"glCombinerParameterivNV", "TYPE_1INT"},
242 {"glGetFinalCombinerInputParameterfvNV", "TYPE_OUT_1FLOAT"},
243 {"glGetCombinerOutputParameterfvNV", "TYPE_OUT_1FLOAT"},
244 {"glGetCombinerInputParameterfvNV", "TYPE_OUT_1FLOAT"},
245 {"glGetObjectParameterfvARB", "TYPE_OUT_1FLOAT"},
247 {"glCombinerStageParameterfvNV", "TYPE_4FLOAT"},
248 {"glGetCombinerStageParameterfvNV", "TYPE_OUT_4FLOAT"},
250 {"glTexBumpParameterivATI", "TYPE_1INT"},
251 {"glTexBumpParameterfvATI", "TYPE_1FLOAT"},
252 {"glGetTexBumpParameterivATI", "TYPE_OUT_1INT"},
253 {"glGetTexBumpParameterfvATI", "TYPE_OUT_1FLOAT"},
255 {"glGetProgramLocalParameterfvARB", "TYPE_OUT_4FLOAT"},
256 {"glGetProgramLocalParameterdvARB", "TYPE_OUT_4DOUBLE"},
257 {"glGetProgramEnvParameterfvARB", "TYPE_OUT_4FLOAT"},
258 {"glGetProgramEnvParameterdvARB", "TYPE_OUT_4DOUBLE"},
259 {"glGetProgramLocalParameterIivNV", "TYPE_OUT_1INT"},
260 {"glGetProgramLocalParameterIuivNV", "TYPE_OUT_1UINT"},
261 {"glGetProgramEnvParameterIivNV", "TYPE_OUT_1INT"},
262 {"glGetProgramEnvParameterIuivNV", "TYPE_OUT_1UINT"},
264 {"glGetProgramParameterfvNV", "TYPE_OUT_4FLOAT"},
265 {"glGetProgramParameterdvNV", "TYPE_OUT_4DOUBLE"},
266 {"glGetProgramNamedParameterfvNV", "TYPE_OUT_4FLOAT"},
267 {"glGetProgramNamedParameterdvNV", "TYPE_OUT_4DOUBLE"},
269 {"glCullParameterfvEXT", "TYPE_4FLOAT"},
270 {"glCullParameterdvEXT", "TYPE_4DOUBLE"},
272 {"glGetTrackMatrixivNV", "TYPE_OUT_1INT"},
273 {"glExecuteProgramNV", "TYPE_4FLOAT"},
275 {"glEdgeFlagv", "TYPE_1UCHAR"},
277 {"glClipPlane", "TYPE_4DOUBLE"},
278 {"glGetClipPlane", "TYPE_OUT_4DOUBLE"},
280 {"glSetFragmentShaderConstantATI", "TYPE_4FLOAT"},
282 {"glGetObjectBufferfvATI", "TYPE_OUT_1FLOAT"},
283 {"glGetObjectBufferivATI", "TYPE_OUT_1INT"},
284 {"glGetArrayObjectfvATI", "TYPE_OUT_1FLOAT"},
285 {"glGetArrayObjectivATI", "TYPE_OUT_1INT"},
286 {"glGetVariantArrayObjectfvATI", "TYPE_OUT_1FLOAT"},
287 {"glGetVariantArrayObjectivATI", "TYPE_OUT_1INT"},
288 {"glGetVertexAttribArrayObjectfvATI", "TYPE_OUT_1FLOAT"},
289 {"glGetVertexAttribArrayObjectivATI", "TYPE_OUT_1INT"},
291 {"glPixelTransformParameterivEXT", "TYPE_1INT"},
292 {"glPixelTransformParameterfvEXT", "TYPE_1FLOAT"},
293 {"glGetPixelTransformParameterivEXT", "TYPE_OUT_1INT"},
294 {"glGetPixelTransformParameterfvEXT", "TYPE_OUT_1FLOAT"},
296 {"glColorTableParameterfv", "TYPE_4FLOAT"},
297 {"glColorTableParameteriv", "TYPE_4INT"},
298 {"glGetColorTableParameterfv", "TYPE_OUT_4FLOAT"},
299 {"glGetColorTableParameteriv", "TYPE_OUT_4INT"},
300 {"glColorTableParameterfvEXT", "TYPE_4FLOAT"},
301 {"glColorTableParameterivEXT", "TYPE_4INT"},
302 {"glGetColorTableParameterfvEXT", "TYPE_OUT_4FLOAT"},
303 {"glGetColorTableParameterivEXT", "TYPE_OUT_4INT"},
305 {"glGetMinmaxParameterfv", "TYPE_OUT_1FLOAT"},
306 {"glGetMinmaxParameteriv", "TYPE_OUT_1INT"},
307 {"glGetHistogramParameterfv", "TYPE_OUT_1FLOAT"},
308 {"glGetHistogramParameteriv", "TYPE_OUT_1INT"},
309 {"glGetMinmaxParameterfvEXT", "TYPE_OUT_1FLOAT"},
310 {"glGetMinmaxParameterivEXT", "TYPE_OUT_1INT"},
311 {"glGetHistogramParameterfvEXT", "TYPE_OUT_1FLOAT"},
312 {"glGetHistogramParameterivEXT", "TYPE_OUT_1INT"},
314 /* Not sure at all for the 2 followingo ones ! */
315 {"glGetBooleanIndexedvEXT", "TYPE_OUT_4UCHAR"},
316 {"glGetIntegerIndexedvEXT", "TYPE_OUT_4INT"},
318 {"glReferencePlaneSGIX", "TYPE_4DOUBLE"},
320 {"glGetTransformFeedbackVaryingNV", "TYPE_OUT_1INT"},
324 int is_known_arg_vector(FuncDesc* desc, char** p_signature_type_name, char** p_c_type_name)
326 static ForIsKnownArgVector my_tab[] =
328 { "b", "CHAR", "GLbyte", "signed char" },
329 { "Boolean", "CHAR", "GLboolean", "unsigned char" },
330 { "s", "SHORT", "GLshort", "short" },
331 { "i", "INT", "GLint", "int" },
332 { "Integer", "INT", "GLint", "int" },
333 { "ub", "CHAR", "GLubyte", "unsigned char" },
334 { "h", "SHORT", "GLhalf", "unsigned short" },
335 { "us", "SHORT", "GLushort", "unsigned short" },
336 { "ui", "INT", "GLuint", "unsigned int" },
337 { "Nb", "CHAR", "GLbyte", "signed char" },
338 { "Ns", "SHORT", "GLshort", "short" },
339 { "Ni", "INT", "GLint", "int" },
340 { "Nub", "CHAR", "GLubyte", "unsigned char" },
341 { "Nus", "SHORT", "GLushort", "unsigned short" },
342 { "Nui", "INT", "GLuint", "unsigned int" },
344 { "f", "FLOAT", "GLfloat", "float" },
345 { "Float", "FLOAT", "GLfloat", "float" },
346 { "d", "DOUBLE", "GLdouble", "double" },
349 if (desc->nargs == 0)
354 if (strstr(desc->name, "glVertexAttribs") ||
355 strstr(desc->name, "glProgramParameters") ||
356 strstr(desc->name, "glProgramEnvParameters") ||
357 strstr(desc->name, "glProgramLocalParameters") ||
358 (strstr(desc->name, "glUniform") && (strstr(desc->name, "iv") || strstr(desc->name, "fv"))))
361 static char signatures[N_ELEMENTS(my_tab)][N_FIELDS_IN_ARG_VECTOR][20] = {0};
364 for(i=0;i<N_ELEMENTS(knownLastArgFuncs);i++)
366 if (strcmp(desc->name, knownLastArgFuncs[i].func_name) == 0)
368 if (p_signature_type_name)
370 *p_signature_type_name = knownLastArgFuncs[i].signature_type_name;
374 if (strstr(knownLastArgFuncs[i].signature_type_name, "FLOAT"))
375 *p_c_type_name = "float";
376 else if (strstr(knownLastArgFuncs[i].signature_type_name, "DOUBLE"))
377 *p_c_type_name = "double";
378 else if (strstr(knownLastArgFuncs[i].signature_type_name, "UINT"))
379 *p_c_type_name = "unsigned int";
380 else if (strstr(knownLastArgFuncs[i].signature_type_name, "INT"))
381 *p_c_type_name = "int";
382 else if (strstr(knownLastArgFuncs[i].signature_type_name, "USHORT"))
383 *p_c_type_name = "unsigned short";
384 else if (strstr(knownLastArgFuncs[i].signature_type_name, "SHORT"))
385 *p_c_type_name = "short";
386 else if (strstr(knownLastArgFuncs[i].signature_type_name, "UCHAR"))
387 *p_c_type_name = "unsigned char";
388 else if (strstr(knownLastArgFuncs[i].signature_type_name, "CHAR"))
389 *p_c_type_name = "char";
397 for(i=0;i<N_ELEMENTS(my_tab);i++)
399 for(j=1;j<=N_FIELDS_IN_ARG_VECTOR;j++)
401 if (strstr(desc->name, "glIndex") && strstr(desc->name, "v"))
402 sprintf(signature, "%sv", my_tab[i].letter);
404 sprintf(signature, "%d%sv", j, my_tab[i].letter);
405 if (strstr(desc->name, signature) &&
406 strstr(desc->args[desc->nargs - 1], my_tab[i].gl_c_type_name) &&
407 strstr(desc->args[desc->nargs - 1], "*"))
409 if (p_signature_type_name)
411 if (signatures[i][j-1][0] == 0)
412 sprintf(signatures[i][j-1], "TYPE_%d%s", j, my_tab[i].signature_type_name);
413 *p_signature_type_name = signatures[i][j-1];
415 if (p_c_type_name) *p_c_type_name = my_tab[i].c_type_name;
423 static void print_server_side_argument(FILE* server_stub, int j, char* glType)
425 const char* symbolic_type = get_type_string(glType);
426 if (strcmp(symbolic_type, "TYPE_CHAR") == 0)
427 fprintf(server_stub, "ARG_TO_CHAR(args[%d])", j);
428 else if (strcmp(symbolic_type, "TYPE_UNSIGNED_CHAR") == 0)
429 fprintf(server_stub, "ARG_TO_UNSIGNED_CHAR(args[%d])", j);
430 else if (strcmp(symbolic_type, "TYPE_SHORT") == 0)
431 fprintf(server_stub, "ARG_TO_SHORT(args[%d])", j);
432 else if (strcmp(symbolic_type, "TYPE_UNSIGNED_SHORT") == 0)
433 fprintf(server_stub, "ARG_TO_UNSIGNED_SHORT(args[%d])", j);
434 else if (strcmp(symbolic_type, "TYPE_INT") == 0)
435 fprintf(server_stub, "ARG_TO_INT(args[%d])", j);
436 else if (strcmp(symbolic_type, "TYPE_UNSIGNED_INT") == 0)
437 fprintf(server_stub, "ARG_TO_UNSIGNED_INT(args[%d])", j);
438 else if (strcmp(symbolic_type, "TYPE_FLOAT") == 0)
439 fprintf(server_stub, "ARG_TO_FLOAT(args[%d])", j);
440 else if (strcmp(symbolic_type, "TYPE_16FLOAT") == 0)
441 fprintf(server_stub, "(const float*)(args[%d])", j);
442 else if (strcmp(symbolic_type, "TYPE_DOUBLE") == 0)
443 fprintf(server_stub, "ARG_TO_DOUBLE(args[%d])", j);
444 else if ( strcmp(symbolic_type, "TYPE_16DOUBLE") == 0)
445 fprintf(server_stub, "(const double*)(args[%d])", j);
446 else if ( strcmp(symbolic_type, "TYPE_OUT_128UCHAR") == 0)
447 fprintf(server_stub, "(unsigned char*)(args[%d])", j);
448 else if ( strcmp(symbolic_type, "TYPE_128UCHAR") == 0)
449 fprintf(server_stub, "(const unsigned char*)(args[%d])", j);
450 else if ( strcmp(symbolic_type, "TYPE_NULL_TERMINATED_STRING") == 0)
451 fprintf(server_stub, "(const char*)(args[%d])", j);
452 else if ( strcmp(symbolic_type, "TYPE_ARRAY_SHORT") == 0)
453 fprintf(server_stub, "(const short*)(args[%d])", j);
454 else if ( strcmp(symbolic_type, "TYPE_ARRAY_UNSIGNED_SHORT") == 0)
455 fprintf(server_stub, "(const unsigned short*)(args[%d])", j);
456 else if ( strcmp(symbolic_type, "TYPE_ARRAY_INT") == 0)
457 fprintf(server_stub, "(const int*)(args[%d])", j);
458 else if ( strcmp(symbolic_type, "TYPE_ARRAY_UNSIGNED_INT") == 0)
459 fprintf(server_stub, "(const unsigned int*)(args[%d])", j);
460 else if ( strcmp(symbolic_type, "TYPE_ARRAY_FLOAT") == 0)
461 fprintf(server_stub, "(const float*)(args[%d])", j);
462 else if ( strcmp(symbolic_type, "TYPE_ARRAY_DOUBLE") == 0)
463 fprintf(server_stub, "(const double*)(args[%d])", j);
464 else if ( strcmp(symbolic_type, "TYPE_ARRAY_CHAR") == 0)
465 fprintf(server_stub, "(const char*)(args[%d])", j);
466 else if ( strcmp(symbolic_type, "TYPE_ARRAY_SIGNED_CHAR") == 0)
467 fprintf(server_stub, "(const signed char*)(args[%d])", j);
468 else if ( strcmp(symbolic_type, "TYPE_ARRAY_VOID") == 0)
469 fprintf(server_stub, "(const void*)(args[%d])", j);
470 else if ( strcmp(symbolic_type, "TYPE_ARRAY_UNSIGNED_CHAR") == 0)
471 fprintf(server_stub, "(const unsigned char*)(args[%d])", j);
472 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_SHORT") == 0)
473 fprintf(server_stub, "(short*)(args[%d])", j);
474 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_UNSIGNED_SHORT") == 0)
475 fprintf(server_stub, "(unsigned short*)(args[%d])", j);
476 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_INT") == 0)
477 fprintf(server_stub, "(int*)(args[%d])", j);
478 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_UNSIGNED_INT") == 0)
479 fprintf(server_stub, "(unsigned int*)(args[%d])", j);
480 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_FLOAT") == 0)
481 fprintf(server_stub, "(float*)(args[%d])", j);
482 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_DOUBLE") == 0)
483 fprintf(server_stub, "(double*)(args[%d])", j);
484 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_VOID") == 0)
485 fprintf(server_stub, "(void*)(args[%d])", j);
486 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_CHAR") == 0)
487 fprintf(server_stub, "(char*)(args[%d])", j);
488 else if ( strcmp(symbolic_type, "TYPE_OUT_ARRAY_UNSIGNED_CHAR") == 0)
489 fprintf(server_stub, "(unsigned char*)(args[%d])", j);
493 fprintf(stderr, "Unknown : %s\n", symbolic_type);
498 static const char* func_dealt_by_hand[500] = { NULL };
501 static const char* ignore_func[] =
509 "glMultiDrawArraysEXT",
510 "glMultiDrawElements",
511 "glMultiDrawElementsEXT",
514 "glLoadTransposeMatrixf",
515 "glLoadTransposeMatrixd",
516 "glMultTransposeMatrixf",
517 "glMultTransposeMatrixd",
518 "glLoadTransposeMatrixfARB",
519 "glLoadTransposeMatrixdARB",
520 "glMultTransposeMatrixfARB",
521 "glMultTransposeMatrixdARB",
523 "glPixelDataRangeNV",
524 "glFlushPixelDataRangeNV",
525 "glVertexArrayRangeNV",
526 "glFlushVertexArrayRangeNV",
527 "glVertexWeightfEXT",
529 "glGetBufferPointerv",
530 "glGetBufferPointervARB",
531 "glGetVertexAttribPointerv",
532 "glGetVertexAttribPointervARB",
533 "glVertexAttribPointer",
534 "glVertexAttribPointerARB",
535 "glGetVariantPointervEXT",
539 void get_func_dealt_by_hand()
541 FILE* f = fopen(GL_INCLUDE_PATH"gl_func_perso.h", "r");
545 while(fgets(buffer, 256, f))
547 if (strstr(buffer, "MAGIC_MACRO("))
549 func_dealt_by_hand[i] = strdup(strstr(buffer, "MAGIC_MACRO(") + strlen("MAGIC_MACRO("));
550 * strstr(func_dealt_by_hand[i], ")") = 0;
551 c = strstr(func_dealt_by_hand[i], "_");
552 if (c && c != func_dealt_by_hand[i]) *c = 0;
559 while(ignore_func[j])
561 func_dealt_by_hand[i] = ignore_func[j];
567 static const char* just_for_server_side_list[] =
569 "glEnableClientState",
570 "glDisableClientState",
571 "glPushClientAttrib",
575 "glClientActiveTexture",
576 "glClientActiveTextureARB",
577 "glEnableVertexAttribArray",
578 "glEnableVertexAttribArrayARB",
579 "glDisableVertexAttribArray",
580 "glDisableVertexAttribArrayARB",
581 "glDrawElementArrayATI",
582 "glDrawRangeElementArrayATI",
584 "glFreeObjectBufferATI",
585 "glUnmapObjectBufferATI",
594 /* begin of openquartz optimization */
613 /* end of openquartz optimization */
616 "glActiveTextureARB",
622 "glDeleteBuffersARB",
625 "glBufferSubDataARB",
626 "glGetBufferSubDataARB",
627 "glGetBufferParameterivARB",
633 "glGetBufferSubData",
634 "glGetBufferParameteriv",
660 "glTexSubImage1DEXT",
661 "glTexSubImage2DEXT",
662 "glTexSubImage3DEXT",
664 "glGetCompressedTexImage",
665 "glCompressedTexImage1D",
666 "glCompressedTexImage2D",
667 "glCompressedTexImage3D",
668 "glCompressedTexSubImage1D",
669 "glCompressedTexSubImage2D",
670 "glCompressedTexSubImage3D",
672 "glGetCompressedTexImageARB",
673 "glCompressedTexImage1DARB",
674 "glCompressedTexImage2DARB",
675 "glCompressedTexImage3DARB",
676 "glCompressedTexSubImage1DARB",
677 "glCompressedTexSubImage2DARB",
678 "glCompressedTexSubImage3DARB",
687 "glDeleteTexturesEXT",
703 "glGetProgramStringARB",
704 "glGetProgramStringNV",
708 "glDrawRangeElements",
709 "glDrawRangeElementsEXT",
710 "glGetProgramInfoLog",
711 "glGetTexLevelParameteriv",
713 "glGetShaderInfoLog",
714 "glGetAttachedObjectsARB",
715 "glGetAttachedShaders",
716 "glGetActiveUniformARB",
717 "glGetActiveUniform",
718 "glGetUniformLocationARB",
719 "glGetUniformLocation",
724 "glGetUniformuivEXT",
725 "glGetShaderSourceARB",
727 "glGetActiveAttribARB",
729 "glGetAttribLocationARB",
730 "glGetAttribLocation",
732 "glNewObjectBufferATI",
733 "glUpdateObjectBufferATI",
735 "glSetLocalConstantEXT",
745 "glGetVariantBooleanvEXT",
746 "glGetVariantIntegervEXT",
747 "glGetVariantFloatvEXT",
748 "glGetInvariantBooleanvEXT",
749 "glGetInvariantIntegervEXT",
750 "glGetInvariantFloatvEXT",
751 "glGetLocalConstantBooleanvEXT",
752 "glGetLocalConstantIntegervEXT",
753 "glGetLocalConstantFloatvEXT",
755 "glMatrixIndexubvARB",
756 "glMatrixIndexusvARB",
757 "glMatrixIndexuivARB",
762 "glConvolutionFilter1D",
763 "glConvolutionFilter2D",
764 "glGetConvolutionFilter",
765 "glSeparableFilter2D",
766 "glGetSeparableFilter",
770 "glColorSubTableEXT",
771 "glGetColorTableEXT",
772 "glConvolutionFilter1DEXT",
773 "glConvolutionFilter2DEXT",
774 "glGetConvolutionFilterEXT",
775 "glSeparableFilter2DEXT",
776 "glGetSeparableFilterEXT",
780 "glGetTexParameterfv",
782 "glGetVertexAttribivARB",
783 "glGetVertexAttribfvARB",
784 "glGetVertexAttribdvARB",
785 "glGetVertexAttribiv",
786 "glGetVertexAttribfv",
787 "glGetVertexAttribdv",
789 "glGetDetailTexFuncSGIS",
790 "glGetSharpenTexFuncSGIS",
792 "fake_gluBuild2DMipmaps",
796 "glEnableVariantClientStateEXT",
797 "glDisableVariantClientStateEXT",
799 "glGetActiveVaryingNV",
804 static int just_for_server_side_func(char* funcname)
807 for(i=0;just_for_server_side_list[i];i++)
809 if (strcmp(just_for_server_side_list[i], funcname) == 0)
815 int parse(FILE* f, FuncDesc* funcDesc, int funcDescCount, int ignoreEXT)
818 while(fgets(buffer, 256, f))
821 if (strncmp(buffer, "GLAPI", 5) == 0 && strstr(buffer, "APIENTRY") && strstr(buffer, "("))
825 if (func_dealt_by_hand[0] == 0)
827 get_func_dealt_by_hand();
829 while (func_dealt_by_hand[i])
831 if (strstr(buffer, func_dealt_by_hand[i]))
841 char** args = malloc(15 * sizeof(char*));
843 char* type = buffer + 6;
844 char* n = strstr(type, "GLAPIENTRY") ? strstr(type, "GLAPIENTRY") : strstr(type, "APIENTRY");
845 int skip_length = strstr(type, "GLAPIENTRY") ? 11 : 9;
851 if (n[-1] == ' ') n[-1] = 0;
854 /*if (strstr(fonc, "glLockArraysEXT") || strstr(fonc, "glUnlockArraysEXT"))
860 if (ignoreEXT == 1 && isExtByName(fonc))
869 char* virg = strstr(n, ",");
874 args[narg] = get_arg_type(args[narg]);
881 while (strstr(n, ")") == 0)
883 fgets(buffer, 256, f);
887 char* virg = strstr(n, ",");
892 args[narg] = get_arg_type(args[narg]);
900 char* par = strstr(n, ")");
903 args[narg] = get_arg_type(args[narg]);
907 /*printf("%s %s (", type, fonc);
910 printf("%s,", args[i]);
914 for(i=0;i<funcDescCount;i++)
916 if (strcmp(funcDesc[i].name, fonc) == 0)
919 funcDesc[i].isExt = 1;
923 if (i == funcDescCount)
925 funcDesc[funcDescCount].type = type;
926 funcDesc[funcDescCount].name = fonc;
927 funcDesc[funcDescCount].nargs = narg;
928 funcDesc[funcDescCount].args = args;
929 funcDesc[funcDescCount].isExt = ignoreEXT == 0;
947 return funcDescCount;
956 StringIntStruct argDependingOnPreviousArgTab[] =
958 { "glLoadProgramNV", 3},
959 { "ProgramNamedParameter", 2},
960 { "glDeleteBuffers", 1},
961 { "glDrawBuffers", 1},
962 { "glGenPrograms", 1},
963 { "glDeletePrograms", 1},
964 { "glGenQueries", 1},
965 { "glDeleteQueries", 1},
966 { "glGenFencesNV", 1},
967 { "glDeleteFencesNV", 1},
968 { "glGenOcclusionQueriesNV", 1},
969 { "glDeleteOcclusionQueriesNV", 1},
970 { "glRequestResidentProgramsNV", 1},
971 { "glDeleteTextures", 1},
972 { "glGenFramebuffersEXT", 1},
973 { "glDeleteFramebuffersEXT", 1},
974 { "glGenRenderbuffersEXT", 1},
975 { "glDeleteRenderbuffersEXT", 1},
976 { "glUniform1fv", 2},
977 { "glUniform2fv", 2},
978 { "glUniform3fv", 2},
979 { "glUniform4fv", 2},
980 { "glUniform1iv", 2},
981 { "glUniform2iv", 2},
982 { "glUniform3iv", 2},
983 { "glUniform4iv", 2},
984 { "glUniform1uivEXT", 2},
985 { "glUniform2uivEXT", 2},
986 { "glUniform3uivEXT", 2},
987 { "glUniform4uivEXT", 2},
988 { "glProgramParameters4fvNV", 3},
989 { "glProgramParameters4dvNV", 3},
990 { "glProgramLocalParameters4fvEXT", 3},
991 { "glProgramLocalParametersI4ivNV", 3},
992 { "glProgramLocalParametersI4uivNV", 3},
993 { "glProgramEnvParameters4fvEXT", 3},
994 { "glProgramEnvParametersI4ivNV", 3},
995 { "glProgramEnvParametersI4uivNV", 3},
996 { "glAreProgramsResidentNV", 1} ,
997 { "glAreProgramsResidentNV", 2} ,
998 { "glAreTexturesResident", 1} ,
999 { "glAreTexturesResident", 2} ,
1000 { "glPrioritizeTextures", 1} ,
1001 { "glPrioritizeTextures", 2} ,
1002 { "glProgramStringARB", 3} ,
1004 { "glVertexAttribs", 2},
1006 { "glUniformMatrix", 3 },
1008 { "glGetVertexAttribfv", 2},
1009 { "glGetVertexAttribiv", 2},
1010 { "glGetVertexAttribdv", 2},
1011 { "glGetVertexAttribIivEXT", 2},
1012 { "glGetVertexAttribIuivEXT", 2},
1014 { "glPointParameterfv", 1},
1015 { "glPointParameteriv", 1},
1017 { "glWeightbvARB", 1},
1018 { "glWeightsvARB", 1},
1019 { "glWeightivARB", 1},
1020 { "glWeightfvARB", 1},
1021 { "glWeightdvARB", 1},
1022 { "glWeightubvARB", 1},
1023 { "glWeightusvARB", 1},
1024 { "glWeightuivARB", 1},
1028 { "glGetTexEnvfv", 2},
1029 { "glGetTexEnviv", 2},
1033 { "glGetTexGendv", 2},
1034 { "glGetTexGenfv", 2},
1035 { "glGetTexGeniv", 2},
1039 { "glGetLightfv", 2},
1040 { "glGetLightiv", 2},
1041 { "glFragmentLightfvSGIX", 2},
1042 { "glFragmentLightivSGIX", 2},
1043 { "glGetFragmentLightfvSGIX", 2},
1044 { "glGetFragmentLightivSGIX", 2},
1047 { "glLightModelfv", 1},
1048 { "glLightModeliv", 1},
1049 { "glFragmentLightModelfvSGIX", 1},
1050 { "glFragmentLightModelivSGIX", 1},
1052 { "glMaterialfv", 2},
1053 { "glMaterialiv", 2},
1054 { "glGetMaterialfv", 2},
1055 { "glGetMaterialiv", 2},
1056 { "glFragmentMaterialfvSGIX", 2},
1057 { "glFragmentMaterialivSGIX", 2},
1058 { "glGetFragmentMaterialfvSGIX", 2},
1059 { "glGetFragmentMaterialivSGIX", 2},
1064 { "glTexParameterfv", 2},
1065 { "glTexParameteriv", 2},
1066 { "glGetTexParameterfv", 2},
1067 { "glGetTexParameteriv", 2},
1069 { "glTexParameterIivEXT", 2},
1070 { "glTexParameterIuivEXT", 2},
1071 { "glGetTexParameterIivEXT", 2},
1072 { "glGetTexParameterIuivEXT", 2},
1074 { "glPixelMapfv", 2},
1075 { "glPixelMapuiv", 2},
1076 { "glPixelMapusv", 2},
1078 { "glDetailTexFuncSGIS", 2 },
1079 { "glSharpenTexFuncSGIS", 2 },
1081 { "glSpriteParameterfvSGIX", 1 },
1082 { "glSpriteParameterivSGIX", 1 },
1084 { "ConvolutionParameter", 2},
1086 { "glProgramBufferParametersfvNV", 4},
1087 { "glProgramBufferParametersIivNV", 4},
1088 { "glProgramBufferParametersIuivNV", 4},
1090 { "glTransformFeedbackAttribsNV", 1},
1091 { "glTransformFeedbackVaryingsNV", 2},
1094 int is_arg_of_length_depending_on_previous_args(FuncDesc* funcDesc, int j)
1097 if (strstr(funcDesc->args[j], "*") == NULL)
1099 for(i=0;i< N_ELEMENTS(argDependingOnPreviousArgTab); i++)
1101 if (strstr(funcDesc->name, argDependingOnPreviousArgTab[i].str) && j == argDependingOnPreviousArgTab[i].i)
1107 static void fprintf_prototype_args(FILE* f, FuncDesc* funcDesc)
1110 for(j=0;j<funcDesc->nargs;j++)
1112 if (j != 0) fprintf(f,", ");
1113 if (strstr(funcDesc->args[j], "[16]"))
1115 if (strstr(funcDesc->args[j], "float"))
1117 fprintf(f, "const GLfloat arg_%d[16]", j);
1119 else if (strstr(funcDesc->args[j], "double"))
1121 fprintf(f, "const GLdouble arg_%d[16]", j);
1128 else if (strstr(funcDesc->args[j], "[128]") && strstr(funcDesc->args[j], "GLubyte"))
1129 fprintf(f, (strstr(funcDesc->args[j], "const")) ? "const GLubyte* arg_%d" : "GLubyte* arg_%d", j);
1131 fprintf(f, "%s arg_%d", funcDesc->args[j], j);
1135 static void gen_mangled_gl(FuncDesc *funcs_p, int func_cnt)
1138 FILE *header = fopen("gl_mangled.h", "w");
1139 FILE *source = fopen("gl_mangled.c", "w");
1142 assert(header && source);
1144 /* Manually add glGetString */
1145 args = malloc(1 * sizeof(char*));
1146 args[0] = strdup("GLenum");
1147 funcs_p[func_cnt].type = strdup("const GLubyte *");
1148 funcs_p[func_cnt].name = strdup("glGetString");
1149 funcs_p[func_cnt].nargs = 1;
1150 funcs_p[func_cnt].args = args;
1153 fprintf(header, "/* This file is generated by parse_gl_h.c - DO NOT EDIT ! */\n\n");
1154 fprintf(header, "#include <GL/gl.h>\n\n");
1155 fprintf(header, "typedef struct mglHDL {\n");
1157 for (i = 0; i < func_cnt; ++i) {
1158 fprintf(header, "\t%s (*%s)(", funcs_p[i].type, funcs_p[i].name);
1159 if (funcs_p[i].nargs == 1 && !strncmp(funcs_p[i].args[0], "void", 4)) {
1160 free(funcs_p[i].args[0]);
1161 funcs_p[i].nargs = 0;
1162 fprintf(header, "void");
1164 fprintf_prototype_args(header, &funcs_p[i]);
1165 fprintf(header, ");\n");
1167 fprintf(header, "} mglHDL;\n\n");
1169 fprintf(header, "extern mglHDL mgl_hdl;\n\n");
1170 fprintf(header, "int mgl_load_symbols(const char *libname);\n");
1171 fprintf(header, "int mgl_unload(void);\n\n");
1173 for (i = 0; i < func_cnt; ++i) {
1174 fprintf(header, "#define %s mgl_hdl.%s\n", funcs_p[i].name, funcs_p[i].name);
1177 fprintf(header, "\n");
1179 fprintf(source, "/* This file is generated by parse_gl_h.c - DO NOT EDIT ! */\n\n");
1180 fprintf(source, "#include <stdio.h>\n#include \"gl_mangled.h\"\n\n");
1181 fprintf(source, "#ifdef _WIN32\n#include <Windows.h>\n"
1182 "typedef HINSTANCE handle_t;\n#else\n#include <dlfcn.h>\n"
1183 "typedef void * handle_t;\n#endif\n\n");
1184 fprintf(source, "mglHDL mgl_hdl;\n");
1185 fprintf(source, "static handle_t mgl_lib_hdl;\n\n");
1187 fprintf(source, "static inline handle_t mgl_load_lib(const char *libname)\n{\n"
1188 "#ifdef _WIN32\n\treturn LoadLibrary(libname);\n"
1189 "#else\n\treturn dlopen(libname, RTLD_LAZY | RTLD_LOCAL);\n"
1192 fprintf(source, "static inline void *mgl_load_sym(const char *symname)\n{\n"
1193 "#ifdef _WIN32\n\treturn GetProcAddress(mgl_lib_hdl, symname);\n"
1194 "#else\n\treturn dlsym(mgl_lib_hdl, symname);\n"
1197 fprintf(source, "int mgl_unload(void)\n{\n"
1198 "#ifdef _WIN32\n\treturn FreeLibrary(mgl_lib_hdl);\n"
1199 "#else\n\treturn dlclose(mgl_lib_hdl);\n"
1202 fprintf(source, "int mgl_load_symbols(const char *libname)\n{\n"
1203 "\tif (!(mgl_lib_hdl = mgl_load_lib(libname))) {\n"
1204 "\t\tfprintf(stderr, \"ERROR: Couldn't load %%s library!\\n\", libname);\n"
1205 "\t\treturn 1;\n\t}\n\n");
1207 for (i = 0; i < func_cnt; ++i) {
1208 fprintf(source, "\tif (!(%s = mgl_load_sym(\"%s\"))) {\n"
1209 "\t\tmgl_unload();\n\t\t"
1210 "fprintf(stderr, \"function %s not found!\\n\");\n\t\treturn 1;\n\t}\n\n",
1211 funcs_p[i].name, funcs_p[i].name, funcs_p[i].name);
1214 fprintf(source, "\treturn 0;\n}\n");
1216 for (i = 0; i < func_cnt; ++i) {
1217 free(funcs_p[func_cnt].name);
1218 free(funcs_p[func_cnt].type);
1219 for (; funcs_p[func_cnt].nargs; --funcs_p[func_cnt].nargs) {
1220 free(funcs_p[func_cnt].args[funcs_p[func_cnt].nargs - 1]);
1222 free(funcs_p[func_cnt].args);
1229 int main(int argc, char* argv[])
1231 FuncDesc funcDesc[3000];
1232 int funcDescCount = 0;
1235 printf("***** path : %s\n", GL_INCLUDE_PATH"mesa_gl.h");
1236 f = fopen(GL_INCLUDE_PATH"mesa_gl.h", "r");
1239 f = fopen("/usr/include/GL/gl.h", "r");*/
1240 funcDescCount = parse(f, funcDesc, 0, 1);
1243 if ((argc > 1) && !strncmp(argv[1], "mangle", 6)) {
1244 gen_mangled_gl(funcDesc, funcDescCount);
1248 f = fopen(GL_INCLUDE_PATH"mesa_glext.h", "r");
1251 f = fopen("/usr/include/GL/glext.h", "r");*/
1252 funcDescCount = parse(f, funcDesc, funcDescCount, 0);
1255 FILE* header = fopen("gl_func.h", "w");
1256 FILE* client_stub = fopen("client_stub.c", "w");
1257 FILE* server_stub = fopen("server_stub.c", "w");
1259 fprintf(header, "/* This is a generated file by parse_gl_h.c - DO NOT EDIT ! */\n\n");
1260 fprintf(header, "union gl_ret_type {\n"
1266 fprintf(header, "#define COMPOSE(x,y) x##y\n");
1267 fprintf(header, "#define MAGIC_MACRO(x) COMPOSE(x,_func)\n");
1268 fprintf(header, "enum {\n"
1269 "#include \"gl_func_perso.h\"\n");
1271 fprintf(client_stub, "/* This is a generated file by parse_gl_h.c - DO NOT EDIT ! */\n\n");
1273 fprintf(server_stub, "/* This is a generated file by parse_gl_h.c - DO NOT EDIT ! */\n\n");
1276 for(i=0;i<funcDescCount;i++)
1279 char* name = funcDesc[i].name;
1280 char* type = funcDesc[i].type;
1281 if ((strcmp(type, "void") == 0 || strcmp(type, "GLboolean") == 0 ||
1282 strcmp(type, "GLuint") == 0 || strcmp(type, "GLint") == 0 ||
1283 strcmp(type, "GLenum") == 0) || strcmp(type, "GLhandleARB") == 0 ||
1284 strcmp(type, "GLhalf") == 0 || strcmp(type, "GLhalfNV") == 0)
1286 int pointer_of_unknown_size = 0;
1289 if (funcDesc[i].nargs == 1 && strcmp(funcDesc[i].args[0], "void") == 0)
1291 funcDesc[i].nargs = 0;
1293 for(j=0;j<funcDesc[i].nargs-1;j++)
1295 if (!is_arg_of_length_depending_on_previous_args(&funcDesc[i], j) &&
1296 strstr(funcDesc[i].args[j], "const GLchar") == NULL &&
1297 strstr(funcDesc[i].args[j], "[16]") == NULL)
1299 pointer_of_unknown_size |= strstr(funcDesc[i].args[j], "*") != NULL;
1300 pointer_of_unknown_size |= strstr(funcDesc[i].args[j], "[") != NULL;
1304 if (pointer_of_unknown_size == 0)
1306 char* signature_type_name;
1307 if (is_known_arg_vector(&funcDesc[i], &signature_type_name, NULL))
1309 if (strstr(signature_type_name, "TYPE_OUT"))
1310 funcDesc[i].has_out_parameters = 1;
1314 if (funcDesc[i].nargs-1 >= 0)
1316 j = funcDesc[i].nargs-1;
1317 if (!is_arg_of_length_depending_on_previous_args(&funcDesc[i], j) &&
1318 strstr(funcDesc[i].args[j], "const GLchar") == NULL &&
1319 strstr(funcDesc[i].args[j], "[16]") == NULL)
1321 pointer_of_unknown_size |= strstr(funcDesc[i].args[j], "*") != NULL;
1322 pointer_of_unknown_size |= strstr(funcDesc[i].args[j], "[") != NULL;
1327 if (pointer_of_unknown_size && funcDesc[i].nargs == 1)
1329 if (strstr(funcDesc[i].name, "Matrixf") || strstr(funcDesc[i].name, "Matrixd"))
1331 free(funcDesc[i].args[0]);
1332 if (strstr(funcDesc[i].name, "Matrixf"))
1333 funcDesc[i].args[0] = strdup("GLfloat m[16]");
1335 funcDesc[i].args[0] = strdup("GLdouble m[16]");
1336 pointer_of_unknown_size = 0;
1338 else if (strcmp(funcDesc[i].name, "glPolygonStipple") == 0)
1340 free(funcDesc[i].args[0]);
1341 funcDesc[i].args[0] = strdup("const GLubyte mask[128]");
1342 pointer_of_unknown_size = 0;
1344 else if (strcmp(funcDesc[i].name, "glGetPolygonStipple") == 0)
1346 free(funcDesc[i].args[0]);
1347 funcDesc[i].args[0] = strdup("GLubyte mask[128]");
1348 funcDesc[i].has_out_parameters = 1;
1349 pointer_of_unknown_size = 0;
1352 if (just_for_server_side_func(name) || pointer_of_unknown_size == 0)
1354 fprintf(header, " %s_func,\n", funcDesc[i].name);
1356 if (just_for_server_side_func(name))
1357 funcDesc[i].just_for_server_side = 1;
1358 for(j=0;j<funcDesc[i].nargs;j++)
1360 if (strstr(get_type_string(funcDesc[i].args[j]), "OUT"))
1361 funcDesc[i].has_out_parameters = 1;
1366 fprintf(stderr, "not handled either manually or automatically : %s\n", funcDesc[i].name);
1371 fprintf(header, " GL_N_CALLS\n};\n");
1374 fprintf(server_stub, "void execute_func(int func_number, void **args, union gl_ret_type *pret)\n");
1375 fprintf(server_stub, "{\n");
1376 fprintf(server_stub, " switch(func_number)\n");
1377 fprintf(server_stub, " {\n");
1380 for(i=0;i<funcDescCount;i++)
1384 fprintf(header, "static const int %s_signature[] = { %s, %d, ",
1386 get_type_string(funcDesc[i].type),
1387 funcDesc[i].has_out_parameters);
1388 fprintf(header, "%d", funcDesc[i].nargs);
1390 char* signature_type_name;
1391 int n_args_to_check = is_known_arg_vector(&funcDesc[i], &signature_type_name, NULL) ? funcDesc[i].nargs - 1 : funcDesc[i].nargs;
1393 for(j=0;j<n_args_to_check;j++)
1395 if (is_arg_of_length_depending_on_previous_args(&funcDesc[i], j))
1397 fprintf(header, ", %s_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS", get_type_string(funcDesc[i].args[j]));
1400 fprintf(header, ", %s", get_type_string(funcDesc[i].args[j]));
1403 if (is_known_arg_vector(&funcDesc[i], &signature_type_name, NULL))
1405 fprintf(header, ", %s", signature_type_name);
1407 fprintf(header, "};\n");
1410 if (funcDesc[i].just_for_server_side == 0)
1412 if (isExt(&funcDesc[i]))
1413 fprintf(client_stub, "GLAPI %s APIENTRY EXT_FUNC(%s) (", funcDesc[i].type, funcDesc[i].name);
1415 fprintf(client_stub, "GLAPI %s APIENTRY %s(", funcDesc[i].type, funcDesc[i].name);
1416 fprintf_prototype_args(client_stub, &funcDesc[i]);
1417 fprintf(client_stub, ")\n");
1418 fprintf(client_stub, "{\n");
1419 if (strcmp(funcDesc[i].type, "void") != 0)
1421 fprintf(client_stub, " %s ret;\n", funcDesc[i].type);
1422 if (isExt(&funcDesc[i]))
1423 fprintf(client_stub, " CHECK_PROC_WITH_RET(%s);\n", funcDesc[i].name);
1427 if (isExt(&funcDesc[i]))
1428 fprintf(client_stub, " CHECK_PROC(%s);\n", funcDesc[i].name);
1432 fprintf(client_stub, " do_opengl_call(%s_func, %s",
1433 funcDesc[i].name, (strcmp(funcDesc[i].type, "void") == 0) ? "NULL" : "&ret");
1434 for(j=0;j<funcDesc[i].nargs;j++)
1436 fprintf(client_stub, ", arg_%d", j);
1438 fprintf(client_stub, ");\n");
1441 if (funcDesc[i].nargs)
1443 fprintf(client_stub, " long args[] = { ");
1444 for(j=0;j<funcDesc[i].nargs;j++)
1446 if (j > 0) fprintf(client_stub, ", ");
1447 if (strstr(funcDesc[i].args[j], "*"))
1449 fprintf(client_stub, "POINTER_TO_ARG(arg_%d)", j);
1453 const char* symbolic_type = get_type_string(funcDesc[i].args[j]);
1454 if (strcmp(symbolic_type, "TYPE_CHAR") == 0)
1455 fprintf(client_stub, "CHAR_TO_ARG");
1456 else if (strcmp(symbolic_type, "TYPE_UNSIGNED_CHAR") == 0)
1457 fprintf(client_stub, "UNSIGNED_CHAR_TO_ARG");
1458 else if (strcmp(symbolic_type, "TYPE_SHORT") == 0)
1459 fprintf(client_stub, "SHORT_TO_ARG");
1460 else if (strcmp(symbolic_type, "TYPE_UNSIGNED_SHORT") == 0)
1461 fprintf(client_stub, "UNSIGNED_SHORT_TO_ARG");
1462 else if (strcmp(symbolic_type, "TYPE_INT") == 0)
1463 fprintf(client_stub, "INT_TO_ARG");
1464 else if (strcmp(symbolic_type, "TYPE_UNSIGNED_INT") == 0)
1465 fprintf(client_stub, "UNSIGNED_INT_TO_ARG");
1466 else if (strcmp(symbolic_type, "TYPE_FLOAT") == 0)
1467 fprintf(client_stub, "FLOAT_TO_ARG");
1468 else if (strcmp(symbolic_type, "TYPE_16FLOAT") == 0)
1469 fprintf(client_stub, "POINTER_TO_ARG");
1470 else if (strcmp(symbolic_type, "TYPE_DOUBLE") == 0)
1471 fprintf(client_stub, "DOUBLE_TO_ARG");
1472 else if ( strcmp(symbolic_type, "TYPE_16DOUBLE") == 0)
1473 fprintf(client_stub, "POINTER_TO_ARG");
1474 else if ( strcmp(symbolic_type, "TYPE_128UCHAR") == 0 || strcmp(symbolic_type, "TYPE_OUT_128UCHAR") == 0)
1475 fprintf(client_stub, "POINTER_TO_ARG");
1478 fprintf(stderr, "Unknown : %s\n", symbolic_type);
1481 fprintf(client_stub, "(arg_%d)", j);
1484 fprintf(client_stub, "};\n");
1487 fprintf(client_stub, " do_opengl_call(%s_func, %s, %s, NULL);\n",
1488 funcDesc[i].name, (strcmp(funcDesc[i].type, "void") == 0) ? "NULL" : "&ret",
1489 (funcDesc[i].nargs) ? "args" : "NULL");
1491 if (strcmp(funcDesc[i].type, "void") != 0)
1493 fprintf(client_stub, " return ret;\n");
1495 fprintf(client_stub, "}\n\n");
1498 fprintf(server_stub, " case %s_func:\n", funcDesc[i].name);
1499 fprintf(server_stub, " {\n");
1501 if (isExt(&funcDesc[i]))
1503 fprintf(server_stub, " GET_EXT_PTR(%s, %s, (", funcDesc[i].type, funcDesc[i].name);
1504 fprintf_prototype_args(server_stub, &funcDesc[i]);
1505 fprintf(server_stub, "));\n");
1508 fprintf(server_stub, " ");
1510 if (strcmp(funcDesc[i].type, "void") == 0)
1512 else if (strcmp(get_type_string(funcDesc[i].type), "TYPE_INT") == 0 ||
1513 strcmp(get_type_string(funcDesc[i].type), "TYPE_UNSIGNED_INT") == 0)
1514 fprintf(server_stub, "pret->i = ");
1515 else if (strcmp(get_type_string(funcDesc[i].type), "TYPE_CHAR") == 0 ||
1516 strcmp(get_type_string(funcDesc[i].type), "TYPE_UNSIGNED_CHAR") == 0)
1517 fprintf(server_stub, "pret->c = ");
1520 fprintf(stderr, "unknown ret type = %s\n", get_type_string(funcDesc[i].type));
1523 /*if (strstr(funcDesc[i].name, "EXT"))
1525 char* dup = strdup(funcDesc[i].name);
1526 *strstr(dup, "EXT") = 0;
1527 fprintf(server_stub, "%s(", dup);
1532 if (isExt(&funcDesc[i]))
1533 fprintf(server_stub, "ptr_func_%s(", funcDesc[i].name);
1535 fprintf(server_stub, "%s(", funcDesc[i].name);
1538 if (is_known_arg_vector(&funcDesc[i], NULL, &c_type_name))
1540 for(j=0;j<funcDesc[i].nargs - 1;j++)
1542 if (j != 0) fprintf(server_stub,", ");
1543 print_server_side_argument(server_stub, j, funcDesc[i].args[j]);
1545 if (j != 0) fprintf(server_stub,", ");
1546 if (strstr(funcDesc[i].args[funcDesc[i].nargs - 1], "const"))
1547 fprintf(server_stub, "(const %s*)args[%d]", c_type_name, j);
1549 fprintf(server_stub, "(%s*)args[%d]", c_type_name, j);
1553 for(j=0;j<funcDesc[i].nargs;j++)
1555 if (j != 0) fprintf(server_stub,", ");
1556 print_server_side_argument(server_stub, j, funcDesc[i].args[j]);
1559 fprintf(server_stub, ");\n");
1561 fprintf(server_stub, " break;\n");
1562 fprintf(server_stub, " }\n");
1566 fprintf(server_stub, " default:\n");
1567 fprintf(server_stub, " DEBUGF(\"unknown=%%d\", func_number);\n");
1568 fprintf(server_stub, " break;\n");
1569 fprintf(server_stub, " }\n");
1570 fprintf(server_stub, "}\n");
1572 fprintf(header, "#undef MAGIC_MACRO\n");
1573 fprintf(header, "#define MAGIC_MACRO(x) COMPOSE(x,_signature)\n");
1574 fprintf(header, "static const int* tab_opengl_calls[GL_N_CALLS] =\n");
1575 fprintf(header, "{\n");
1576 fprintf(header, "#include \"gl_func_perso.h\"\n");
1577 for(i=0;i<funcDescCount;i++)
1581 fprintf(header, " %s_signature,\n", funcDesc[i].name);
1584 fprintf(header, "};\n\n");
1586 fprintf(header, "#undef MAGIC_MACRO\n");
1587 fprintf(header, "#define MAGIC_MACRO(x) #x\n");
1588 fprintf(header, "static const char* tab_opengl_calls_name[GL_N_CALLS] =\n");
1589 fprintf(header, "{\n");
1590 fprintf(header, "#include \"gl_func_perso.h\"\n");
1591 for(i=0;i<funcDescCount;i++)
1595 fprintf(header, " \"%s\",\n", funcDesc[i].name);
1598 fprintf(header, "};\n\n");
1601 fclose(server_stub);
1602 fclose(client_stub);