es1_conversion.c revision f329adfa497b6b2e0a125ab98a38c656a017270d
1cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include <stdbool.h>
2cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "main/mfeatures.h"
38cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com
4cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#if FEATURE_ES1
5cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com
6cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "api_loopback.h"
78cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "api_exec.h"
8cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "blend.h"
98cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "clear.h"
10cf2cfa174ca878c144e17e9fc60ca8e9070d7dededisonn@google.com#include "clip.h"
118cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "context.h"
128cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "depth.h"
138cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "fog.h"
148cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "imports.h"
158cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "light.h"
168cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "lines.h"
178cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "matrix.h"
188cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "multisample.h"
198cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "pixelstore.h"
208cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#include "points.h"
218cee797901763ab0922eb9ef484cfdcbc94bee54edisonn@google.com#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
38void GL_APIENTRY
39_es_AlphaFuncx(GLenum func, GLclampx ref)
40{
41   _mesa_AlphaFunc(func, (GLclampf) (ref / 65536.0f));
42}
43
44void 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
53void GL_APIENTRY
54_es_ClearDepthx(GLclampx depth)
55{
56   _mesa_ClearDepthf((GLclampf) (depth / 65536.0f));
57}
58
59void 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
72void 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
85void 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
94void 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
103void GL_APIENTRY
104_es_DepthRangex(GLclampx zNear, GLclampx zFar)
105{
106    _mesa_DepthRangef((GLclampf) (zNear / 65536.0f),
107                      (GLclampf) (zFar / 65536.0f));
108}
109
110void 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
121void 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
134void 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
145void 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
185void 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
197void 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
209void 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
221void 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
233void 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
274void 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
312void 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
398void GL_APIENTRY
399_check_GetTexGenivOES(GLenum coord, GLenum pname, GLint *params)
400{
401   unsigned int i;
402   unsigned int n_params = 1;
403   GLfloat converted_params[1];
404
405   switch(coord) {
406   case GL_TEXTURE_GEN_STR_OES:
407      break;
408   default:
409      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
410                  "glGetTexGenivOES(coord=0x%x)", coord);
411      return;
412   }
413   switch(pname) {
414   case GL_TEXTURE_GEN_MODE:
415      n_params = 1;
416      break;
417   default:
418      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
419                  "glGetTexGenivOES(pname=0x%x)", pname);
420      return;
421   }
422
423   _es_GetTexGenfv(coord, pname, converted_params);
424   for (i = 0; i < n_params; i++) {
425      params[i] = (GLfloat) converted_params[i];
426   }
427}
428
429void GL_APIENTRY
430_check_GetTexGenxvOES(GLenum coord, GLenum pname, GLfixed *params)
431{
432   unsigned int i;
433   unsigned int n_params = 1;
434   GLfloat converted_params[1];
435
436   switch(coord) {
437   case GL_TEXTURE_GEN_STR_OES:
438      break;
439   default:
440      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
441                  "glGetTexGenxvOES(coord=0x%x)", coord);
442      return;
443   }
444   switch(pname) {
445   case GL_TEXTURE_GEN_MODE:
446      n_params = 1;
447      break;
448   default:
449      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
450                  "glGetTexGenxvOES(pname=0x%x)", pname);
451      return;
452   }
453
454   _es_GetTexGenfv(coord, pname, converted_params);
455   for (i = 0; i < n_params; i++) {
456      params[i] = (GLfloat) converted_params[i];
457   }
458}
459
460void GL_APIENTRY
461_es_GetTexParameterxv(GLenum target, GLenum pname, GLfixed *params)
462{
463   unsigned int i;
464   unsigned int n_params = 4;
465   GLfloat converted_params[4];
466   bool convert_params_value = true;
467
468   switch(target) {
469   case GL_TEXTURE_2D:
470   case GL_TEXTURE_CUBE_MAP:
471   case GL_TEXTURE_EXTERNAL_OES:
472      break;
473   default:
474      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
475                  "glGetTexParameterxv(target=0x%x)", target);
476      return;
477   }
478   switch(pname) {
479   case GL_TEXTURE_WRAP_S:
480   case GL_TEXTURE_WRAP_T:
481   case GL_TEXTURE_MIN_FILTER:
482   case GL_TEXTURE_MAG_FILTER:
483   case GL_GENERATE_MIPMAP:
484      convert_params_value = false;
485      n_params = 1;
486      break;
487   case GL_TEXTURE_CROP_RECT_OES:
488      n_params = 4;
489      break;
490   default:
491      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
492                  "glGetTexParameterxv(pname=0x%x)", pname);
493      return;
494   }
495
496   _mesa_GetTexParameterfv(target, pname, converted_params);
497   if (convert_params_value) {
498      for (i = 0; i < n_params; i++) {
499         params[i] = (GLint) (converted_params[i] * 65536);
500      }
501   } else {
502      for (i = 0; i < n_params; i++) {
503         params[i] = (GLfixed) converted_params[i];
504      }
505   }
506}
507
508void GL_APIENTRY
509_es_LightModelx(GLenum pname, GLfixed param)
510{
511   _mesa_LightModelf(pname, (GLfloat) param);
512}
513
514void GL_APIENTRY
515_es_LightModelxv(GLenum pname, const GLfixed *params)
516{
517   unsigned int i;
518   unsigned int n_params = 4;
519   GLfloat converted_params[4];
520   bool convert_params_value = true;
521
522   switch(pname) {
523   case GL_LIGHT_MODEL_AMBIENT:
524      n_params = 4;
525      break;
526   case GL_LIGHT_MODEL_TWO_SIDE:
527      convert_params_value = false;
528      n_params = 1;
529      break;
530   default:
531      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
532                  "glLightModelxv(pname=0x%x)", pname);
533      return;
534   }
535
536   if (convert_params_value) {
537      for (i = 0; i < n_params; i++) {
538         converted_params[i] = (GLfloat) (params[i] / 65536.0f);
539      }
540   } else {
541      for (i = 0; i < n_params; i++) {
542         converted_params[i] = (GLfloat) params[i];
543      }
544   }
545
546   _mesa_LightModelfv(pname, converted_params);
547}
548
549void GL_APIENTRY
550_es_Lightx(GLenum light, GLenum pname, GLfixed param)
551{
552   _mesa_Lightf(light, pname, (GLfloat) (param / 65536.0f));
553}
554
555void GL_APIENTRY
556_es_Lightxv(GLenum light, GLenum pname, const GLfixed *params)
557{
558   unsigned int i;
559   unsigned int n_params = 4;
560   GLfloat converted_params[4];
561
562   if (light < GL_LIGHT0 || light > GL_LIGHT7) {
563      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
564                  "glLightxv(light=0x%x)", light);
565      return;
566   }
567   switch(pname) {
568   case GL_AMBIENT:
569   case GL_DIFFUSE:
570   case GL_SPECULAR:
571   case GL_POSITION:
572      n_params = 4;
573      break;
574   case GL_SPOT_DIRECTION:
575      n_params = 3;
576      break;
577   case GL_SPOT_EXPONENT:
578   case GL_SPOT_CUTOFF:
579   case GL_CONSTANT_ATTENUATION:
580   case GL_LINEAR_ATTENUATION:
581   case GL_QUADRATIC_ATTENUATION:
582      n_params = 1;
583      break;
584   default:
585      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
586                  "glLightxv(pname=0x%x)", pname);
587      return;
588   }
589
590   for (i = 0; i < n_params; i++) {
591      converted_params[i] = (GLfloat) (params[i] / 65536.0f);
592   }
593
594   _mesa_Lightfv(light, pname, converted_params);
595}
596
597void GL_APIENTRY
598_es_LineWidthx(GLfixed width)
599{
600   _mesa_LineWidth((GLfloat) (width / 65536.0f));
601}
602
603void GL_APIENTRY
604_es_LoadMatrixx(const GLfixed *m)
605{
606   unsigned int i;
607   GLfloat converted_m[16];
608
609   for (i = 0; i < Elements(converted_m); i++) {
610      converted_m[i] = (GLfloat) (m[i] / 65536.0f);
611   }
612
613   _mesa_LoadMatrixf(converted_m);
614}
615
616void GL_APIENTRY
617_es_Materialx(GLenum face, GLenum pname, GLfixed param)
618{
619   if (face != GL_FRONT_AND_BACK) {
620      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
621                  "glMaterialx(face=0x%x)", face);
622      return;
623   }
624
625   if (pname != GL_SHININESS) {
626      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
627                  "glMaterialx(pname=0x%x)", pname);
628      return;
629   }
630
631   _es_Materialf(face, pname, (GLfloat) (param / 65536.0f));
632}
633
634void GL_APIENTRY
635_es_Materialxv(GLenum face, GLenum pname, const GLfixed *params)
636{
637   unsigned int i;
638   unsigned int n_params = 4;
639   GLfloat converted_params[4];
640
641   if (face != GL_FRONT_AND_BACK) {
642      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
643                  "glMaterialxv(face=0x%x)", face);
644      return;
645   }
646
647   switch(pname) {
648   case GL_AMBIENT:
649   case GL_DIFFUSE:
650   case GL_AMBIENT_AND_DIFFUSE:
651   case GL_SPECULAR:
652   case GL_EMISSION:
653      n_params = 4;
654      break;
655   case GL_SHININESS:
656      n_params = 1;
657      break;
658   default:
659      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
660                  "glMaterialxv(pname=0x%x)", pname);
661      return;
662   }
663
664   for (i = 0; i < n_params; i++) {
665      converted_params[i] = (GLfloat) (params[i] / 65536.0f);
666   }
667
668   _es_Materialfv(face, pname, converted_params);
669}
670
671void GL_APIENTRY
672_es_MultMatrixx(const GLfixed *m)
673{
674   unsigned int i;
675   GLfloat converted_m[16];
676
677   for (i = 0; i < Elements(converted_m); i++) {
678      converted_m[i] = (GLfloat) (m[i] / 65536.0f);
679   }
680
681   _mesa_MultMatrixf(converted_m);
682}
683
684void GL_APIENTRY
685_es_MultiTexCoord4x(GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
686{
687   _es_MultiTexCoord4f(texture,
688                       (GLfloat) (s / 65536.0f),
689                       (GLfloat) (t / 65536.0f),
690                       (GLfloat) (r / 65536.0f),
691                       (GLfloat) (q / 65536.0f));
692}
693
694void GL_APIENTRY
695_es_Normal3x(GLfixed nx, GLfixed ny, GLfixed nz)
696{
697   _es_Normal3f((GLfloat) (nx / 65536.0f),
698                (GLfloat) (ny / 65536.0f),
699                (GLfloat) (nz / 65536.0f));
700}
701
702void GL_APIENTRY
703_es_Orthof(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top,
704           GLfloat zNear, GLfloat zFar)
705{
706   _mesa_Ortho((GLdouble) (left),
707               (GLdouble) (right),
708               (GLdouble) (bottom),
709               (GLdouble) (top),
710               (GLdouble) (zNear),
711               (GLdouble) (zFar));
712}
713
714void GL_APIENTRY
715_es_Orthox(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top,
716           GLfixed zNear, GLfixed zFar)
717{
718   _mesa_Ortho((GLdouble) (left / 65536.0),
719               (GLdouble) (right / 65536.0),
720               (GLdouble) (bottom / 65536.0),
721               (GLdouble) (top / 65536.0),
722               (GLdouble) (zNear / 65536.0),
723               (GLdouble) (zFar / 65536.0));
724}
725
726void GL_APIENTRY
727_es_PointParameterx(GLenum pname, GLfixed param)
728{
729   switch(pname) {
730   case GL_POINT_SIZE_MIN:
731   case GL_POINT_SIZE_MAX:
732   case GL_POINT_FADE_THRESHOLD_SIZE:
733      break;
734   default:
735      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
736                  "glPointParameterx(pname=0x%x)", pname);
737      return;
738   }
739
740   _mesa_PointParameterf(pname, (GLfloat) (param / 65536.0f));
741}
742
743void GL_APIENTRY
744_es_PointParameterxv(GLenum pname, const GLfixed *params)
745{
746   unsigned int i;
747   unsigned int n_params = 3;
748   GLfloat converted_params[3];
749
750   switch(pname) {
751   case GL_POINT_SIZE_MIN:
752   case GL_POINT_SIZE_MAX:
753   case GL_POINT_FADE_THRESHOLD_SIZE:
754      n_params = 1;
755      break;
756   case GL_POINT_DISTANCE_ATTENUATION:
757      n_params = 3;
758      break;
759   default:
760      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
761                  "glPointParameterxv(pname=0x%x)", pname);
762      return;
763   }
764
765   for (i = 0; i < n_params; i++) {
766      converted_params[i] = (GLfloat) (params[i] / 65536.0f);
767   }
768
769   _mesa_PointParameterfv(pname, converted_params);
770}
771
772void GL_APIENTRY
773_es_PointSizex(GLfixed size)
774{
775   _mesa_PointSize((GLfloat) (size / 65536.0f));
776}
777
778void GL_APIENTRY
779_es_PolygonOffsetx(GLfixed factor, GLfixed units)
780{
781   _mesa_PolygonOffset((GLfloat) (factor / 65536.0f),
782                       (GLfloat) (units / 65536.0f));
783}
784
785void GL_APIENTRY
786_es_Rotatex(GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
787{
788   _mesa_Rotatef((GLfloat) (angle / 65536.0f),
789                 (GLfloat) (x / 65536.0f),
790                 (GLfloat) (y / 65536.0f),
791                 (GLfloat) (z / 65536.0f));
792}
793
794void GL_APIENTRY
795_es_SampleCoveragex(GLclampx value, GLboolean invert)
796{
797   _mesa_SampleCoverageARB((GLclampf) (value / 65536.0f),
798                           invert);
799}
800
801void GL_APIENTRY
802_es_Scalex(GLfixed x, GLfixed y, GLfixed z)
803{
804   _mesa_Scalef((GLfloat) (x / 65536.0f),
805                (GLfloat) (y / 65536.0f),
806                (GLfloat) (z / 65536.0f));
807}
808
809void GL_APIENTRY
810_es_TexEnvx(GLenum target, GLenum pname, GLfixed param)
811{
812   GLfloat converted_param;
813   bool convert_param_value = true;
814
815   switch(target) {
816   case GL_POINT_SPRITE:
817      if (pname != GL_COORD_REPLACE) {
818         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
819                     "glTexEnvx(target=0x%x)", target);
820         return;
821      }
822      break;
823   case GL_TEXTURE_FILTER_CONTROL_EXT:
824      if (pname != GL_TEXTURE_LOD_BIAS_EXT) {
825         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
826                     "glTexEnvx(target=0x%x)", target);
827         return;
828      }
829      break;
830   case GL_TEXTURE_ENV:
831      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) {
832         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
833                     "glTexEnvx(target=0x%x)", target);
834         return;
835      }
836      break;
837   default:
838      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
839                  "glTexEnvx(target=0x%x)", target);
840      return;
841   }
842   switch(pname) {
843   case GL_COORD_REPLACE:
844      if (param != GL_TRUE && param != GL_FALSE) {
845         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
846                     "glTexEnvx(pname=0x%x)", pname);
847         return;
848      }
849      convert_param_value = false;
850      break;
851   case GL_TEXTURE_LOD_BIAS_EXT:
852      break;
853   case GL_TEXTURE_ENV_MODE:
854      if (param != GL_REPLACE && param != GL_MODULATE && param != GL_DECAL && param != GL_BLEND && param != GL_ADD && param != GL_COMBINE) {
855         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
856                     "glTexEnvx(pname=0x%x)", pname);
857         return;
858      }
859      convert_param_value = false;
860      break;
861   case GL_COMBINE_RGB:
862      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) {
863         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
864                     "glTexEnvx(pname=0x%x)", pname);
865         return;
866      }
867      convert_param_value = false;
868      break;
869   case GL_COMBINE_ALPHA:
870      if (param != GL_REPLACE && param != GL_MODULATE && param != GL_ADD && param != GL_ADD_SIGNED && param != GL_INTERPOLATE && param != GL_SUBTRACT) {
871         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
872                     "glTexEnvx(pname=0x%x)", pname);
873         return;
874      }
875      convert_param_value = false;
876      break;
877   case GL_RGB_SCALE:
878   case GL_ALPHA_SCALE:
879      break;
880   case GL_SRC0_RGB:
881   case GL_SRC1_RGB:
882   case GL_SRC2_RGB:
883   case GL_SRC0_ALPHA:
884   case GL_SRC1_ALPHA:
885   case GL_SRC2_ALPHA:
886      convert_param_value = false;
887      break;
888   case GL_OPERAND0_RGB:
889   case GL_OPERAND1_RGB:
890   case GL_OPERAND2_RGB:
891      if (param != GL_SRC_COLOR && param != GL_ONE_MINUS_SRC_COLOR && param != GL_SRC_ALPHA && param != GL_ONE_MINUS_SRC_ALPHA) {
892         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
893                     "glTexEnvx(pname=0x%x)", pname);
894         return;
895      }
896      convert_param_value = false;
897      break;
898   case GL_OPERAND0_ALPHA:
899   case GL_OPERAND1_ALPHA:
900   case GL_OPERAND2_ALPHA:
901      if (param != GL_SRC_ALPHA && param != GL_ONE_MINUS_SRC_ALPHA) {
902         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
903                     "glTexEnvx(pname=0x%x)", pname);
904         return;
905      }
906      convert_param_value = false;
907      break;
908   default:
909      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
910                  "glTexEnvx(pname=0x%x)", pname);
911      return;
912   }
913
914   if (convert_param_value) {
915      converted_param = (GLfloat) (param / 65536.0f);
916   } else {
917      converted_param = (GLfloat) param;
918   }
919
920   _mesa_TexEnvf(target, pname, converted_param);
921}
922
923void GL_APIENTRY
924_es_TexEnvxv(GLenum target, GLenum pname, const GLfixed *params)
925{
926   unsigned int i;
927   unsigned int n_params = 4;
928   GLfloat converted_params[4];
929   bool convert_params_value = true;
930
931   switch(target) {
932   case GL_POINT_SPRITE:
933      if (pname != GL_COORD_REPLACE) {
934         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
935                     "glTexEnvxv(target=0x%x)", target);
936         return;
937      }
938      break;
939   case GL_TEXTURE_FILTER_CONTROL_EXT:
940      if (pname != GL_TEXTURE_LOD_BIAS_EXT) {
941         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
942                     "glTexEnvxv(target=0x%x)", target);
943         return;
944      }
945      break;
946   case GL_TEXTURE_ENV:
947      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) {
948         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
949                     "glTexEnvxv(target=0x%x)", target);
950         return;
951      }
952      break;
953   default:
954      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
955                  "glTexEnvxv(target=0x%x)", target);
956      return;
957   }
958   switch(pname) {
959   case GL_COORD_REPLACE:
960      if (params[0] != GL_TRUE && params[0] != GL_FALSE) {
961         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
962                     "glTexEnvxv(pname=0x%x)", pname);
963         return;
964      }
965      convert_params_value = false;
966      n_params = 1;
967      break;
968   case GL_TEXTURE_LOD_BIAS_EXT:
969      n_params = 1;
970      break;
971   case GL_TEXTURE_ENV_MODE:
972      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) {
973         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
974                     "glTexEnvxv(pname=0x%x)", pname);
975         return;
976      }
977      convert_params_value = false;
978      n_params = 1;
979      break;
980   case GL_COMBINE_RGB:
981      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) {
982         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
983                     "glTexEnvxv(pname=0x%x)", pname);
984         return;
985      }
986      convert_params_value = false;
987      n_params = 1;
988      break;
989   case GL_COMBINE_ALPHA:
990      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) {
991         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
992                     "glTexEnvxv(pname=0x%x)", pname);
993         return;
994      }
995      convert_params_value = false;
996      n_params = 1;
997      break;
998   case GL_RGB_SCALE:
999   case GL_ALPHA_SCALE:
1000      break;
1001   case GL_SRC0_RGB:
1002   case GL_SRC1_RGB:
1003   case GL_SRC2_RGB:
1004   case GL_SRC0_ALPHA:
1005   case GL_SRC1_ALPHA:
1006   case GL_SRC2_ALPHA:
1007      convert_params_value = false;
1008      n_params = 1;
1009      break;
1010   case GL_OPERAND0_RGB:
1011   case GL_OPERAND1_RGB:
1012   case GL_OPERAND2_RGB:
1013      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) {
1014         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
1015                     "glTexEnvxv(pname=0x%x)", pname);
1016         return;
1017      }
1018      convert_params_value = false;
1019      n_params = 1;
1020      break;
1021   case GL_OPERAND0_ALPHA:
1022   case GL_OPERAND1_ALPHA:
1023   case GL_OPERAND2_ALPHA:
1024      if (params[0] != GL_SRC_ALPHA && params[0] != GL_ONE_MINUS_SRC_ALPHA) {
1025         _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
1026                     "glTexEnvxv(pname=0x%x)", pname);
1027         return;
1028      }
1029      convert_params_value = false;
1030      n_params = 1;
1031      break;
1032   case GL_TEXTURE_ENV_COLOR:
1033      n_params = 4;
1034      break;
1035   default:
1036      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
1037                  "glTexEnvxv(pname=0x%x)", pname);
1038      return;
1039   }
1040
1041   if (convert_params_value) {
1042      for (i = 0; i < n_params; i++) {
1043         converted_params[i] = (GLfloat) (params[i] / 65536.0f);
1044      }
1045   } else {
1046      for (i = 0; i < n_params; i++) {
1047         converted_params[i] = (GLfloat) params[i];
1048      }
1049   }
1050
1051   _mesa_TexEnvfv(target, pname, converted_params);
1052}
1053
1054void GL_APIENTRY
1055_check_TexGeniOES(GLenum coord, GLenum pname, GLint param)
1056{
1057   _es_TexGenf(coord, pname, (GLfloat) param);
1058}
1059
1060void GL_APIENTRY
1061_check_TexGenivOES(GLenum coord, GLenum pname, const GLint *params)
1062{
1063   _es_TexGenf(coord, pname, (GLfloat) params[0]);
1064}
1065
1066void GL_APIENTRY
1067_check_TexGenxOES(GLenum coord, GLenum pname, GLfixed param)
1068{
1069   _es_TexGenf(coord, pname, (GLfloat) param);
1070}
1071
1072void GL_APIENTRY
1073_check_TexGenxvOES(GLenum coord, GLenum pname, const GLfixed *params)
1074{
1075   _es_TexGenf(coord, pname, (GLfloat) params[0]);
1076}
1077
1078void GL_APIENTRY
1079_es_TexParameterx(GLenum target, GLenum pname, GLfixed param)
1080{
1081   if (pname == GL_TEXTURE_MAX_ANISOTROPY_EXT) {
1082      _mesa_TexParameterf(target, pname, (GLfloat) (param / 65536.0f));
1083   } else {
1084      _mesa_TexParameterf(target, pname, (GLfloat) param);
1085   }
1086}
1087
1088void GL_APIENTRY
1089_es_TexParameterxv(GLenum target, GLenum pname, const GLfixed *params)
1090{
1091   unsigned int i;
1092   unsigned int n_params = 4;
1093   GLfloat converted_params[4];
1094   bool convert_params_value = true;
1095
1096   switch(target) {
1097   case GL_TEXTURE_2D:
1098   case GL_TEXTURE_CUBE_MAP:
1099   case GL_TEXTURE_EXTERNAL_OES:
1100      break;
1101   default:
1102      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
1103                  "glTexParameterxv(target=0x%x)", target);
1104      return;
1105   }
1106   switch(pname) {
1107   case GL_TEXTURE_WRAP_S:
1108   case GL_TEXTURE_WRAP_T:
1109      convert_params_value = false;
1110      n_params = 1;
1111      break;
1112   case GL_TEXTURE_MIN_FILTER:
1113   case GL_TEXTURE_MAG_FILTER:
1114   case GL_GENERATE_MIPMAP:
1115      convert_params_value = false;
1116      n_params = 1;
1117      break;
1118   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
1119      n_params = 1;
1120      break;
1121   case GL_TEXTURE_CROP_RECT_OES:
1122      n_params = 4;
1123      break;
1124   default:
1125      _mesa_error(_mesa_get_current_context(), GL_INVALID_ENUM,
1126                  "glTexParameterxv(pname=0x%x)", pname);
1127      return;
1128   }
1129
1130   if (convert_params_value) {
1131      for (i = 0; i < n_params; i++) {
1132         converted_params[i] = (GLfloat) (params[i] / 65536.0f);
1133      }
1134   } else {
1135      for (i = 0; i < n_params; i++) {
1136         converted_params[i] = (GLfloat) params[i];
1137      }
1138   }
1139
1140   _mesa_TexParameterfv(target, pname, converted_params);
1141}
1142
1143void GL_APIENTRY
1144_es_Translatex(GLfixed x, GLfixed y, GLfixed z)
1145{
1146    _mesa_Translatef((GLfloat) (x / 65536.0f),
1147                     (GLfloat) (y / 65536.0f),
1148                     (GLfloat) (z / 65536.0f));
1149}
1150
1151#endif /* FEATURE_ES1 */
1152