Tizen 2.1 base
[sdk/emulator/qemu.git] / target-i386 / opengl_func.h
1 /*
2  *  Main header for both host and guest sides
3  * 
4  *  Copyright (c) 2006,2007 Even Rouault
5  *
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:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
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
22  * THE SOFTWARE.
23  */
24
25 #include "mesa_gl.h"
26 #include "mesa_glext.h"
27 #include "opengl_server.h"
28
29 /* To remove GCC warnings */
30 //extern void opengl_exec_set_parent_window(Display* _dpy, Window _parent_window);
31 extern void opengl_exec_set_parent_window(OGLS_Conn *pConn, Window _parent_window);
32 extern void opengl_exec_set_local_connection(void);
33
34 //#ifdef _WIN32
35 //extern int do_function_call(Display dpy, int func_number, int pid, int* args, char* ret_string);
36 //#else
37 //extern int do_function_call(Display* dpy, int func_number, int pid, long* args, char* ret_string);
38 //#endif
39
40 extern int do_function_call(OGLS_Conn *, int, int, long*, char*);
41 extern void execute_func(int func_number, long* args, int* pret_int, char* pret_char);
42 extern void create_process_tab( OGLS_Conn *pConn );
43 extern void remove_process_tab( OGLS_Conn *pConn );
44
45 enum
46 {
47         TYPE_NONE,
48         TYPE_CHAR,
49         TYPE_UNSIGNED_CHAR,
50         TYPE_SHORT,
51         TYPE_UNSIGNED_SHORT,
52         TYPE_INT,
53         TYPE_UNSIGNED_INT,
54         TYPE_FLOAT,
55         TYPE_DOUBLE,
56         TYPE_1CHAR,
57         TYPE_2CHAR,
58         TYPE_3CHAR,
59         TYPE_4CHAR,
60         TYPE_128UCHAR,
61         TYPE_1SHORT,
62         TYPE_2SHORT,
63         TYPE_3SHORT,
64         TYPE_4SHORT,
65         TYPE_1INT,
66         TYPE_2INT,
67         TYPE_3INT,
68         TYPE_4INT,
69         TYPE_1FLOAT,
70         TYPE_2FLOAT,
71         TYPE_3FLOAT,
72         TYPE_4FLOAT,
73         TYPE_16FLOAT,
74         TYPE_1DOUBLE,
75         TYPE_2DOUBLE,
76         TYPE_3DOUBLE,
77         TYPE_4DOUBLE,
78         TYPE_16DOUBLE,
79         TYPE_OUT_1INT,
80         TYPE_OUT_1FLOAT,
81         TYPE_OUT_4CHAR,
82         TYPE_OUT_4INT,
83         TYPE_OUT_4FLOAT,
84         TYPE_OUT_4DOUBLE,
85         TYPE_OUT_128UCHAR,
86         TYPE_CONST_CHAR,
87         TYPE_ARRAY_CHAR,
88         TYPE_ARRAY_SHORT,
89         TYPE_ARRAY_INT,
90         TYPE_ARRAY_FLOAT,
91         TYPE_ARRAY_DOUBLE,
92         TYPE_IN_IGNORED_POINTER,
93         TYPE_OUT_ARRAY_CHAR,
94         TYPE_OUT_ARRAY_SHORT,
95         TYPE_OUT_ARRAY_INT,
96         TYPE_OUT_ARRAY_FLOAT,
97         TYPE_OUT_ARRAY_DOUBLE,
98         TYPE_NULL_TERMINATED_STRING,
99
100         TYPE_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
101         TYPE_ARRAY_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
102         TYPE_ARRAY_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
103         TYPE_ARRAY_FLOAT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
104         TYPE_ARRAY_DOUBLE_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
105         TYPE_OUT_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
106         TYPE_OUT_ARRAY_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
107         TYPE_OUT_ARRAY_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
108         TYPE_OUT_ARRAY_FLOAT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
109         TYPE_OUT_ARRAY_DOUBLE_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
110         /* .... */
111         TYPE_LAST,
112         /* .... */
113         TYPE_1UCHAR = TYPE_CHAR,
114         TYPE_1USHORT = TYPE_1SHORT,
115         TYPE_1UINT = TYPE_1INT,
116         TYPE_OUT_1UINT = TYPE_OUT_1INT,
117         TYPE_OUT_4UCHAR = TYPE_OUT_4CHAR,
118         TYPE_ARRAY_VOID = TYPE_ARRAY_CHAR,
119         TYPE_ARRAY_SIGNED_CHAR = TYPE_ARRAY_CHAR,
120         TYPE_ARRAY_UNSIGNED_CHAR = TYPE_ARRAY_CHAR,
121         TYPE_ARRAY_UNSIGNED_SHORT = TYPE_ARRAY_SHORT,
122         TYPE_ARRAY_UNSIGNED_INT = TYPE_ARRAY_INT,
123         TYPE_OUT_ARRAY_VOID = TYPE_OUT_ARRAY_CHAR,
124         TYPE_OUT_ARRAY_SIGNED_CHAR = TYPE_OUT_ARRAY_CHAR,
125         TYPE_OUT_ARRAY_UNSIGNED_CHAR = TYPE_OUT_ARRAY_CHAR,
126         TYPE_OUT_ARRAY_UNSIGNED_SHORT = TYPE_OUT_ARRAY_SHORT,
127         TYPE_OUT_ARRAY_UNSIGNED_INT = TYPE_OUT_ARRAY_INT,
128         TYPE_ARRAY_VOID_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
129         TYPE_ARRAY_SIGNED_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
130         TYPE_ARRAY_UNSIGNED_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
131         TYPE_ARRAY_UNSIGNED_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_ARRAY_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
132         TYPE_ARRAY_UNSIGNED_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_ARRAY_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
133         TYPE_OUT_ARRAY_VOID_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_OUT_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
134         TYPE_OUT_ARRAY_SIGNED_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_OUT_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
135         TYPE_OUT_ARRAY_UNSIGNED_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_OUT_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
136         TYPE_OUT_ARRAY_UNSIGNED_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_OUT_ARRAY_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
137         TYPE_OUT_ARRAY_UNSIGNED_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS = TYPE_OUT_ARRAY_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS,
138 };  
139
140 #define CASE_IN_LENGTH_DEPENDING_ON_PREVIOUS_ARGS \
141         case TYPE_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
142 case TYPE_ARRAY_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
143 case TYPE_ARRAY_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
144 case TYPE_ARRAY_FLOAT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
145 case TYPE_ARRAY_DOUBLE_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS
146
147 #define CASE_OUT_LENGTH_DEPENDING_ON_PREVIOUS_ARGS \
148         case TYPE_OUT_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
149 case TYPE_OUT_ARRAY_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
150 case TYPE_OUT_ARRAY_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
151 case TYPE_OUT_ARRAY_FLOAT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS: \
152 case TYPE_OUT_ARRAY_DOUBLE_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS
153
154 #define CASE_IN_UNKNOWN_SIZE_POINTERS \
155         case TYPE_ARRAY_CHAR: \
156 case TYPE_ARRAY_SHORT: \
157 case TYPE_ARRAY_INT: \
158 case TYPE_ARRAY_FLOAT: \
159 case TYPE_ARRAY_DOUBLE
160
161 #define CASE_IN_KNOWN_SIZE_POINTERS \
162         case TYPE_1CHAR:\
163 case TYPE_2CHAR:\
164 case TYPE_3CHAR:\
165 case TYPE_4CHAR:\
166 case TYPE_128UCHAR:\
167 case TYPE_1SHORT:\
168 case TYPE_2SHORT:\
169 case TYPE_3SHORT:\
170 case TYPE_4SHORT:\
171 case TYPE_1INT:\
172 case TYPE_2INT:\
173 case TYPE_3INT:\
174 case TYPE_4INT:\
175 case TYPE_1FLOAT:\
176 case TYPE_2FLOAT:\
177 case TYPE_3FLOAT:\
178 case TYPE_4FLOAT:\
179 case TYPE_16FLOAT:\
180 case TYPE_1DOUBLE:\
181 case TYPE_2DOUBLE:\
182 case TYPE_3DOUBLE:\
183 case TYPE_4DOUBLE:\
184 case TYPE_16DOUBLE
185
186 #define CASE_OUT_UNKNOWN_SIZE_POINTERS \
187         case TYPE_OUT_ARRAY_CHAR: \
188 case TYPE_OUT_ARRAY_SHORT: \
189 case TYPE_OUT_ARRAY_INT: \
190 case TYPE_OUT_ARRAY_FLOAT: \
191 case TYPE_OUT_ARRAY_DOUBLE
192
193 #define CASE_OUT_KNOWN_SIZE_POINTERS \
194         case TYPE_OUT_1INT: \
195 case TYPE_OUT_1FLOAT: \
196 case TYPE_OUT_4CHAR: \
197 case TYPE_OUT_4INT: \
198 case TYPE_OUT_4FLOAT: \
199 case TYPE_OUT_4DOUBLE: \
200 case TYPE_OUT_128UCHAR \
201
202 #define CASE_IN_POINTERS CASE_IN_UNKNOWN_SIZE_POINTERS: CASE_IN_KNOWN_SIZE_POINTERS: CASE_IN_LENGTH_DEPENDING_ON_PREVIOUS_ARGS
203 #define CASE_OUT_POINTERS CASE_OUT_UNKNOWN_SIZE_POINTERS: CASE_OUT_KNOWN_SIZE_POINTERS: CASE_OUT_LENGTH_DEPENDING_ON_PREVIOUS_ARGS
204
205 #define CASE_POINTERS CASE_IN_POINTERS: CASE_OUT_POINTERS
206 #define CASE_KNOWN_SIZE_POINTERS CASE_IN_KNOWN_SIZE_POINTERS: CASE_OUT_KNOWN_SIZE_POINTERS
207
208
209 #define IS_ARRAY_CHAR(type)  (type == TYPE_ARRAY_CHAR || type == TYPE_1CHAR || type == TYPE_2CHAR || type == TYPE_3CHAR || type == TYPE_4CHAR || type == TYPE_ARRAY_CHAR_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS)
210 #define IS_ARRAY_SHORT(type)  (type == TYPE_ARRAY_SHORT || type == TYPE_1SHORT || type == TYPE_2SHORT || type == TYPE_3SHORT || type == TYPE_4SHORT || type == TYPE_ARRAY_SHORT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS)
211 #define IS_ARRAY_INT(type)  (type == TYPE_ARRAY_INT || type == TYPE_1INT || type == TYPE_2INT || type == TYPE_3INT || type == TYPE_4INT || type == TYPE_ARRAY_INT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS)
212 #define IS_ARRAY_FLOAT(type)  (type == TYPE_ARRAY_FLOAT || type == TYPE_1FLOAT || type == TYPE_2FLOAT || type == TYPE_3FLOAT || type == TYPE_4FLOAT || type == TYPE_16FLOAT || type == TYPE_ARRAY_FLOAT_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS)
213 #define IS_ARRAY_DOUBLE(type)  (type == TYPE_ARRAY_DOUBLE || type == TYPE_1DOUBLE || type == TYPE_2DOUBLE || type == TYPE_3DOUBLE || type == TYPE_4DOUBLE || type == TYPE_16DOUBLE || type == TYPE_ARRAY_DOUBLE_OF_LENGTH_DEPENDING_ON_PREVIOUS_ARGS)
214
215 #define NB_MAX_TEXTURES 16
216 #define MY_GL_MAX_VERTEX_ATTRIBS_ARB 16
217 #define MY_GL_MAX_VERTEX_ATTRIBS_NV 16
218 #define MY_GL_MAX_VARIANT_POINTER_EXT 16
219
220 static int tab_args_type_length[] =
221 {
222         0,
223         sizeof(char),
224         sizeof(unsigned char),
225         sizeof(short),
226         sizeof(unsigned short),
227         sizeof(int),
228         sizeof(unsigned int),
229         sizeof(float),
230         sizeof(double),
231         1 * sizeof(char),
232         2 * sizeof(char),
233         3 * sizeof(char),
234         4 * sizeof(char),
235         128 * sizeof(char),
236         1 * sizeof(short),
237         2 * sizeof(short),
238         3 * sizeof(short),
239         4 * sizeof(short),
240         1 * sizeof(int),
241         2 * sizeof(int),
242         3 * sizeof(int),
243         4 * sizeof(int),
244         1 * sizeof(float),
245         2 * sizeof(float),
246         3 * sizeof(float),
247         4 * sizeof(float),
248         16 * sizeof(float),
249         1 * sizeof(double),
250         2 * sizeof(double),
251         3 * sizeof(double),
252         4 * sizeof(double),
253         16 * sizeof(double),
254         sizeof(int),
255         sizeof(float),
256         4 * sizeof(char),
257         4 * sizeof(int),
258         4 * sizeof(float),
259         4 * sizeof(double),
260         128 * sizeof(char),
261         0,
262         0,
263         0,
264         0,
265         0,
266         0,
267         0,
268         0,
269         0,
270         0,
271         0,
272         0,
273         0,
274
275         /* the following sizes are the size of 1 element of the array */
276         sizeof(char), 
277         sizeof(short),
278         sizeof(int),
279         sizeof(float),
280         sizeof(double),
281         sizeof(char),
282         sizeof(short),
283         sizeof(int),
284         sizeof(float),
285         sizeof(double),
286 };
287
288 typedef struct
289 {
290         int ret_type;
291         int has_out_parameters;
292         int nb_args;
293         int args_type[0];
294 } Signature;
295
296 static const int _init_signature[] = { TYPE_NONE, 1, 2, TYPE_INT, TYPE_OUT_1INT};
297
298 static const int _synchronize_signature[] = { TYPE_INT, 0, 0 };
299
300 static const int _serialized_calls_signature[] = { TYPE_NONE, 0, 1, TYPE_ARRAY_CHAR };
301
302 static const int _exit_process_signature[] = {TYPE_NONE, 0, 0};
303
304 static const int _changeWindowState_signature[] = {TYPE_NONE, 0, 2, TYPE_INT, TYPE_INT};
305
306 static const int _moveResizeWindow_signature[] = {TYPE_NONE, 0, 2, TYPE_INT, TYPE_4INT};
307
308 static const int _send_cursor_signature[] = {TYPE_NONE, 0, 7, TYPE_INT, TYPE_INT,
309         TYPE_INT, TYPE_INT,
310         TYPE_INT, TYPE_INT,
311         TYPE_ARRAY_INT };
312
313 /* XVisualInfo* glXChooseVisual( Display *dpy, int screen, int *attribList ) */
314 static const int glXChooseVisual_signature[] = {TYPE_INT, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_ARRAY_INT };
315
316 /*GLXContext glXCreateContext( Display *dpy, XVisualInfo *vis,
317   GLXContext shareList, Bool direct )*/
318 static const int glXCreateContext_signature[] = {TYPE_INT, 0, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT};
319
320 static const int glXCopyContext_signature[] = {TYPE_NONE, 0, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT};
321
322 /* void glXDestroyContext( Display *dpy, GLXContext ctx ) */
323 static const int glXDestroyContext_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
324
325 /* Bool glXMakeCurrent( Display *dpy, GLXDrawable drawable, GLXContext ctx) */
326 //static const int glXMakeCurrent_signature[] = {TYPE_INT, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT};
327 /* making it asynchronous */
328 static const int glXMakeCurrent_signature[] = {TYPE_NONE, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT};
329
330 /*int glXGetConfig( Display *dpy, XVisualInfo *visual,
331   int attrib, int *value )*/
332 static const int glXGetConfig_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
333
334 /* "glXGetConfig_extended"(dpy, visual_id, int n, int* attribs, int* values, int* rets) */
335 static const int glXGetConfig_extended_signature[] = {TYPE_NONE, 1, 6, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_ARRAY_INT, TYPE_OUT_ARRAY_INT, TYPE_OUT_ARRAY_INT};
336
337 /* void glXSwapBuffers( Display *dpy, GLXDrawable drawable ); */
338 static const int glXSwapBuffers_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
339
340 /* Bool glXQueryVersion( Display *dpy, int *maj, int *min ) */
341 static const int glXQueryVersion_signature[] = {TYPE_INT, 1, 3, TYPE_IN_IGNORED_POINTER, TYPE_OUT_1INT, TYPE_OUT_1INT};
342
343 /* Bool glXQueryExtension( Display *dpy, int *errorBase, int *eventBase ) */
344 static const int glXQueryExtension_signature[] = {TYPE_INT, 1, 3, TYPE_IN_IGNORED_POINTER, TYPE_OUT_1INT, TYPE_OUT_1INT};
345
346 static const int glXWaitGL_signature[] = { TYPE_INT, 0, 0 };
347 static const int glXWaitX_signature[] = { TYPE_INT, 0, 0 };
348
349 /* GLX 1.1 and later */
350
351 /* const char *glXGetClientString( Display *dpy, int name ) */
352 static const int glXGetClientString_signature[] = {TYPE_CONST_CHAR, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
353
354 /*const char *glXQueryExtensionsString( Display *dpy, int screen ) */
355 static const int glXQueryExtensionsString_signature[] = {TYPE_CONST_CHAR, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
356
357 /* const char *glXQueryServerString( Display *dpy, int screen, int name ) */
358 static const int glXQueryServerString_signature[] = {TYPE_CONST_CHAR, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT};
359
360
361 static const int glXGetProcAddress_fake_signature[] = {TYPE_INT, 0, 1, TYPE_NULL_TERMINATED_STRING};
362
363 static const int glXGetProcAddress_global_fake_signature[] = {TYPE_NONE, 1, 3, TYPE_INT, TYPE_ARRAY_CHAR, TYPE_OUT_ARRAY_CHAR};
364
365
366 /* GLX 1.3 and later */
367
368 /*
369    GLXFBConfig *glXChooseFBConfig( Display *dpy, int screen,
370    const int *attribList, int *nitems ); */
371 static const int glXChooseFBConfig_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_ARRAY_INT, TYPE_OUT_1INT};
372
373 static const int glXChooseFBConfigSGIX_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_ARRAY_INT, TYPE_OUT_1INT};
374
375 static const int glXGetFBConfigs_signature[] = {TYPE_INT, 1, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_OUT_1INT};
376
377 /* "glXGetFBConfigAttrib_extended"(dpy, fbconfig, int n, int* attribs, int* values, int* rets) */
378 static const int glXGetFBConfigAttrib_extended_signature[] = {TYPE_NONE, 1, 6, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_ARRAY_INT, TYPE_OUT_ARRAY_INT, TYPE_OUT_ARRAY_INT};
379
380 static const int glXDestroyWindow_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT}; // mkjung
381
382
383 /* GLXPbuffer glXCreatePbuffer( Display *dpy, GLXFBConfig config,
384    const int *attribList ) */
385 static const int glXCreatePbuffer_signature[] = {TYPE_INT, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_ARRAY_INT};
386
387 static const int glXCreateGLXPbufferSGIX_signature[] = {TYPE_INT, 0, 5, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_INT};
388
389 static const int glXDestroyPbuffer_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
390
391 static const int glXDestroyGLXPbufferSGIX_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
392
393 /* GLXContext glXCreateNewContext(Display * dpy
394    GLXFBConfig  config
395    int  renderType
396    GLXContext  ShareList
397    Bool  Direct) */
398 static const int glXCreateNewContext_signature[] = {TYPE_INT, 0, 5, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
399
400 static const int glXCreateContextWithConfigSGIX_signature[] = {TYPE_INT, 0, 5, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
401
402 /*XVisualInfo *glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config ) */
403 static const int glXGetVisualFromFBConfig_signature[] = {TYPE_INT, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
404
405 /*int glXGetFBConfigAttrib(Display *dpy, GLXFBConfig  config, int attribute, int *value)*/
406 static const int glXGetFBConfigAttrib_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
407
408 static const int glXGetFBConfigAttribSGIX_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
409
410 static const int glXQueryContext_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
411
412 static const int glXQueryGLXPbufferSGIX_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
413
414 static const int glXQueryDrawable_signature[] = {TYPE_NONE, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
415
416 /* void glXUseXFont( Font font, int first, int count, int list ) */
417 static const int glXUseXFont_signature[] = {TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
418
419 /* Bool glXIsDirect( Display *dpy, GLXContext ctx ) */
420 static const int glXIsDirect_signature[] = {TYPE_CHAR, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT };
421
422 static const int glXGetScreenDriver_signature[] = { TYPE_CONST_CHAR, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT };
423
424 static const int glXGetDriverConfig_signature[] = { TYPE_CONST_CHAR, 0, 1, TYPE_NULL_TERMINATED_STRING };
425
426
427 static const int glXWaitVideoSyncSGI_signature[] = { TYPE_INT, 1, 3, TYPE_INT, TYPE_INT, TYPE_OUT_1INT };
428
429 static const int glXGetVideoSyncSGI_signature[] = { TYPE_INT, 1, 1, TYPE_OUT_1INT };
430
431 static const int glXSwapIntervalSGI_signature[] = { TYPE_INT, 0, 1, TYPE_INT };
432
433 static const int glXBindTexImageATI_signature[] = { TYPE_NONE, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT };
434 static const int glXReleaseTexImageATI_signature[] = { TYPE_NONE, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT };
435 static const int glXBindTexImageARB_signature[] = { TYPE_INT, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT };
436 static const int glXReleaseTexImageARB_signature[] = { TYPE_INT, 0, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT };
437
438 /* const GLubyte * glGetString( GLenum name ) */
439 static const int glGetString_signature[] = {TYPE_CONST_CHAR, 0, 1, TYPE_INT};
440
441 /* void glShaderSourceARB (GLhandleARB handle , GLsizei size, const GLcharARB* *p_tab_prog, const GLint * tab_length) */
442 /* --> void glShaderSourceARB (GLhandleARB handle , GLsizei size, const GLcharARB* all_progs, const GLint * tab_length) */
443 static const int glShaderSourceARB_fake_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR, TYPE_ARRAY_INT};
444 static const int glShaderSource_fake_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR, TYPE_ARRAY_INT};
445
446 static const int glVertexPointer_fake_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
447 static const int glNormalPointer_fake_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
448 static const int glColorPointer_fake_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
449 static const int glSecondaryColorPointer_fake_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
450 static const int glIndexPointer_fake_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
451 static const int glTexCoordPointer_fake_signature[] = { TYPE_NONE, 0, 7, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
452 static const int glEdgeFlagPointer_fake_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
453 static const int glVertexAttribPointerARB_fake_signature[] = { TYPE_NONE, 0, 8, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
454 static const int glVertexAttribPointerNV_fake_signature[] = { TYPE_NONE, 0, 7, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
455 static const int glWeightPointerARB_fake_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
456 static const int glMatrixIndexPointerARB_fake_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
457 static const int glFogCoordPointer_fake_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
458 static const int glInterleavedArrays_fake_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
459 static const int glElementPointerATI_fake_signature[] = { TYPE_NONE, 0, 3, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR }; 
460 static const int glVariantPointerEXT_fake_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR }; 
461 static const int glTuxRacerDrawElements_fake_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
462 static const int glVertexAndNormalPointer_fake_signature[] = { TYPE_NONE, 0, 7, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
463 static const int glTexCoordPointer01_fake_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
464 static const int glTexCoordPointer012_fake_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
465 static const int glVertexNormalPointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 8, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
466 static const int glVertexNormalColorPointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 11, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
467 static const int glVertexColorTexCoord0PointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 12, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
468 static const int glVertexNormalTexCoord0PointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 11, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
469 static const int glVertexNormalTexCoord01PointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 14, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,  TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
470 static const int glVertexNormalTexCoord012PointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 17, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,  TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
471 static const int glVertexNormalColorTexCoord0PointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 14, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,  TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
472 static const int glVertexNormalColorTexCoord01PointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 17, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,  TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
473 static const int glVertexNormalColorTexCoord012PointerInterlaced_fake_signature[] = {TYPE_NONE, 0, 20, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT,  TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_CHAR };
474
475 static const int glGenTextures_fake_signature[] = { TYPE_NONE, 0, 1, TYPE_INT};
476 static const int glGenBuffersARB_fake_signature[] = { TYPE_NONE, 0, 1, TYPE_INT};
477 static const int glGenLists_fake_signature[] = { TYPE_NONE, 0, 1, TYPE_INT};
478
479 static const int _glDrawElements_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
480 static const int _glDrawRangeElements_buffer_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
481 static const int _glMultiDrawElements_buffer_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_ARRAY_INT, TYPE_INT, TYPE_ARRAY_INT, TYPE_INT };
482
483 static const int _glVertexPointer_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
484 static const int _glNormalPointer_buffer_signature[] = { TYPE_NONE, 0, 3, TYPE_INT, TYPE_INT, TYPE_INT};
485 static const int _glColorPointer_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
486 static const int _glSecondaryColorPointer_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
487 static const int _glIndexPointer_buffer_signature[] = { TYPE_NONE, 0, 3, TYPE_INT, TYPE_INT, TYPE_INT};
488 static const int _glTexCoordPointer_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
489 static const int _glEdgeFlagPointer_buffer_signature[] = { TYPE_NONE, 0, 2, TYPE_INT, TYPE_INT};
490 static const int _glVertexAttribPointerARB_buffer_signature[] = { TYPE_NONE, 0, 6, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
491 static const int _glWeightPointerARB_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
492 static const int _glMatrixIndexPointerARB_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
493 static const int _glFogCoordPointer_buffer_signature[] = { TYPE_NONE, 0, 3, TYPE_INT, TYPE_INT, TYPE_INT};
494 static const int _glVariantPointerEXT_buffer_signature[] = { TYPE_NONE, 0, 4, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
495
496 static const int _glReadPixels_pbo_signature[] = { TYPE_INT, 0, 7, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
497 static const int _glDrawPixels_pbo_signature[] = { TYPE_NONE, 0, 5, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
498 static const int _glMapBufferARB_fake_signature[] = { TYPE_INT, 1, 3, TYPE_INT, TYPE_INT, TYPE_OUT_ARRAY_CHAR };
499
500 static const int _glSelectBuffer_fake_signature[] = { TYPE_NONE, 0, 1, TYPE_INT };
501 static const int _glGetSelectBuffer_fake_signature[] = { TYPE_NONE, 1, 1, TYPE_ARRAY_CHAR };
502 static const int _glFeedbackBuffer_fake_signature[] = { TYPE_NONE, 0, 2, TYPE_INT, TYPE_INT };
503 static const int _glGetFeedbackBuffer_fake_signature[] = { TYPE_NONE, 1, 1, TYPE_ARRAY_CHAR };
504
505 static const int _glGetError_fake_signature[] = { TYPE_NONE, 0, 0 };
506
507 #define timesynchro_func    -1
508 #define memorize_array_func -2
509 #define reuse_array_func    -3
510
511 #include "gl_func.h"
512
513
514 static GLint __glTexParameter_size(FILE* err_file, GLenum pname)
515 {
516         switch (pname) {
517                 case GL_TEXTURE_MAG_FILTER:
518                 case GL_TEXTURE_MIN_FILTER:
519                 case GL_TEXTURE_WRAP_S:
520                 case GL_TEXTURE_WRAP_T:
521                 case GL_TEXTURE_PRIORITY:
522                 case GL_TEXTURE_WRAP_R:
523                 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
524                         /*      case GL_SHADOW_AMBIENT_SGIX:*/
525                 case GL_TEXTURE_MIN_LOD:
526                 case GL_TEXTURE_MAX_LOD:
527                 case GL_TEXTURE_BASE_LEVEL:
528                 case GL_TEXTURE_MAX_LEVEL:
529                 case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
530                 case GL_TEXTURE_LOD_BIAS_S_SGIX:
531                 case GL_TEXTURE_LOD_BIAS_T_SGIX:
532                 case GL_TEXTURE_LOD_BIAS_R_SGIX:
533                 case GL_GENERATE_MIPMAP:
534                         /*      case GL_GENERATE_MIPMAP_SGIS:*/
535                 case GL_TEXTURE_COMPARE_SGIX:
536                 case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
537                 case GL_TEXTURE_MAX_CLAMP_S_SGIX:
538                 case GL_TEXTURE_MAX_CLAMP_T_SGIX:
539                 case GL_TEXTURE_MAX_CLAMP_R_SGIX:
540                 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
541                 case GL_TEXTURE_LOD_BIAS:
542                         /*      case GL_TEXTURE_LOD_BIAS_EXT:*/
543                 case GL_DEPTH_TEXTURE_MODE:
544                         /*      case GL_DEPTH_TEXTURE_MODE_ARB:*/
545                 case GL_TEXTURE_COMPARE_MODE:
546                         /*      case GL_TEXTURE_COMPARE_MODE_ARB:*/
547                 case GL_TEXTURE_COMPARE_FUNC:
548                         /*      case GL_TEXTURE_COMPARE_FUNC_ARB:*/
549                 case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
550                         return 1;
551                 case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
552                 case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
553                         return 2;
554                 case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
555                         return 3;
556                 case GL_TEXTURE_BORDER_COLOR:
557                 case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
558                 case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
559                         return 4;
560                 default:
561                         fprintf(err_file, "unhandled pname = %d\n", pname);
562                         return 0;
563         }
564 }
565
566 static int __glLight_size(FILE* err_file, GLenum pname)
567 {
568         switch(pname)
569         {
570                 case GL_AMBIENT:
571                 case GL_DIFFUSE:
572                 case GL_SPECULAR:
573                 case GL_POSITION:
574                         return 4;
575                         break;
576
577                 case GL_SPOT_DIRECTION:
578                         return 3;
579                         break;
580
581                 case GL_SPOT_EXPONENT:
582                 case GL_SPOT_CUTOFF:
583                 case GL_CONSTANT_ATTENUATION:
584                 case GL_LINEAR_ATTENUATION:
585                 case GL_QUADRATIC_ATTENUATION:
586                         return 1;
587                         break;
588
589                 default:
590                         fprintf(err_file, "unhandled pname = %d\n", pname);
591                         return 0;
592         }
593 }
594
595 static int __glMaterial_size(FILE* err_file, GLenum pname)
596 {
597         switch(pname)
598         {
599                 case GL_AMBIENT:
600                 case GL_DIFFUSE:
601                 case GL_SPECULAR:
602                 case GL_EMISSION:
603                 case GL_AMBIENT_AND_DIFFUSE:
604                         return 4;
605                         break;
606
607                 case GL_SHININESS:
608                         return 1;
609                         break;
610
611                 case GL_COLOR_INDEXES:
612                         return 3;
613                         break;
614
615                 default:
616                         fprintf(err_file, "unhandled pname = %d\n", pname);
617                         return 0;
618         }
619 }
620
621
622 static inline int compute_arg_length(FILE* err_file, int func_number, int arg_i, long* args)
623 {
624         Signature* signature = (Signature*)tab_opengl_calls[func_number];
625         int* args_type = signature->args_type;
626
627         switch (func_number)
628         {
629                 case glProgramNamedParameter4fNV_func:
630                 case glProgramNamedParameter4dNV_func:
631                 case glProgramNamedParameter4fvNV_func:
632                 case glProgramNamedParameter4dvNV_func:
633                 case glGetProgramNamedParameterfvNV_func:
634                 case glGetProgramNamedParameterdvNV_func:
635                         if (arg_i == 2)
636                                 return 1 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
637                         break;
638
639                 case glProgramStringARB_func:
640                 case glLoadProgramNV_func:
641                 case glGenProgramsNV_func:
642                 case glDeleteProgramsNV_func:
643                 case glGenProgramsARB_func:
644                 case glDeleteProgramsARB_func:
645                 case glRequestResidentProgramsNV_func:
646                 case glDrawBuffers_func:
647                 case glDrawBuffersARB_func:
648                 case glDrawBuffersATI_func:
649                 case glDeleteBuffers_func:
650                 case glDeleteBuffersARB_func:
651                 case glDeleteTextures_func:
652                 case glDeleteTexturesEXT_func:
653                 case glGenFramebuffersEXT_func:
654                 case glDeleteFramebuffersEXT_func:
655                 case glGenRenderbuffersEXT_func:
656                 case glDeleteRenderbuffersEXT_func:
657                 case glGenQueries_func:
658                 case glGenQueriesARB_func:
659                 case glDeleteQueries_func:
660                 case glDeleteQueriesARB_func:
661                 case glGenOcclusionQueriesNV_func:
662                 case glDeleteOcclusionQueriesNV_func:
663                 case glGenFencesNV_func:
664                 case glDeleteFencesNV_func:
665                 case glUniform1fv_func:
666                 case glUniform1iv_func:
667                 case glUniform1fvARB_func:
668                 case glUniform1ivARB_func:
669                 case glUniform1uivEXT_func:
670                 case glVertexAttribs1dvNV_func:
671                 case glVertexAttribs1fvNV_func:
672                 case glVertexAttribs1svNV_func:
673                 case glVertexAttribs1hvNV_func:
674                 case glWeightbvARB_func:
675                 case glWeightsvARB_func:
676                 case glWeightivARB_func:
677                 case glWeightfvARB_func:
678                 case glWeightdvARB_func:
679                 case glWeightubvARB_func:
680                 case glWeightusvARB_func:
681                 case glWeightuivARB_func:
682                 case glPixelMapfv_func:
683                 case glPixelMapuiv_func:
684                 case glPixelMapusv_func:
685                 case glProgramBufferParametersfvNV_func:
686                 case glProgramBufferParametersIivNV_func:
687                 case glProgramBufferParametersIuivNV_func:
688                 case glTransformFeedbackAttribsNV_func:
689                 case glTransformFeedbackVaryingsNV_func:
690                         if (arg_i == signature->nb_args - 1)
691                                 return 1 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
692                         break;
693
694                 case glUniform2fv_func:
695                 case glUniform2iv_func:
696                 case glUniform2fvARB_func:
697                 case glUniform2ivARB_func:
698                 case glUniform2uivEXT_func:
699                 case glVertexAttribs2dvNV_func:
700                 case glVertexAttribs2fvNV_func:
701                 case glVertexAttribs2svNV_func:
702                 case glVertexAttribs2hvNV_func:
703                 case glDetailTexFuncSGIS_func:
704                 case glSharpenTexFuncSGIS_func:
705                         if (arg_i == signature->nb_args - 1)
706                                 return 2 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
707                         break;
708
709                 case glUniform3fv_func:
710                 case glUniform3iv_func:
711                 case glUniform3fvARB_func:
712                 case glUniform3ivARB_func:
713                 case glUniform3uivEXT_func:
714                 case glVertexAttribs3dvNV_func:
715                 case glVertexAttribs3fvNV_func:
716                 case glVertexAttribs3svNV_func:
717                 case glVertexAttribs3hvNV_func:
718                         if (arg_i == signature->nb_args - 1)
719                                 return 3 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
720                         break;
721
722                 case glUniform4fv_func:
723                 case glUniform4iv_func:
724                 case glUniform4fvARB_func:
725                 case glUniform4ivARB_func:
726                 case glUniform4uivEXT_func:
727                 case glVertexAttribs4dvNV_func:
728                 case glVertexAttribs4fvNV_func:
729                 case glVertexAttribs4svNV_func:
730                 case glVertexAttribs4hvNV_func:
731                 case glVertexAttribs4ubvNV_func:
732                 case glProgramParameters4fvNV_func:
733                 case glProgramParameters4dvNV_func:
734                 case glProgramLocalParameters4fvEXT_func:
735                 case glProgramEnvParameters4fvEXT_func:
736                 case glProgramLocalParametersI4ivNV_func:
737                 case glProgramLocalParametersI4uivNV_func:
738                 case glProgramEnvParametersI4ivNV_func:
739                 case glProgramEnvParametersI4uivNV_func:
740                         if (arg_i == signature->nb_args - 1)
741                                 return 4 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
742                         break;
743
744                 case glPrioritizeTextures_func:
745                 case glPrioritizeTexturesEXT_func:
746                 case glAreProgramsResidentNV_func:
747                 case glAreTexturesResident_func:
748                 case glAreTexturesResidentEXT_func:
749                         if (arg_i == 1 || arg_i == 2)
750                                 return args[0] * tab_args_type_length[args_type[arg_i]];
751                         break;
752
753                 case glLightfv_func:
754                 case glLightiv_func:
755                 case glGetLightfv_func:
756                 case glGetLightiv_func:
757                 case glFragmentLightfvSGIX_func:
758                 case glFragmentLightivSGIX_func:
759                 case glGetFragmentLightfvSGIX_func:
760                 case glGetFragmentLightivSGIX_func:
761                         if (arg_i == signature->nb_args - 1)
762                                 return __glLight_size(err_file, args[arg_i-1]) * tab_args_type_length[args_type[arg_i]];
763                         break;
764
765                 case glLightModelfv_func:
766                 case glLightModeliv_func:
767                         if (arg_i == signature->nb_args - 1)
768                                 return ((args[arg_i-1] == GL_LIGHT_MODEL_AMBIENT) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
769                         break;
770
771                 case glFragmentLightModelfvSGIX_func:
772                 case glFragmentLightModelivSGIX_func:
773                         if (arg_i == signature->nb_args - 1)
774                                 return ((args[arg_i-1] == GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
775                         break;
776
777                 case glMaterialfv_func:
778                 case glMaterialiv_func:
779                 case glGetMaterialfv_func:
780                 case glGetMaterialiv_func:
781                 case glFragmentMaterialfvSGIX_func:
782                 case glFragmentMaterialivSGIX_func:
783                 case glGetFragmentMaterialfvSGIX_func:
784                 case glGetFragmentMaterialivSGIX_func:
785                         if (arg_i == signature->nb_args - 1)
786                                 return __glMaterial_size(err_file, args[arg_i-1]) * tab_args_type_length[args_type[arg_i]];
787                         break;
788
789                 case glTexParameterfv_func:
790                 case glTexParameteriv_func:
791                 case glGetTexParameterfv_func:
792                 case glGetTexParameteriv_func:
793                 case glTexParameterIivEXT_func:
794                 case glTexParameterIuivEXT_func:
795                 case glGetTexParameterIivEXT_func:
796                 case glGetTexParameterIuivEXT_func:
797                         if (arg_i == signature->nb_args - 1)
798                                 return __glTexParameter_size(err_file, args[arg_i-1]) * tab_args_type_length[args_type[arg_i]];
799                         break;
800
801                 case glFogiv_func:
802                 case glFogfv_func:
803                         if (arg_i == signature->nb_args - 1)
804                                 return ((args[arg_i-1] == GL_FOG_COLOR) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
805                         break;
806
807                 case glTexGendv_func:
808                 case glTexGenfv_func:
809                 case glTexGeniv_func:
810                 case glGetTexGendv_func:
811                 case glGetTexGenfv_func:
812                 case glGetTexGeniv_func:
813                         if (arg_i == signature->nb_args - 1)
814                                 return ((args[arg_i-1] == GL_TEXTURE_GEN_MODE) ? 1 : 4) * tab_args_type_length[args_type[arg_i]];
815                         break;
816
817                 case glTexEnvfv_func:
818                 case glTexEnviv_func:
819                 case glGetTexEnvfv_func:
820                 case glGetTexEnviv_func:
821                         if (arg_i == signature->nb_args - 1)
822                                 return ((args[arg_i-1] == GL_TEXTURE_ENV_MODE) ? 1 : 4) * tab_args_type_length[args_type[arg_i]];
823                         break;
824
825                 case glConvolutionParameterfv_func:
826                 case glConvolutionParameteriv_func:
827                 case glGetConvolutionParameterfv_func:
828                 case glGetConvolutionParameteriv_func:
829                 case glConvolutionParameterfvEXT_func:
830                 case glConvolutionParameterivEXT_func:
831                 case glGetConvolutionParameterfvEXT_func:
832                 case glGetConvolutionParameterivEXT_func:
833                         if (arg_i == signature->nb_args - 1)
834                                 return ((args[arg_i-1] == GL_CONVOLUTION_BORDER_COLOR ||
835                                                         args[arg_i-1] == GL_CONVOLUTION_FILTER_SCALE ||
836                                                         args[arg_i-1] == GL_CONVOLUTION_FILTER_BIAS) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
837                         break;
838
839                 case glGetVertexAttribfvARB_func:
840                 case glGetVertexAttribfvNV_func:
841                 case glGetVertexAttribfv_func:
842                 case glGetVertexAttribdvARB_func:
843                 case glGetVertexAttribdvNV_func:
844                 case glGetVertexAttribdv_func:
845                 case glGetVertexAttribivARB_func:
846                 case glGetVertexAttribivNV_func:
847                 case glGetVertexAttribiv_func:
848                 case glGetVertexAttribIivEXT_func:
849                 case glGetVertexAttribIuivEXT_func:
850                         if (arg_i == signature->nb_args - 1)
851                                 return ((args[arg_i-1] == GL_CURRENT_VERTEX_ATTRIB_ARB) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
852                         break;
853
854
855                 case glPointParameterfv_func:
856                 case glPointParameterfvEXT_func:
857                 case glPointParameterfvARB_func:
858                 case glPointParameterfvSGIS_func:
859                 case glPointParameteriv_func:
860                 case glPointParameterivEXT_func:
861                         if (arg_i == signature->nb_args - 1)
862                                 return ((args[arg_i-1] == GL_POINT_DISTANCE_ATTENUATION) ? 3 : 1) * tab_args_type_length[args_type[arg_i]];
863                         break;
864
865                 case glUniformMatrix2fv_func:
866                 case glUniformMatrix2fvARB_func:
867                         if (arg_i == signature->nb_args - 1)
868                                 return 2 * 2 * args[1] * tab_args_type_length[args_type[arg_i]];
869                         break;
870
871                 case glUniformMatrix3fv_func:
872                 case glUniformMatrix3fvARB_func:
873                         if (arg_i == signature->nb_args - 1)
874                                 return 3 * 3 * args[1] * tab_args_type_length[args_type[arg_i]];
875                         break;
876
877                 case glUniformMatrix4fv_func:
878                 case glUniformMatrix4fvARB_func:
879                         if (arg_i == signature->nb_args - 1)
880                                 return 4 * 4 * args[1] * tab_args_type_length[args_type[arg_i]];
881                         break;
882
883                 case glUniformMatrix2x3fv_func:
884                 case glUniformMatrix3x2fv_func:
885                         if (arg_i == signature->nb_args - 1)
886                                 return 2 * 3 * args[1] * tab_args_type_length[args_type[arg_i]];
887                         break;
888
889                 case glUniformMatrix2x4fv_func:
890                 case glUniformMatrix4x2fv_func:
891                         if (arg_i == signature->nb_args - 1)
892                                 return 2 * 4 * args[1] * tab_args_type_length[args_type[arg_i]];
893                         break;
894
895                 case glUniformMatrix3x4fv_func:
896                 case glUniformMatrix4x3fv_func:
897                         if (arg_i == signature->nb_args - 1)
898                                 return 3 * 4 * args[1] * tab_args_type_length[args_type[arg_i]];
899                         break;
900
901                 case glSpriteParameterivSGIX_func:
902                 case glSpriteParameterfvSGIX_func:
903                         if  (arg_i == signature->nb_args - 1)
904                                 return ((args[arg_i-1] == GL_SPRITE_MODE_SGIX) ? 1 : 3) * tab_args_type_length[args_type[arg_i]];
905                         break;
906
907                 default:
908                         break;
909         }
910
911         fprintf(err_file, "invalid combination for compute_arg_length : func_number=%d, arg_i=%d\n", func_number, arg_i);
912         return 0;
913 }
914
915 #define IS_NULL_POINTER_OK_FOR_FUNC(func_number) \
916         (func_number == glBitmap_func || \
917          func_number == _send_cursor_func || \
918          func_number == glTexImage1D_func || \
919          func_number == glTexImage2D_func || \
920          func_number == glTexImage3D_func || \
921          func_number == glBufferDataARB_func || \
922          func_number == glNewObjectBufferATI_func)