2 * Main header for both host and guest sides
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
26 #include "mesa_glext.h"
27 #include "opengl_server.h"
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);
35 //extern int do_function_call(Display dpy, int func_number, int pid, int* args, char* ret_string);
37 //extern int do_function_call(Display* dpy, int func_number, int pid, long* args, char* ret_string);
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 );
92 TYPE_IN_IGNORED_POINTER,
97 TYPE_OUT_ARRAY_DOUBLE,
98 TYPE_NULL_TERMINATED_STRING,
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,
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,
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
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
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
161 #define CASE_IN_KNOWN_SIZE_POINTERS \
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
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 \
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
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
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)
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
220 static int tab_args_type_length[] =
224 sizeof(unsigned char),
226 sizeof(unsigned short),
228 sizeof(unsigned int),
275 /* the following sizes are the size of 1 element of the array */
291 int has_out_parameters;
296 static const int _init_signature[] = { TYPE_NONE, 1, 2, TYPE_INT, TYPE_OUT_1INT};
298 static const int _synchronize_signature[] = { TYPE_INT, 0, 0 };
300 static const int _serialized_calls_signature[] = { TYPE_NONE, 0, 1, TYPE_ARRAY_CHAR };
302 static const int _exit_process_signature[] = {TYPE_NONE, 0, 0};
304 static const int _changeWindowState_signature[] = {TYPE_NONE, 0, 2, TYPE_INT, TYPE_INT};
306 static const int _moveResizeWindow_signature[] = {TYPE_NONE, 0, 2, TYPE_INT, TYPE_4INT};
308 static const int _send_cursor_signature[] = {TYPE_NONE, 0, 7, TYPE_INT, TYPE_INT,
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 };
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};
320 static const int glXCopyContext_signature[] = {TYPE_NONE, 0, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT};
322 /* void glXDestroyContext( Display *dpy, GLXContext ctx ) */
323 static const int glXDestroyContext_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
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};
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};
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};
337 /* void glXSwapBuffers( Display *dpy, GLXDrawable drawable ); */
338 static const int glXSwapBuffers_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
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};
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};
346 static const int glXWaitGL_signature[] = { TYPE_INT, 0, 0 };
347 static const int glXWaitX_signature[] = { TYPE_INT, 0, 0 };
349 /* GLX 1.1 and later */
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};
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};
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};
361 static const int glXGetProcAddress_fake_signature[] = {TYPE_INT, 0, 1, TYPE_NULL_TERMINATED_STRING};
363 static const int glXGetProcAddress_global_fake_signature[] = {TYPE_NONE, 1, 3, TYPE_INT, TYPE_ARRAY_CHAR, TYPE_OUT_ARRAY_CHAR};
366 /* GLX 1.3 and later */
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};
373 static const int glXChooseFBConfigSGIX_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_ARRAY_INT, TYPE_OUT_1INT};
375 static const int glXGetFBConfigs_signature[] = {TYPE_INT, 1, 3, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_OUT_1INT};
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};
380 static const int glXDestroyWindow_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT}; // mkjung
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};
387 static const int glXCreateGLXPbufferSGIX_signature[] = {TYPE_INT, 0, 5, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_ARRAY_INT};
389 static const int glXDestroyPbuffer_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
391 static const int glXDestroyGLXPbufferSGIX_signature[] = {TYPE_NONE, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
393 /* GLXContext glXCreateNewContext(Display * dpy
398 static const int glXCreateNewContext_signature[] = {TYPE_INT, 0, 5, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
400 static const int glXCreateContextWithConfigSGIX_signature[] = {TYPE_INT, 0, 5, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT};
402 /*XVisualInfo *glXGetVisualFromFBConfig( Display *dpy, GLXFBConfig config ) */
403 static const int glXGetVisualFromFBConfig_signature[] = {TYPE_INT, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT};
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};
408 static const int glXGetFBConfigAttribSGIX_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
410 static const int glXQueryContext_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
412 static const int glXQueryGLXPbufferSGIX_signature[] = {TYPE_INT, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
414 static const int glXQueryDrawable_signature[] = {TYPE_NONE, 1, 4, TYPE_IN_IGNORED_POINTER, TYPE_INT, TYPE_INT, TYPE_OUT_1INT};
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};
419 /* Bool glXIsDirect( Display *dpy, GLXContext ctx ) */
420 static const int glXIsDirect_signature[] = {TYPE_CHAR, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT };
422 static const int glXGetScreenDriver_signature[] = { TYPE_CONST_CHAR, 0, 2, TYPE_IN_IGNORED_POINTER, TYPE_INT };
424 static const int glXGetDriverConfig_signature[] = { TYPE_CONST_CHAR, 0, 1, TYPE_NULL_TERMINATED_STRING };
427 static const int glXWaitVideoSyncSGI_signature[] = { TYPE_INT, 1, 3, TYPE_INT, TYPE_INT, TYPE_OUT_1INT };
429 static const int glXGetVideoSyncSGI_signature[] = { TYPE_INT, 1, 1, TYPE_OUT_1INT };
431 static const int glXSwapIntervalSGI_signature[] = { TYPE_INT, 0, 1, TYPE_INT };
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 };
438 /* const GLubyte * glGetString( GLenum name ) */
439 static const int glGetString_signature[] = {TYPE_CONST_CHAR, 0, 1, TYPE_INT};
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};
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 };
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};
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 };
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};
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 };
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 };
505 static const int _glGetError_fake_signature[] = { TYPE_NONE, 0, 0 };
507 #define timesynchro_func -1
508 #define memorize_array_func -2
509 #define reuse_array_func -3
514 static GLint __glTexParameter_size(FILE* err_file, GLenum 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:
551 case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
552 case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
554 case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
556 case GL_TEXTURE_BORDER_COLOR:
557 case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
558 case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
561 fprintf(err_file, "unhandled pname = %d\n", pname);
566 static int __glLight_size(FILE* err_file, GLenum pname)
577 case GL_SPOT_DIRECTION:
581 case GL_SPOT_EXPONENT:
583 case GL_CONSTANT_ATTENUATION:
584 case GL_LINEAR_ATTENUATION:
585 case GL_QUADRATIC_ATTENUATION:
590 fprintf(err_file, "unhandled pname = %d\n", pname);
595 static int __glMaterial_size(FILE* err_file, GLenum pname)
603 case GL_AMBIENT_AND_DIFFUSE:
611 case GL_COLOR_INDEXES:
616 fprintf(err_file, "unhandled pname = %d\n", pname);
622 static inline int compute_arg_length(FILE* err_file, int func_number, int arg_i, long* args)
624 Signature* signature = (Signature*)tab_opengl_calls[func_number];
625 int* args_type = signature->args_type;
629 case glProgramNamedParameter4fNV_func:
630 case glProgramNamedParameter4dNV_func:
631 case glProgramNamedParameter4fvNV_func:
632 case glProgramNamedParameter4dvNV_func:
633 case glGetProgramNamedParameterfvNV_func:
634 case glGetProgramNamedParameterdvNV_func:
636 return 1 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
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]];
911 fprintf(err_file, "invalid combination for compute_arg_length : func_number=%d, arg_i=%d\n", func_number, arg_i);
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)