2 * Copyright (c) 2007 Even Rouault
4 * Modified by Ian Molton 2010 <ian.molton@collabora.co.uk>
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
29 #include "opengl_func.h"
32 /* Sizes of types in opengl_func.h */
33 int tab_args_type_length[] =
37 sizeof(unsigned char),
39 sizeof(unsigned short),
88 /* the following sizes are the size of 1 element of the array */
101 GLint __glTexParameter_size(FILE* err_file, GLenum pname)
104 case GL_TEXTURE_MAG_FILTER:
105 case GL_TEXTURE_MIN_FILTER:
106 case GL_TEXTURE_WRAP_S:
107 case GL_TEXTURE_WRAP_T:
108 case GL_TEXTURE_PRIORITY:
109 case GL_TEXTURE_WRAP_R:
110 case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
111 /* case GL_SHADOW_AMBIENT_SGIX:*/
112 case GL_TEXTURE_MIN_LOD:
113 case GL_TEXTURE_MAX_LOD:
114 case GL_TEXTURE_BASE_LEVEL:
115 case GL_TEXTURE_MAX_LEVEL:
116 case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
117 case GL_TEXTURE_LOD_BIAS_S_SGIX:
118 case GL_TEXTURE_LOD_BIAS_T_SGIX:
119 case GL_TEXTURE_LOD_BIAS_R_SGIX:
120 case GL_GENERATE_MIPMAP:
121 /* case GL_GENERATE_MIPMAP_SGIS:*/
122 case GL_TEXTURE_COMPARE_SGIX:
123 case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
124 case GL_TEXTURE_MAX_CLAMP_S_SGIX:
125 case GL_TEXTURE_MAX_CLAMP_T_SGIX:
126 case GL_TEXTURE_MAX_CLAMP_R_SGIX:
127 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
128 case GL_TEXTURE_LOD_BIAS:
129 /* case GL_TEXTURE_LOD_BIAS_EXT:*/
130 case GL_DEPTH_TEXTURE_MODE:
131 /* case GL_DEPTH_TEXTURE_MODE_ARB:*/
132 case GL_TEXTURE_COMPARE_MODE:
133 /* case GL_TEXTURE_COMPARE_MODE_ARB:*/
134 case GL_TEXTURE_COMPARE_FUNC:
135 /* case GL_TEXTURE_COMPARE_FUNC_ARB:*/
136 case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
138 case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
139 case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
141 case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
143 case GL_TEXTURE_BORDER_COLOR:
144 case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
145 case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
148 fprintf(err_file, "unhandled pname = %d\n", pname);
153 int __glLight_size(FILE* err_file, GLenum pname)
164 case GL_SPOT_DIRECTION:
168 case GL_SPOT_EXPONENT:
170 case GL_CONSTANT_ATTENUATION:
171 case GL_LINEAR_ATTENUATION:
172 case GL_QUADRATIC_ATTENUATION:
177 fprintf(err_file, "unhandled pname = %d\n", pname);
182 int __glMaterial_size(FILE* err_file, GLenum pname)
190 case GL_AMBIENT_AND_DIFFUSE:
198 case GL_COLOR_INDEXES:
203 fprintf(err_file, "unhandled pname = %d\n", pname);
208 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
210 int compute_arg_length(int func_number, Signature *signature, int arg_i, long* args)
212 int* args_type = signature->args_type;
216 case glProgramNamedParameter4fNV_func:
217 case glProgramNamedParameter4dNV_func:
218 case glProgramNamedParameter4fvNV_func:
219 case glProgramNamedParameter4dvNV_func:
220 case glGetProgramNamedParameterfvNV_func:
221 case glGetProgramNamedParameterdvNV_func:
223 return 1 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
226 case glProgramStringARB_func:
227 case glLoadProgramNV_func:
228 case glGenProgramsNV_func:
229 case glDeleteProgramsNV_func:
230 case glGenProgramsARB_func:
231 case glDeleteProgramsARB_func:
232 case glRequestResidentProgramsNV_func:
233 case glDrawBuffers_func:
234 case glDrawBuffersARB_func:
235 case glDrawBuffersATI_func:
236 case glDeleteBuffers_func:
237 case glDeleteBuffersARB_func:
238 case glDeleteTextures_func:
239 case glDeleteTexturesEXT_func:
240 case glGenFramebuffersEXT_func:
241 case glDeleteFramebuffersEXT_func:
242 case glGenRenderbuffersEXT_func:
243 case glDeleteRenderbuffersEXT_func:
244 case glGenQueries_func:
245 case glGenQueriesARB_func:
246 case glDeleteQueries_func:
247 case glDeleteQueriesARB_func:
248 case glGenOcclusionQueriesNV_func:
249 case glDeleteOcclusionQueriesNV_func:
250 case glGenFencesNV_func:
251 case glDeleteFencesNV_func:
252 case glUniform1fv_func:
253 case glUniform1iv_func:
254 case glUniform1fvARB_func:
255 case glUniform1ivARB_func:
256 case glUniform1uivEXT_func:
257 case glVertexAttribs1dvNV_func:
258 case glVertexAttribs1fvNV_func:
259 case glVertexAttribs1svNV_func:
260 case glVertexAttribs1hvNV_func:
261 case glWeightbvARB_func:
262 case glWeightsvARB_func:
263 case glWeightivARB_func:
264 case glWeightfvARB_func:
265 case glWeightdvARB_func:
266 case glWeightubvARB_func:
267 case glWeightusvARB_func:
268 case glWeightuivARB_func:
269 case glPixelMapfv_func:
270 case glPixelMapuiv_func:
271 case glPixelMapusv_func:
272 case glProgramBufferParametersfvNV_func:
273 case glProgramBufferParametersIivNV_func:
274 case glProgramBufferParametersIuivNV_func:
275 case glTransformFeedbackAttribsNV_func:
276 case glTransformFeedbackVaryingsNV_func:
277 if (arg_i == signature->nb_args - 1)
278 return 1 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
281 case glUniform2fv_func:
282 case glUniform2iv_func:
283 case glUniform2fvARB_func:
284 case glUniform2ivARB_func:
285 case glUniform2uivEXT_func:
286 case glVertexAttribs2dvNV_func:
287 case glVertexAttribs2fvNV_func:
288 case glVertexAttribs2svNV_func:
289 case glVertexAttribs2hvNV_func:
290 case glDetailTexFuncSGIS_func:
291 case glSharpenTexFuncSGIS_func:
292 if (arg_i == signature->nb_args - 1)
293 return 2 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
296 case glUniform3fv_func:
297 case glUniform3iv_func:
298 case glUniform3fvARB_func:
299 case glUniform3ivARB_func:
300 case glUniform3uivEXT_func:
301 case glVertexAttribs3dvNV_func:
302 case glVertexAttribs3fvNV_func:
303 case glVertexAttribs3svNV_func:
304 case glVertexAttribs3hvNV_func:
305 if (arg_i == signature->nb_args - 1)
306 return 3 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
309 case glUniform4fv_func:
310 case glUniform4iv_func:
311 case glUniform4fvARB_func:
312 case glUniform4ivARB_func:
313 case glUniform4uivEXT_func:
314 case glVertexAttribs4dvNV_func:
315 case glVertexAttribs4fvNV_func:
316 case glVertexAttribs4svNV_func:
317 case glVertexAttribs4hvNV_func:
318 case glVertexAttribs4ubvNV_func:
319 case glProgramParameters4fvNV_func:
320 case glProgramParameters4dvNV_func:
321 case glProgramLocalParameters4fvEXT_func:
322 case glProgramEnvParameters4fvEXT_func:
323 case glProgramLocalParametersI4ivNV_func:
324 case glProgramLocalParametersI4uivNV_func:
325 case glProgramEnvParametersI4ivNV_func:
326 case glProgramEnvParametersI4uivNV_func:
327 if (arg_i == signature->nb_args - 1)
328 return 4 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
331 case glPrioritizeTextures_func:
332 case glPrioritizeTexturesEXT_func:
333 case glAreProgramsResidentNV_func:
334 case glAreTexturesResident_func:
335 case glAreTexturesResidentEXT_func:
336 if (arg_i == 1 || arg_i == 2)
337 return args[0] * tab_args_type_length[args_type[arg_i]];
342 case glGetLightfv_func:
343 case glGetLightiv_func:
344 case glFragmentLightfvSGIX_func:
345 case glFragmentLightivSGIX_func:
346 case glGetFragmentLightfvSGIX_func:
347 case glGetFragmentLightivSGIX_func:
348 if (arg_i == signature->nb_args - 1)
349 return __glLight_size(get_err_file(), args[arg_i-1]) * tab_args_type_length[args_type[arg_i]];
352 case glLightModelfv_func:
353 case glLightModeliv_func:
354 if (arg_i == signature->nb_args - 1)
355 return ((args[arg_i-1] == GL_LIGHT_MODEL_AMBIENT) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
358 case glFragmentLightModelfvSGIX_func:
359 case glFragmentLightModelivSGIX_func:
360 if (arg_i == signature->nb_args - 1)
361 return ((args[arg_i-1] == GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
364 case glMaterialfv_func:
365 case glMaterialiv_func:
366 case glGetMaterialfv_func:
367 case glGetMaterialiv_func:
368 case glFragmentMaterialfvSGIX_func:
369 case glFragmentMaterialivSGIX_func:
370 case glGetFragmentMaterialfvSGIX_func:
371 case glGetFragmentMaterialivSGIX_func:
372 if (arg_i == signature->nb_args - 1)
373 return __glMaterial_size(get_err_file(), args[arg_i-1]) * tab_args_type_length[args_type[arg_i]];
376 case glTexParameterfv_func:
377 case glTexParameteriv_func:
378 case glGetTexParameterfv_func:
379 case glGetTexParameteriv_func:
380 case glTexParameterIivEXT_func:
381 case glTexParameterIuivEXT_func:
382 case glGetTexParameterIivEXT_func:
383 case glGetTexParameterIuivEXT_func:
384 if (arg_i == signature->nb_args - 1)
385 return __glTexParameter_size(get_err_file(), args[arg_i-1]) * tab_args_type_length[args_type[arg_i]];
390 if (arg_i == signature->nb_args - 1)
391 return ((args[arg_i-1] == GL_FOG_COLOR) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
394 case glTexGendv_func:
395 case glTexGenfv_func:
396 case glTexGeniv_func:
397 case glGetTexGendv_func:
398 case glGetTexGenfv_func:
399 case glGetTexGeniv_func:
400 if (arg_i == signature->nb_args - 1)
401 return ((args[arg_i-1] == GL_TEXTURE_GEN_MODE) ? 1 : 4) * tab_args_type_length[args_type[arg_i]];
404 case glTexEnvfv_func:
405 case glTexEnviv_func:
406 case glGetTexEnvfv_func:
407 case glGetTexEnviv_func:
408 if (arg_i == signature->nb_args - 1)
409 return ((args[arg_i-1] == GL_TEXTURE_ENV_MODE) ? 1 : 4) * tab_args_type_length[args_type[arg_i]];
412 case glConvolutionParameterfv_func:
413 case glConvolutionParameteriv_func:
414 case glGetConvolutionParameterfv_func:
415 case glGetConvolutionParameteriv_func:
416 case glConvolutionParameterfvEXT_func:
417 case glConvolutionParameterivEXT_func:
418 case glGetConvolutionParameterfvEXT_func:
419 case glGetConvolutionParameterivEXT_func:
420 if (arg_i == signature->nb_args - 1)
421 return ((args[arg_i-1] == GL_CONVOLUTION_BORDER_COLOR ||
422 args[arg_i-1] == GL_CONVOLUTION_FILTER_SCALE ||
423 args[arg_i-1] == GL_CONVOLUTION_FILTER_BIAS) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
426 case glGetVertexAttribfvARB_func:
427 case glGetVertexAttribfvNV_func:
428 case glGetVertexAttribfv_func:
429 case glGetVertexAttribdvARB_func:
430 case glGetVertexAttribdvNV_func:
431 case glGetVertexAttribdv_func:
432 case glGetVertexAttribivARB_func:
433 case glGetVertexAttribivNV_func:
434 case glGetVertexAttribiv_func:
435 case glGetVertexAttribIivEXT_func:
436 case glGetVertexAttribIuivEXT_func:
437 if (arg_i == signature->nb_args - 1)
438 return ((args[arg_i-1] == GL_CURRENT_VERTEX_ATTRIB_ARB) ? 4 : 1) * tab_args_type_length[args_type[arg_i]];
442 case glPointParameterfv_func:
443 case glPointParameterfvEXT_func:
444 case glPointParameterfvARB_func:
445 case glPointParameterfvSGIS_func:
446 case glPointParameteriv_func:
447 case glPointParameterivEXT_func:
448 if (arg_i == signature->nb_args - 1)
449 return ((args[arg_i-1] == GL_POINT_DISTANCE_ATTENUATION) ? 3 : 1) * tab_args_type_length[args_type[arg_i]];
452 case glUniformMatrix2fv_func:
453 case glUniformMatrix2fvARB_func:
454 if (arg_i == signature->nb_args - 1)
455 return 2 * 2 * args[1] * tab_args_type_length[args_type[arg_i]];
458 case glUniformMatrix3fv_func:
459 case glUniformMatrix3fvARB_func:
460 if (arg_i == signature->nb_args - 1)
461 return 3 * 3 * args[1] * tab_args_type_length[args_type[arg_i]];
464 case glUniformMatrix4fv_func:
465 case glUniformMatrix4fvARB_func:
466 if (arg_i == signature->nb_args - 1)
467 return 4 * 4 * args[1] * tab_args_type_length[args_type[arg_i]];
470 case glUniformMatrix2x3fv_func:
471 case glUniformMatrix3x2fv_func:
472 if (arg_i == signature->nb_args - 1)
473 return 2 * 3 * args[1] * tab_args_type_length[args_type[arg_i]];
476 case glUniformMatrix2x4fv_func:
477 case glUniformMatrix4x2fv_func:
478 if (arg_i == signature->nb_args - 1)
479 return 2 * 4 * args[1] * tab_args_type_length[args_type[arg_i]];
482 case glUniformMatrix3x4fv_func:
483 case glUniformMatrix4x3fv_func:
484 if (arg_i == signature->nb_args - 1)
485 return 3 * 4 * args[1] * tab_args_type_length[args_type[arg_i]];
488 case glSpriteParameterivSGIX_func:
489 case glSpriteParameterfvSGIX_func:
490 if (arg_i == signature->nb_args - 1)
491 return ((args[arg_i-1] == GL_SPRITE_MODE_SGIX) ? 1 : 3) * tab_args_type_length[args_type[arg_i]];