Initial commit
[profile/ivi/simulator-opengl.git] / libGL / opengl_utils.c
1 /*
2  *  Copyright (c) 2007 Even Rouault
3  *
4  *  Modified by Ian Molton 2010 <ian.molton@collabora.co.uk>
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 <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28
29 #include "opengl_func.h"
30 #include "log.h"
31
32 /* Sizes of types in opengl_func.h */
33 int tab_args_type_length[] =
34 {
35   0,
36   sizeof(char),
37   sizeof(unsigned char),
38   sizeof(short),
39   sizeof(unsigned short),
40   sizeof(int),
41   sizeof(unsigned int),
42   sizeof(float),
43   sizeof(double),
44   1 * sizeof(char),
45   2 * sizeof(char),
46   3 * sizeof(char),
47   4 * sizeof(char),
48   128 * sizeof(char),
49   1 * sizeof(short),
50   2 * sizeof(short),
51   3 * sizeof(short),
52   4 * sizeof(short),
53   1 * sizeof(int),
54   2 * sizeof(int),
55   3 * sizeof(int),
56   4 * sizeof(int),
57   1 * sizeof(float),
58   2 * sizeof(float),
59   3 * sizeof(float),
60   4 * sizeof(float),
61   16 * sizeof(float),
62   1 * sizeof(double),
63   2 * sizeof(double),
64   3 * sizeof(double),
65   4 * sizeof(double),
66   16 * sizeof(double),
67   sizeof(int),
68   sizeof(float),
69   4 * sizeof(char),
70   4 * sizeof(int),
71   4 * sizeof(float),
72   4 * sizeof(double),
73   128 * sizeof(char),
74   0,
75   0,
76   0,
77   0,
78   0,
79   0,
80   0,
81   0,
82   0,
83   0,
84   0,
85   0,
86   0,
87
88   /* the following sizes are the size of 1 element of the array */
89   sizeof(char),
90   sizeof(short),
91   sizeof(int),
92   sizeof(float),
93   sizeof(double),
94   sizeof(char),
95   sizeof(short),
96   sizeof(int),
97   sizeof(float),
98   sizeof(double),
99 };
100
101 GLint __glTexParameter_size(FILE* err_file, GLenum pname)
102 {
103     switch (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:
137         return 1;
138     case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
139     case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
140         return 2;
141     case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
142         return 3;
143     case GL_TEXTURE_BORDER_COLOR:
144     case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
145     case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
146         return 4;
147     default:
148         fprintf(err_file, "unhandled pname = %d\n", pname);
149         return 0;
150     }
151 }
152
153 int __glLight_size(FILE* err_file, GLenum pname)
154 {
155   switch(pname)
156   {
157     case GL_AMBIENT:
158     case GL_DIFFUSE:
159     case GL_SPECULAR:
160     case GL_POSITION:
161       return 4;
162       break;
163
164     case GL_SPOT_DIRECTION:
165       return 3;
166       break;
167
168     case GL_SPOT_EXPONENT:
169     case GL_SPOT_CUTOFF:
170     case GL_CONSTANT_ATTENUATION:
171     case GL_LINEAR_ATTENUATION:
172     case GL_QUADRATIC_ATTENUATION:
173       return 1;
174       break;
175
176     default:
177       fprintf(err_file, "unhandled pname = %d\n", pname);
178       return 0;
179   }
180 }
181
182 int __glMaterial_size(FILE* err_file, GLenum pname)
183 {
184   switch(pname)
185   {
186     case GL_AMBIENT:
187     case GL_DIFFUSE:
188     case GL_SPECULAR:
189     case GL_EMISSION:
190     case GL_AMBIENT_AND_DIFFUSE:
191       return 4;
192       break;
193
194     case GL_SHININESS:
195       return 1;
196       break;
197
198     case GL_COLOR_INDEXES:
199       return 3;
200       break;
201
202     default:
203       fprintf(err_file, "unhandled pname = %d\n", pname);
204       return 0;
205   }
206 }
207
208 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
209
210 int compute_arg_length(int func_number, Signature *signature, int arg_i, long* args)
211 {
212   int* args_type = signature->args_type;
213
214   switch (func_number)
215   {
216     case glProgramNamedParameter4fNV_func:
217     case glProgramNamedParameter4dNV_func:
218     case glProgramNamedParameter4fvNV_func:
219     case glProgramNamedParameter4dvNV_func:
220     case glGetProgramNamedParameterfvNV_func:
221     case glGetProgramNamedParameterdvNV_func:
222       if (arg_i == 2)
223         return 1 * args[arg_i-1] * tab_args_type_length[args_type[arg_i]];
224       break;
225
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]];
279       break;
280
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]];
294       break;
295
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]];
307       break;
308
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]];
329       break;
330
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]];
338       break;
339
340     case glLightfv_func:
341     case glLightiv_func:
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]];
350       break;
351
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]];
356       break;
357
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]];
362       break;
363
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]];
374       break;
375
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]];
386       break;
387
388     case glFogiv_func:
389     case glFogfv_func:
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]];
392       break;
393
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]];
402       break;
403
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]];
410       break;
411
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]];
424       break;
425
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]];
439       break;
440
441
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]];
450       break;
451
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]];
456       break;
457
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]];
462       break;
463
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]];
468       break;
469
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]];
474       break;
475
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]];
480       break;
481
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]];
486       break;
487
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]];
492       break;
493
494     default:
495       break;
496   }
497
498   return 0;
499 }
500
501