mesa/es: Validate glGetTexGen parameters in Mesa code rather than the ES wrapper
[profile/ivi/mesa.git] / src / mesa / main / es1_conversion.c
1 #include <stdbool.h>
2 #include "main/mfeatures.h"
3
4 #if FEATURE_ES1
5
6 #include "api_loopback.h"
7 #include "api_exec.h"
8 #include "blend.h"
9 #include "clear.h"
10 #include "clip.h"
11 #include "context.h"
12 #include "depth.h"
13 #include "fog.h"
14 #include "imports.h"
15 #include "light.h"
16 #include "lines.h"
17 #include "matrix.h"
18 #include "multisample.h"
19 #include "pixelstore.h"
20 #include "points.h"
21 #include "polygon.h"
22 #include "readpix.h"
23 #include "texenv.h"
24 #include "texgen.h"
25 #include "texobj.h"
26 #include "texparam.h"
27 #include "mtypes.h"
28 #include "viewport.h"
29 #include "main/drawtex.h"
30 #include "vbo/vbo.h"
31
32 #ifndef GL_APIENTRY
33 #define GL_APIENTRY GLAPIENTRY
34 #endif
35
36 #include "main/es1_conversion.h"
37
38 void GL_APIENTRY
39 _es_AlphaFuncx(GLenum func, GLclampx ref)
40 {
41    _mesa_AlphaFunc(func, (GLclampf) (ref / 65536.0f));
42 }
43
44 void GL_APIENTRY
45 _es_ClearColorx(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
46 {
47    _mesa_ClearColor((GLclampf) (red / 65536.0f),
48                     (GLclampf) (green / 65536.0f),
49                     (GLclampf) (blue / 65536.0f),
50                     (GLclampf) (alpha / 65536.0f));
51 }
52
53 void GL_APIENTRY
54 _es_ClearDepthx(GLclampx depth)
55 {
56    _mesa_ClearDepthf((GLclampf) (depth / 65536.0f));
57 }
58
59 void GL_APIENTRY
60 _es_ClipPlanef(GLenum plane, const GLfloat *equation)
61 {
62    unsigned int i;
63    GLdouble converted_equation[4];
64
65    for (i = 0; i < Elements(converted_equation); i++) {
66       converted_equation[i] = (GLdouble) (equation[i]);
67    }
68
69    _mesa_ClipPlane(plane, converted_equation);
70 }
71
72 void GL_APIENTRY
73 _es_ClipPlanex(GLenum plane, const GLfixed *equation)
74 {
75    unsigned int i;
76    GLdouble converted_equation[4];
77
78    for (i = 0; i < Elements(converted_equation); i++) {
79       converted_equation[i] = (GLdouble) (equation[i] / 65536.0);
80    }
81
82    _mesa_ClipPlane(plane, converted_equation);
83 }
84
85 void GL_APIENTRY
86 _es_Color4ub(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
87 {
88     _es_Color4f((GLfloat) (red / 255.0f),
89                 (GLfloat) (green / 255.0f),
90                 (GLfloat) (blue / 255.0f),
91                 (GLfloat) (alpha / 255.0f));
92 }
93
94 void GL_APIENTRY
95 _es_Color4x(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
96 {
97     _es_Color4f((GLfloat) (red / 65536.0f),
98                 (GLfloat) (green / 65536.0f),
99                 (GLfloat) (blue / 65536.0f),
100                 (GLfloat) (alpha / 65536.0f));
101 }
102
103 void GL_APIENTRY
104 _es_DepthRangex(GLclampx zNear, GLclampx zFar)
105 {
106     _mesa_DepthRangef((GLclampf) (zNear / 65536.0f),
107                       (GLclampf) (zFar / 65536.0f));
108 }
109
110 void GL_APIENTRY
111 _es_DrawTexxOES(GLfixed x, GLfixed y, GLfixed z, GLfixed w, GLfixed h)
112 {
113
114     _mesa_DrawTexf((GLfloat) (x / 65536.0f),
115                    (GLfloat) (y / 65536.0f),
116                    (GLfloat) (z / 65536.0f),
117                    (GLfloat) (w / 65536.0f),
118                    (GLfloat) (h / 65536.0f));
119 }
120
121 void GL_APIENTRY
122 _es_DrawTexxvOES(const GLfixed *coords)
123 {
124     unsigned int i;
125     GLfloat converted_coords[5];
126
127     for (i = 0; i < Elements(converted_coords); i++) {
128         converted_coords[i] = (GLfloat) (coords[i] / 65536.0f);
129     }
130
131     _mesa_DrawTexfv(converted_coords);
132 }
133
134 void GL_APIENTRY
135 _es_Fogx(GLenum pname, GLfixed param)
136 {
137    if (pname != GL_FOG_MODE) {
138       _mesa_Fogf(pname, (GLfloat) (param / 65536.0f));
139    } else {
140       _mesa_Fogf(pname, (GLfloat) param);
141    }
142
143 }
144
145 void GL_APIENTRY
146 _es_Fogxv(GLenum pname, const GLfixed *params)
147 {
148    unsigned int i;
149    unsigned int n_params = 4;
150    GLfloat converted_params[4];
151    bool convert_params_value = true;
152
153    switch(pname) {
154    case GL_FOG_MODE:
155       convert_params_value = false;
156       n_params = 1;
157       break;
158    case GL_FOG_COLOR:
159       n_params = 4;
160       break;
161    case GL_FOG_DENSITY:
162    case GL_FOG_START:
163    case GL_FOG_END:
164       n_params = 1;
165       break;
166    default:
167       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
168                   "glFogxv(pname=0x%x)", pname);
169       return;
170    }
171
172    if (convert_params_value) {
173       for (i = 0; i < n_params; i++) {
174          converted_params[i] = (GLfloat) (params[i] / 65536.0f);
175       }
176    } else {
177       for (i = 0; i < n_params; i++) {
178          converted_params[i] = (GLfloat) params[i];
179       }
180    }
181
182    _mesa_Fogfv(pname, converted_params);
183 }
184
185 void GL_APIENTRY
186 _es_Frustumf(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
187              GLfloat zNear, GLfloat zFar)
188 {
189    _mesa_Frustum((GLdouble) (left),
190                  (GLdouble) (right),
191                  (GLdouble) (bottom),
192                  (GLdouble) (top),
193                  (GLdouble) (zNear),
194                  (GLdouble) (zFar));
195 }
196
197 void GL_APIENTRY
198 _es_Frustumx(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top,
199              GLfixed zNear, GLfixed zFar)
200 {
201    _mesa_Frustum((GLdouble) (left / 65536.0),
202                  (GLdouble) (right / 65536.0),
203                  (GLdouble) (bottom / 65536.0),
204                  (GLdouble) (top / 65536.0),
205                  (GLdouble) (zNear / 65536.0),
206                  (GLdouble) (zFar / 65536.0));
207 }
208
209 void GL_APIENTRY
210 _es_GetClipPlanef(GLenum plane, GLfloat *equation)
211 {
212    unsigned int i;
213    GLdouble converted_equation[4];
214
215    _mesa_GetClipPlane(plane, converted_equation);
216    for (i = 0; i < Elements(converted_equation); i++) {
217       equation[i] = (GLfloat) (converted_equation[i]);
218    }
219 }
220
221 void GL_APIENTRY
222 _es_GetClipPlanex(GLenum plane, GLfixed *equation)
223 {
224    unsigned int i;
225    GLdouble converted_equation[4];
226
227    _mesa_GetClipPlane(plane, converted_equation);
228    for (i = 0; i < Elements(converted_equation); i++) {
229       equation[i] = (GLfixed) (converted_equation[i] * 65536);
230    }
231 }
232
233 void GL_APIENTRY
234 _es_GetLightxv(GLenum light, GLenum pname, GLfixed *params)
235 {
236    unsigned int i;
237    unsigned int n_params = 4;
238    GLfloat converted_params[4];
239
240    if (light < GL_LIGHT0 || light > GL_LIGHT7) {
241       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
242                   "glGetLightxv(light=0x%x)", light);
243       return;
244    }
245    switch(pname) {
246    case GL_AMBIENT:
247    case GL_DIFFUSE:
248    case GL_SPECULAR:
249    case GL_POSITION:
250       n_params = 4;
251       break;
252    case GL_SPOT_DIRECTION:
253       n_params = 3;
254       break;
255    case GL_SPOT_EXPONENT:
256    case GL_SPOT_CUTOFF:
257    case GL_CONSTANT_ATTENUATION:
258    case GL_LINEAR_ATTENUATION:
259    case GL_QUADRATIC_ATTENUATION:
260       n_params = 1;
261       break;
262    default:
263       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
264                   "glGetLightxv(pname=0x%x)", pname);
265       return;
266    }
267
268    _mesa_GetLightfv(light, pname, converted_params);
269    for (i = 0; i < n_params; i++) {
270       params[i] = (GLint) (converted_params[i] * 65536);
271    }
272 }
273
274 void GL_APIENTRY
275 _es_GetMaterialxv(GLenum face, GLenum pname, GLfixed *params)
276 {
277    unsigned int i;
278    unsigned int n_params = 4;
279    GLfloat converted_params[4];
280
281    switch(face) {
282    case GL_FRONT:
283    case GL_BACK:
284       break;
285    default:
286       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
287                   "glGetMaterialxv(face=0x%x)", face);
288       return;
289    }
290    switch(pname) {
291    case GL_SHININESS:
292       n_params = 1;
293       break;
294    case GL_AMBIENT:
295    case GL_DIFFUSE:
296    case GL_SPECULAR:
297    case GL_EMISSION:
298       n_params = 4;
299       break;
300    default:
301       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
302                   "glGetMaterialxv(pname=0x%x)", pname);
303       return;
304    }
305
306    _mesa_GetMaterialfv(face, pname, converted_params);
307    for (i = 0; i < n_params; i++) {
308       params[i] = (GLint) (converted_params[i] * 65536);
309    }
310 }
311
312 void GL_APIENTRY
313 _es_GetTexEnvxv(GLenum target, GLenum pname, GLfixed *params)
314 {
315    unsigned int i;
316    unsigned int n_params = 4;
317    GLfloat converted_params[4];
318    bool convert_params_value = true;
319
320    switch(target) {
321    case GL_POINT_SPRITE:
322       if (pname != GL_COORD_REPLACE) {
323          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
324                      "glGetTexEnvxv(target=0x%x)", target);
325          return;
326       }
327       break;
328    case GL_TEXTURE_FILTER_CONTROL_EXT:
329       if (pname != GL_TEXTURE_LOD_BIAS_EXT) {
330          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
331                      "glGetTexEnvxv(target=0x%x)", target);
332          return;
333       }
334       break;
335    case GL_TEXTURE_ENV:
336       if (pname != GL_TEXTURE_ENV_COLOR && pname != GL_RGB_SCALE && pname != GL_ALPHA_SCALE && pname != GL_TEXTURE_ENV_MODE && pname != GL_COMBINE_RGB && pname != GL_COMBINE_ALPHA && pname != GL_SRC0_RGB && pname != GL_SRC1_RGB && pname != GL_SRC2_RGB && pname != GL_SRC0_ALPHA && pname != GL_SRC1_ALPHA && pname != GL_SRC2_ALPHA && pname != GL_OPERAND0_RGB && pname != GL_OPERAND1_RGB && pname != GL_OPERAND2_RGB && pname != GL_OPERAND0_ALPHA && pname != GL_OPERAND1_ALPHA && pname != GL_OPERAND2_ALPHA) {
337          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
338                      "glGetTexEnvxv(target=0x%x)", target);
339          return;
340       }
341       break;
342    default:
343       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
344                   "glGetTexEnvxv(target=0x%x)", target);
345       return;
346    }
347    switch(pname) {
348    case GL_COORD_REPLACE:
349       convert_params_value = false;
350       n_params = 1;
351       break;
352    case GL_TEXTURE_LOD_BIAS_EXT:
353       n_params = 1;
354       break;
355    case GL_TEXTURE_ENV_COLOR:
356       n_params = 4;
357       break;
358    case GL_RGB_SCALE:
359    case GL_ALPHA_SCALE:
360       n_params = 1;
361       break;
362    case GL_TEXTURE_ENV_MODE:
363    case GL_COMBINE_RGB:
364    case GL_COMBINE_ALPHA:
365    case GL_SRC0_RGB:
366    case GL_SRC1_RGB:
367    case GL_SRC2_RGB:
368    case GL_SRC0_ALPHA:
369    case GL_SRC1_ALPHA:
370    case GL_SRC2_ALPHA:
371    case GL_OPERAND0_RGB:
372    case GL_OPERAND1_RGB:
373    case GL_OPERAND2_RGB:
374    case GL_OPERAND0_ALPHA:
375    case GL_OPERAND1_ALPHA:
376    case GL_OPERAND2_ALPHA:
377       convert_params_value = false;
378       n_params = 1;
379       break;
380    default:
381       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
382                   "glGetTexEnvxv(pname=0x%x)", pname);
383       return;
384    }
385
386    _mesa_GetTexEnvfv(target, pname, converted_params);
387    if (convert_params_value) {
388       for (i = 0; i < n_params; i++) {
389          params[i] = (GLint) (converted_params[i] * 65536);
390       }
391    } else {
392       for (i = 0; i < n_params; i++) {
393          params[i] = (GLfixed) converted_params[i];
394       }
395    }
396 }
397
398 void GL_APIENTRY
399 _check_GetTexGenivOES(GLenum coord, GLenum pname, GLint *params)
400 {
401    _mesa_GetTexGeniv(coord, pname, params);
402 }
403
404 void GL_APIENTRY
405 _check_GetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params)
406 {
407    _mesa_GetTexGeniv(coord, pname, (GLint *) params);
408 }
409
410 void GL_APIENTRY
411 _es_GetTexParameterxv(GLenum target, GLenum pname, GLfixed *params)
412 {
413    unsigned int i;
414    unsigned int n_params = 4;
415    GLfloat converted_params[4];
416    bool convert_params_value = true;
417
418    switch(target) {
419    case GL_TEXTURE_2D:
420    case GL_TEXTURE_CUBE_MAP:
421    case GL_TEXTURE_EXTERNAL_OES:
422       break;
423    default:
424       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
425                   "glGetTexParameterxv(target=0x%x)", target);
426       return;
427    }
428    switch(pname) {
429    case GL_TEXTURE_WRAP_S:
430    case GL_TEXTURE_WRAP_T:
431    case GL_TEXTURE_MIN_FILTER:
432    case GL_TEXTURE_MAG_FILTER:
433    case GL_GENERATE_MIPMAP:
434       convert_params_value = false;
435       n_params = 1;
436       break;
437    case GL_TEXTURE_CROP_RECT_OES:
438       n_params = 4;
439       break;
440    default:
441       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
442                   "glGetTexParameterxv(pname=0x%x)", pname);
443       return;
444    }
445
446    _mesa_GetTexParameterfv(target, pname, converted_params);
447    if (convert_params_value) {
448       for (i = 0; i < n_params; i++) {
449          params[i] = (GLint) (converted_params[i] * 65536);
450       }
451    } else {
452       for (i = 0; i < n_params; i++) {
453          params[i] = (GLfixed) converted_params[i];
454       }
455    }
456 }
457
458 void GL_APIENTRY
459 _es_LightModelx(GLenum pname, GLfixed param)
460 {
461    _mesa_LightModelf(pname, (GLfloat) param);
462 }
463
464 void GL_APIENTRY
465 _es_LightModelxv(GLenum pname, const GLfixed *params)
466 {
467    unsigned int i;
468    unsigned int n_params = 4;
469    GLfloat converted_params[4];
470    bool convert_params_value = true;
471
472    switch(pname) {
473    case GL_LIGHT_MODEL_AMBIENT:
474       n_params = 4;
475       break;
476    case GL_LIGHT_MODEL_TWO_SIDE:
477       convert_params_value = false;
478       n_params = 1;
479       break;
480    default:
481       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
482                   "glLightModelxv(pname=0x%x)", pname);
483       return;
484    }
485
486    if (convert_params_value) {
487       for (i = 0; i < n_params; i++) {
488          converted_params[i] = (GLfloat) (params[i] / 65536.0f);
489       }
490    } else {
491       for (i = 0; i < n_params; i++) {
492          converted_params[i] = (GLfloat) params[i];
493       }
494    }
495
496    _mesa_LightModelfv(pname, converted_params);
497 }
498
499 void GL_APIENTRY
500 _es_Lightx(GLenum light, GLenum pname, GLfixed param)
501 {
502    _mesa_Lightf(light, pname, (GLfloat) (param / 65536.0f));
503 }
504
505 void GL_APIENTRY
506 _es_Lightxv(GLenum light, GLenum pname, const GLfixed *params)
507 {
508    unsigned int i;
509    unsigned int n_params = 4;
510    GLfloat converted_params[4];
511
512    if (light < GL_LIGHT0 || light > GL_LIGHT7) {
513       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
514                   "glLightxv(light=0x%x)", light);
515       return;
516    }
517    switch(pname) {
518    case GL_AMBIENT:
519    case GL_DIFFUSE:
520    case GL_SPECULAR:
521    case GL_POSITION:
522       n_params = 4;
523       break;
524    case GL_SPOT_DIRECTION:
525       n_params = 3;
526       break;
527    case GL_SPOT_EXPONENT:
528    case GL_SPOT_CUTOFF:
529    case GL_CONSTANT_ATTENUATION:
530    case GL_LINEAR_ATTENUATION:
531    case GL_QUADRATIC_ATTENUATION:
532       n_params = 1;
533       break;
534    default:
535       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
536                   "glLightxv(pname=0x%x)", pname);
537       return;
538    }
539
540    for (i = 0; i < n_params; i++) {
541       converted_params[i] = (GLfloat) (params[i] / 65536.0f);
542    }
543
544    _mesa_Lightfv(light, pname, converted_params);
545 }
546
547 void GL_APIENTRY
548 _es_LineWidthx(GLfixed width)
549 {
550    _mesa_LineWidth((GLfloat) (width / 65536.0f));
551 }
552
553 void GL_APIENTRY
554 _es_LoadMatrixx(const GLfixed *m)
555 {
556    unsigned int i;
557    GLfloat converted_m[16];
558
559    for (i = 0; i < Elements(converted_m); i++) {
560       converted_m[i] = (GLfloat) (m[i] / 65536.0f);
561    }
562
563    _mesa_LoadMatrixf(converted_m);
564 }
565
566 void GL_APIENTRY
567 _es_Materialx(GLenum face, GLenum pname, GLfixed param)
568 {
569    if (face != GL_FRONT_AND_BACK) {
570       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
571                   "glMaterialx(face=0x%x)", face);
572       return;
573    }
574
575    if (pname != GL_SHININESS) {
576       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
577                   "glMaterialx(pname=0x%x)", pname);
578       return;
579    }
580
581    _es_Materialf(face, pname, (GLfloat) (param / 65536.0f));
582 }
583
584 void GL_APIENTRY
585 _es_Materialxv(GLenum face, GLenum pname, const GLfixed *params)
586 {
587    unsigned int i;
588    unsigned int n_params = 4;
589    GLfloat converted_params[4];
590
591    if (face != GL_FRONT_AND_BACK) {
592       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
593                   "glMaterialxv(face=0x%x)", face);
594       return;
595    }
596
597    switch(pname) {
598    case GL_AMBIENT:
599    case GL_DIFFUSE:
600    case GL_AMBIENT_AND_DIFFUSE:
601    case GL_SPECULAR:
602    case GL_EMISSION:
603       n_params = 4;
604       break;
605    case GL_SHININESS:
606       n_params = 1;
607       break;
608    default:
609       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
610                   "glMaterialxv(pname=0x%x)", pname);
611       return;
612    }
613
614    for (i = 0; i < n_params; i++) {
615       converted_params[i] = (GLfloat) (params[i] / 65536.0f);
616    }
617
618    _es_Materialfv(face, pname, converted_params);
619 }
620
621 void GL_APIENTRY
622 _es_MultMatrixx(const GLfixed *m)
623 {
624    unsigned int i;
625    GLfloat converted_m[16];
626
627    for (i = 0; i < Elements(converted_m); i++) {
628       converted_m[i] = (GLfloat) (m[i] / 65536.0f);
629    }
630
631    _mesa_MultMatrixf(converted_m);
632 }
633
634 void GL_APIENTRY
635 _es_MultiTexCoord4x(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
636 {
637    _es_MultiTexCoord4f(texture,
638                        (GLfloat) (s / 65536.0f),
639                        (GLfloat) (t / 65536.0f),
640                        (GLfloat) (r / 65536.0f),
641                        (GLfloat) (q / 65536.0f));
642 }
643
644 void GL_APIENTRY
645 _es_Normal3x(GLfixed nx, GLfixed ny, GLfixed nz)
646 {
647    _es_Normal3f((GLfloat) (nx / 65536.0f),
648                 (GLfloat) (ny / 65536.0f),
649                 (GLfloat) (nz / 65536.0f));
650 }
651
652 void GL_APIENTRY
653 _es_Orthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
654            GLfloat zNear, GLfloat zFar)
655 {
656    _mesa_Ortho((GLdouble) (left),
657                (GLdouble) (right),
658                (GLdouble) (bottom),
659                (GLdouble) (top),
660                (GLdouble) (zNear),
661                (GLdouble) (zFar));
662 }
663
664 void GL_APIENTRY
665 _es_Orthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top,
666            GLfixed zNear, GLfixed zFar)
667 {
668    _mesa_Ortho((GLdouble) (left / 65536.0),
669                (GLdouble) (right / 65536.0),
670                (GLdouble) (bottom / 65536.0),
671                (GLdouble) (top / 65536.0),
672                (GLdouble) (zNear / 65536.0),
673                (GLdouble) (zFar / 65536.0));
674 }
675
676 void GL_APIENTRY
677 _es_PointParameterx(GLenum pname, GLfixed param)
678 {
679    switch(pname) {
680    case GL_POINT_SIZE_MIN:
681    case GL_POINT_SIZE_MAX:
682    case GL_POINT_FADE_THRESHOLD_SIZE:
683       break;
684    default:
685       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
686                   "glPointParameterx(pname=0x%x)", pname);
687       return;
688    }
689
690    _mesa_PointParameterf(pname, (GLfloat) (param / 65536.0f));
691 }
692
693 void GL_APIENTRY
694 _es_PointParameterxv(GLenum pname, const GLfixed *params)
695 {
696    unsigned int i;
697    unsigned int n_params = 3;
698    GLfloat converted_params[3];
699
700    switch(pname) {
701    case GL_POINT_SIZE_MIN:
702    case GL_POINT_SIZE_MAX:
703    case GL_POINT_FADE_THRESHOLD_SIZE:
704       n_params = 1;
705       break;
706    case GL_POINT_DISTANCE_ATTENUATION:
707       n_params = 3;
708       break;
709    default:
710       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
711                   "glPointParameterxv(pname=0x%x)", pname);
712       return;
713    }
714
715    for (i = 0; i < n_params; i++) {
716       converted_params[i] = (GLfloat) (params[i] / 65536.0f);
717    }
718
719    _mesa_PointParameterfv(pname, converted_params);
720 }
721
722 void GL_APIENTRY
723 _es_PointSizex(GLfixed size)
724 {
725    _mesa_PointSize((GLfloat) (size / 65536.0f));
726 }
727
728 void GL_APIENTRY
729 _es_PolygonOffsetx(GLfixed factor, GLfixed units)
730 {
731    _mesa_PolygonOffset((GLfloat) (factor / 65536.0f),
732                        (GLfloat) (units / 65536.0f));
733 }
734
735 void GL_APIENTRY
736 _es_Rotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
737 {
738    _mesa_Rotatef((GLfloat) (angle / 65536.0f),
739                  (GLfloat) (x / 65536.0f),
740                  (GLfloat) (y / 65536.0f),
741                  (GLfloat) (z / 65536.0f));
742 }
743
744 void GL_APIENTRY
745 _es_SampleCoveragex(GLclampx value, GLboolean invert)
746 {
747    _mesa_SampleCoverageARB((GLclampf) (value / 65536.0f),
748                            invert);
749 }
750
751 void GL_APIENTRY
752 _es_Scalex(GLfixed x, GLfixed y, GLfixed z)
753 {
754    _mesa_Scalef((GLfloat) (x / 65536.0f),
755                 (GLfloat) (y / 65536.0f),
756                 (GLfloat) (z / 65536.0f));
757 }
758
759 void GL_APIENTRY
760 _es_TexEnvx(GLenum target, GLenum pname, GLfixed param)
761 {
762    GLfloat converted_param;
763    bool convert_param_value = true;
764
765    switch(target) {
766    case GL_POINT_SPRITE:
767       if (pname != GL_COORD_REPLACE) {
768          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
769                      "glTexEnvx(target=0x%x)", target);
770          return;
771       }
772       break;
773    case GL_TEXTURE_FILTER_CONTROL_EXT:
774       if (pname != GL_TEXTURE_LOD_BIAS_EXT) {
775          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
776                      "glTexEnvx(target=0x%x)", target);
777          return;
778       }
779       break;
780    case GL_TEXTURE_ENV:
781       if (pname != GL_TEXTURE_ENV_MODE && pname != GL_COMBINE_RGB && pname != GL_COMBINE_ALPHA && pname != GL_RGB_SCALE && pname != GL_ALPHA_SCALE && pname != GL_SRC0_RGB && pname != GL_SRC1_RGB && pname != GL_SRC2_RGB && pname != GL_SRC0_ALPHA && pname != GL_SRC1_ALPHA && pname != GL_SRC2_ALPHA && pname != GL_OPERAND0_RGB && pname != GL_OPERAND1_RGB && pname != GL_OPERAND2_RGB && pname != GL_OPERAND0_ALPHA && pname != GL_OPERAND1_ALPHA && pname != GL_OPERAND2_ALPHA && pname != GL_TEXTURE_ENV_COLOR) {
782          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
783                      "glTexEnvx(target=0x%x)", target);
784          return;
785       }
786       break;
787    default:
788       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
789                   "glTexEnvx(target=0x%x)", target);
790       return;
791    }
792    switch(pname) {
793    case GL_COORD_REPLACE:
794       if (param != GL_TRUE && param != GL_FALSE) {
795          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
796                      "glTexEnvx(pname=0x%x)", pname);
797          return;
798       }
799       convert_param_value = false;
800       break;
801    case GL_TEXTURE_LOD_BIAS_EXT:
802       break;
803    case GL_TEXTURE_ENV_MODE:
804       if (param != GL_REPLACE && param != GL_MODULATE && param != GL_DECAL && param != GL_BLEND && param != GL_ADD && param != GL_COMBINE) {
805          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
806                      "glTexEnvx(pname=0x%x)", pname);
807          return;
808       }
809       convert_param_value = false;
810       break;
811    case GL_COMBINE_RGB:
812       if (param != GL_REPLACE && param != GL_MODULATE && param != GL_ADD && param != GL_ADD_SIGNED && param != GL_INTERPOLATE && param != GL_SUBTRACT && param != GL_DOT3_RGB && param != GL_DOT3_RGBA) {
813          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
814                      "glTexEnvx(pname=0x%x)", pname);
815          return;
816       }
817       convert_param_value = false;
818       break;
819    case GL_COMBINE_ALPHA:
820       if (param != GL_REPLACE && param != GL_MODULATE && param != GL_ADD && param != GL_ADD_SIGNED && param != GL_INTERPOLATE && param != GL_SUBTRACT) {
821          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
822                      "glTexEnvx(pname=0x%x)", pname);
823          return;
824       }
825       convert_param_value = false;
826       break;
827    case GL_RGB_SCALE:
828    case GL_ALPHA_SCALE:
829       break;
830    case GL_SRC0_RGB:
831    case GL_SRC1_RGB:
832    case GL_SRC2_RGB:
833    case GL_SRC0_ALPHA:
834    case GL_SRC1_ALPHA:
835    case GL_SRC2_ALPHA:
836       convert_param_value = false;
837       break;
838    case GL_OPERAND0_RGB:
839    case GL_OPERAND1_RGB:
840    case GL_OPERAND2_RGB:
841       if (param != GL_SRC_COLOR && param != GL_ONE_MINUS_SRC_COLOR && param != GL_SRC_ALPHA && param != GL_ONE_MINUS_SRC_ALPHA) {
842          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
843                      "glTexEnvx(pname=0x%x)", pname);
844          return;
845       }
846       convert_param_value = false;
847       break;
848    case GL_OPERAND0_ALPHA:
849    case GL_OPERAND1_ALPHA:
850    case GL_OPERAND2_ALPHA:
851       if (param != GL_SRC_ALPHA && param != GL_ONE_MINUS_SRC_ALPHA) {
852          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
853                      "glTexEnvx(pname=0x%x)", pname);
854          return;
855       }
856       convert_param_value = false;
857       break;
858    default:
859       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
860                   "glTexEnvx(pname=0x%x)", pname);
861       return;
862    }
863
864    if (convert_param_value) {
865       converted_param = (GLfloat) (param / 65536.0f);
866    } else {
867       converted_param = (GLfloat) param;
868    }
869
870    _mesa_TexEnvf(target, pname, converted_param);
871 }
872
873 void GL_APIENTRY
874 _es_TexEnvxv(GLenum target, GLenum pname, const GLfixed *params)
875 {
876    unsigned int i;
877    unsigned int n_params = 4;
878    GLfloat converted_params[4];
879    bool convert_params_value = true;
880
881    switch(target) {
882    case GL_POINT_SPRITE:
883       if (pname != GL_COORD_REPLACE) {
884          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
885                      "glTexEnvxv(target=0x%x)", target);
886          return;
887       }
888       break;
889    case GL_TEXTURE_FILTER_CONTROL_EXT:
890       if (pname != GL_TEXTURE_LOD_BIAS_EXT) {
891          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
892                      "glTexEnvxv(target=0x%x)", target);
893          return;
894       }
895       break;
896    case GL_TEXTURE_ENV:
897       if (pname != GL_TEXTURE_ENV_MODE && pname != GL_COMBINE_RGB && pname != GL_COMBINE_ALPHA && pname != GL_RGB_SCALE && pname != GL_ALPHA_SCALE && pname != GL_SRC0_RGB && pname != GL_SRC1_RGB && pname != GL_SRC2_RGB && pname != GL_SRC0_ALPHA && pname != GL_SRC1_ALPHA && pname != GL_SRC2_ALPHA && pname != GL_OPERAND0_RGB && pname != GL_OPERAND1_RGB && pname != GL_OPERAND2_RGB && pname != GL_OPERAND0_ALPHA && pname != GL_OPERAND1_ALPHA && pname != GL_OPERAND2_ALPHA && pname != GL_TEXTURE_ENV_COLOR) {
898          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
899                      "glTexEnvxv(target=0x%x)", target);
900          return;
901       }
902       break;
903    default:
904       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
905                   "glTexEnvxv(target=0x%x)", target);
906       return;
907    }
908    switch(pname) {
909    case GL_COORD_REPLACE:
910       if (params[0] != GL_TRUE && params[0] != GL_FALSE) {
911          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
912                      "glTexEnvxv(pname=0x%x)", pname);
913          return;
914       }
915       convert_params_value = false;
916       n_params = 1;
917       break;
918    case GL_TEXTURE_LOD_BIAS_EXT:
919       n_params = 1;
920       break;
921    case GL_TEXTURE_ENV_MODE:
922       if (params[0] != GL_REPLACE && params[0] != GL_MODULATE && params[0] != GL_DECAL && params[0] != GL_BLEND && params[0] != GL_ADD && params[0] != GL_COMBINE) {
923          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
924                      "glTexEnvxv(pname=0x%x)", pname);
925          return;
926       }
927       convert_params_value = false;
928       n_params = 1;
929       break;
930    case GL_COMBINE_RGB:
931       if (params[0] != GL_REPLACE && params[0] != GL_MODULATE && params[0] != GL_ADD && params[0] != GL_ADD_SIGNED && params[0] != GL_INTERPOLATE && params[0] != GL_SUBTRACT && params[0] != GL_DOT3_RGB && params[0] != GL_DOT3_RGBA) {
932          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
933                      "glTexEnvxv(pname=0x%x)", pname);
934          return;
935       }
936       convert_params_value = false;
937       n_params = 1;
938       break;
939    case GL_COMBINE_ALPHA:
940       if (params[0] != GL_REPLACE && params[0] != GL_MODULATE && params[0] != GL_ADD && params[0] != GL_ADD_SIGNED && params[0] != GL_INTERPOLATE && params[0] != GL_SUBTRACT) {
941          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
942                      "glTexEnvxv(pname=0x%x)", pname);
943          return;
944       }
945       convert_params_value = false;
946       n_params = 1;
947       break;
948    case GL_RGB_SCALE:
949    case GL_ALPHA_SCALE:
950       break;
951    case GL_SRC0_RGB:
952    case GL_SRC1_RGB:
953    case GL_SRC2_RGB:
954    case GL_SRC0_ALPHA:
955    case GL_SRC1_ALPHA:
956    case GL_SRC2_ALPHA:
957       convert_params_value = false;
958       n_params = 1;
959       break;
960    case GL_OPERAND0_RGB:
961    case GL_OPERAND1_RGB:
962    case GL_OPERAND2_RGB:
963       if (params[0] != GL_SRC_COLOR && params[0] != GL_ONE_MINUS_SRC_COLOR && params[0] != GL_SRC_ALPHA && params[0] != GL_ONE_MINUS_SRC_ALPHA) {
964          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
965                      "glTexEnvxv(pname=0x%x)", pname);
966          return;
967       }
968       convert_params_value = false;
969       n_params = 1;
970       break;
971    case GL_OPERAND0_ALPHA:
972    case GL_OPERAND1_ALPHA:
973    case GL_OPERAND2_ALPHA:
974       if (params[0] != GL_SRC_ALPHA && params[0] != GL_ONE_MINUS_SRC_ALPHA) {
975          _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
976                      "glTexEnvxv(pname=0x%x)", pname);
977          return;
978       }
979       convert_params_value = false;
980       n_params = 1;
981       break;
982    case GL_TEXTURE_ENV_COLOR:
983       n_params = 4;
984       break;
985    default:
986       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
987                   "glTexEnvxv(pname=0x%x)", pname);
988       return;
989    }
990
991    if (convert_params_value) {
992       for (i = 0; i < n_params; i++) {
993          converted_params[i] = (GLfloat) (params[i] / 65536.0f);
994       }
995    } else {
996       for (i = 0; i < n_params; i++) {
997          converted_params[i] = (GLfloat) params[i];
998       }
999    }
1000
1001    _mesa_TexEnvfv(target, pname, converted_params);
1002 }
1003
1004 void GL_APIENTRY
1005 _check_TexGeniOES(GLenum coord, GLenum pname, GLint param)
1006 {
1007    _es_TexGenf(coord, pname, (GLfloat) param);
1008 }
1009
1010 void GL_APIENTRY
1011 _check_TexGenivOES(GLenum coord, GLenum pname, const GLint *params)
1012 {
1013    _es_TexGenf(coord, pname, (GLfloat) params[0]);
1014 }
1015
1016 void GL_APIENTRY
1017 _check_TexGenxOES(GLenum coord, GLenum pname, GLfixed param)
1018 {
1019    _es_TexGenf(coord, pname, (GLfloat) param);
1020 }
1021
1022 void GL_APIENTRY
1023 _check_TexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params)
1024 {
1025    _es_TexGenf(coord, pname, (GLfloat) params[0]);
1026 }
1027
1028 void GL_APIENTRY
1029 _es_TexParameterx(GLenum target, GLenum pname, GLfixed param)
1030 {
1031    if (pname == GL_TEXTURE_MAX_ANISOTROPY_EXT) {
1032       _mesa_TexParameterf(target, pname, (GLfloat) (param / 65536.0f));
1033    } else {
1034       _mesa_TexParameterf(target, pname, (GLfloat) param);
1035    }
1036 }
1037
1038 void GL_APIENTRY
1039 _es_TexParameterxv(GLenum target, GLenum pname, const GLfixed *params)
1040 {
1041    unsigned int i;
1042    unsigned int n_params = 4;
1043    GLfloat converted_params[4];
1044    bool convert_params_value = true;
1045
1046    switch(target) {
1047    case GL_TEXTURE_2D:
1048    case GL_TEXTURE_CUBE_MAP:
1049    case GL_TEXTURE_EXTERNAL_OES:
1050       break;
1051    default:
1052       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
1053                   "glTexParameterxv(target=0x%x)", target);
1054       return;
1055    }
1056    switch(pname) {
1057    case GL_TEXTURE_WRAP_S:
1058    case GL_TEXTURE_WRAP_T:
1059       convert_params_value = false;
1060       n_params = 1;
1061       break;
1062    case GL_TEXTURE_MIN_FILTER:
1063    case GL_TEXTURE_MAG_FILTER:
1064    case GL_GENERATE_MIPMAP:
1065       convert_params_value = false;
1066       n_params = 1;
1067       break;
1068    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1069       n_params = 1;
1070       break;
1071    case GL_TEXTURE_CROP_RECT_OES:
1072       n_params = 4;
1073       break;
1074    default:
1075       _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
1076                   "glTexParameterxv(pname=0x%x)", pname);
1077       return;
1078    }
1079
1080    if (convert_params_value) {
1081       for (i = 0; i < n_params; i++) {
1082          converted_params[i] = (GLfloat) (params[i] / 65536.0f);
1083       }
1084    } else {
1085       for (i = 0; i < n_params; i++) {
1086          converted_params[i] = (GLfloat) params[i];
1087       }
1088    }
1089
1090    _mesa_TexParameterfv(target, pname, converted_params);
1091 }
1092
1093 void GL_APIENTRY
1094 _es_Translatex(GLfixed x, GLfixed y, GLfixed z)
1095 {
1096     _mesa_Translatef((GLfloat) (x / 65536.0f),
1097                      (GLfloat) (y / 65536.0f),
1098                      (GLfloat) (z / 65536.0f));
1099 }
1100
1101 #endif /* FEATURE_ES1 */