hostsupport/hostopengles11/src/glesapi.cpp
branchbug235_bringup_0
changeset 53 c2ef9095503a
child 68 8d4efe9fa1cf
equal deleted inserted replaced
52:39e5f73667ba 53:c2ef9095503a
       
     1 /* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
       
     2  *
       
     3  * Permission is hereby granted, free of charge, to any person obtaining a
       
     4  * copy of this software and /or associated documentation files
       
     5  * (the "Materials "), to deal in the Materials without restriction,
       
     6  * including without limitation the rights to use, copy, modify, merge,
       
     7  * publish, distribute, sublicense, and/or sell copies of the Materials,
       
     8  * and to permit persons to whom the Materials are furnished to do so,
       
     9  * subject to the following conditions:
       
    10  *
       
    11  * The above copyright notice and this permission notice shall be included
       
    12  * in all copies or substantial portions of the Materials.
       
    13  *
       
    14  * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
       
    15  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
       
    16  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
       
    17  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
       
    18  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
       
    19  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
       
    20  * THE USE OR OTHER DEALINGS IN THE MATERIALS.
       
    21  *
       
    22  * Initial Contributors:
       
    23  * Nokia Corporation - initial contribution.
       
    24  *
       
    25  * Contributors:
       
    26  *
       
    27  * Description:
       
    28  *
       
    29  */
       
    30 
       
    31 #include <GLES/gl.h>
       
    32 #include <GLES/glplatform.h>
       
    33 #include <iostream>
       
    34 #include "GLESDesktopGL.h"
       
    35 #include "glesInternal.h"
       
    36 #include "EGLInterface.h"
       
    37 #include "GLESContext.h"
       
    38 #include "GLESArray.h"
       
    39 #include "GLESTexture.h"
       
    40 #include "glesGet.h"
       
    41 
       
    42 // exit()
       
    43 #include <stdlib.h>
       
    44 // memcpy
       
    45 #include <string.h>
       
    46 
       
    47 #ifdef __cplusplus
       
    48 extern "C" {
       
    49 #endif
       
    50 
       
    51 /* Available only in Common profile */
       
    52 GL_API void GL_APIENTRY glAlphaFunc (GLenum func, GLclampf ref)
       
    53 {
       
    54     GLES_ENTER();
       
    55     ctx->DGL().glAlphaFunc (func, ref);
       
    56     GLES_LEAVE();
       
    57 }
       
    58 GL_API void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
       
    59 {
       
    60     GLES_ENTER();
       
    61     ctx->DGL().glClearColor (red, green, blue, alpha);
       
    62     GLES_LEAVE();
       
    63 }
       
    64 GL_API void GL_APIENTRY glClearDepthf (GLclampf depth)
       
    65 {
       
    66     GLES_ENTER();
       
    67     ctx->DGL().glClearDepth (depth);
       
    68     GLES_LEAVE();
       
    69 }
       
    70 GL_API void GL_APIENTRY glClipPlanef (GLenum plane, const GLfloat *equation)
       
    71 {
       
    72     GLES_ENTER();
       
    73     GLES_ERROR_IF(plane < GL_CLIP_PLANE0 || plane >= GL_CLIP_PLANE0 + ctx->MaxClipPlanes(), GL_INVALID_ENUM);
       
    74     GLdouble dequation[4];
       
    75     for(int i = 0; i < 4; i++)
       
    76     {
       
    77         dequation[i] = static_cast<GLdouble>(equation[i]);
       
    78     }
       
    79     ctx->DGL().glClipPlane (plane, dequation);
       
    80     GLES_LEAVE();
       
    81 }
       
    82 GL_API void GL_APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
       
    83 {
       
    84     GLES_ENTER();
       
    85     ctx->DGL().glColor4f (red, green, blue, alpha);
       
    86     GLES_LEAVE();
       
    87 }
       
    88 GL_API void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar)
       
    89 {
       
    90     GLES_ENTER();
       
    91     ctx->DGL().glDepthRange(zNear, zFar);
       
    92     GLES_LEAVE();
       
    93 }
       
    94 bool isValidSingleValuedFogParamEnum(GLenum pname)
       
    95 {
       
    96     switch(pname)
       
    97     {
       
    98     case GL_FOG_MODE:
       
    99     case GL_FOG_DENSITY:
       
   100     case GL_FOG_START:
       
   101     case GL_FOG_END:
       
   102         return true;
       
   103     default:
       
   104         return false;
       
   105     }
       
   106 }
       
   107 bool isValidFogParamEnum(GLenum pname)
       
   108 {
       
   109     return isValidSingleValuedFogParamEnum(pname) || pname == GL_FOG_COLOR;
       
   110 }
       
   111 GL_API void GL_APIENTRY glFogf (GLenum pname, GLfloat param)
       
   112 {
       
   113     GLES_ENTER();
       
   114     GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM);
       
   115     ctx->DGL().glFogf (pname, param);
       
   116     GLES_LEAVE();
       
   117 }
       
   118 GL_API void GL_APIENTRY glFogfv (GLenum pname, const GLfloat *params)
       
   119 {
       
   120     GLES_ENTER();
       
   121     GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM);
       
   122     ctx->DGL().glFogfv (pname, params);
       
   123     GLES_LEAVE();
       
   124 }
       
   125 GL_API void GL_APIENTRY glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
       
   126 {
       
   127     GLES_ENTER();
       
   128     ctx->DGL().glFrustum (left, right, bottom, top, zNear, zFar);
       
   129     GLES_LEAVE();
       
   130 }
       
   131 GL_API void GL_APIENTRY glGetClipPlanef (GLenum pname, GLfloat eqn[4])
       
   132 {
       
   133     GLES_ENTER();
       
   134     GLdouble deqn[4];
       
   135     ctx->DGL().glGetClipPlane (pname, deqn);
       
   136     for(int i = 0; i < 4; i++)
       
   137     {
       
   138         eqn[i] = static_cast<GLfloat>(deqn[i]);
       
   139     }
       
   140     GLES_LEAVE();
       
   141 }
       
   142 GL_API void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *params)
       
   143 {
       
   144     GLES_ENTER();
       
   145     if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_FLOAT, params))
       
   146     {
       
   147         GLES_ERROR(GL_INVALID_ENUM);
       
   148     }
       
   149     GLES_LEAVE();
       
   150 }
       
   151 GL_API void GL_APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params)
       
   152 {
       
   153     GLES_ENTER();
       
   154     ctx->DGL().glGetLightfv (light, pname, params);
       
   155     GLES_LEAVE();
       
   156 }
       
   157 GL_API void GL_APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params)
       
   158 {
       
   159     GLES_ENTER();
       
   160     ctx->DGL().glGetMaterialfv (face, pname, params);
       
   161     GLES_LEAVE();
       
   162 }
       
   163 bool isValidTexEnvTargetEnum(GLenum target)
       
   164 {
       
   165     switch(target)
       
   166     {
       
   167     case GL_POINT_SPRITE_OES:
       
   168     case GL_TEXTURE_ENV:
       
   169         return true;
       
   170     default:
       
   171         return false;
       
   172     }
       
   173 }
       
   174 bool isValidSingleValuedTexEnvParamEnum(GLenum pname)
       
   175 {
       
   176     switch(pname)
       
   177     {
       
   178     case GL_TEXTURE_ENV_MODE:
       
   179     case GL_COORD_REPLACE_OES:
       
   180     case GL_COMBINE_RGB:
       
   181     case GL_COMBINE_ALPHA:
       
   182     case GL_SRC0_RGB:
       
   183     case GL_SRC1_RGB:
       
   184     case GL_SRC2_RGB:
       
   185     case GL_SRC0_ALPHA:
       
   186     case GL_SRC1_ALPHA:
       
   187     case GL_SRC2_ALPHA:
       
   188     case GL_OPERAND0_RGB:
       
   189     case GL_OPERAND1_RGB:
       
   190     case GL_OPERAND2_RGB:
       
   191     case GL_OPERAND0_ALPHA:
       
   192     case GL_OPERAND1_ALPHA:
       
   193     case GL_OPERAND2_ALPHA:
       
   194     case GL_RGB_SCALE:
       
   195     case GL_ALPHA_SCALE:
       
   196         return true;
       
   197     default:
       
   198         return false;
       
   199     }
       
   200 }
       
   201 bool isValidTexEnvParamEnum(GLenum pname)
       
   202 {
       
   203     return isValidSingleValuedTexEnvParamEnum(pname) || pname == GL_TEXTURE_ENV_COLOR;
       
   204 }
       
   205 GL_API void GL_APIENTRY glGetTexEnvfv (GLenum env, GLenum pname, GLfloat *params)
       
   206 {
       
   207     GLES_ENTER();
       
   208     GLES_ERROR_IF(!isValidTexEnvTargetEnum(env), GL_INVALID_ENUM);
       
   209     GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
       
   210     env = env == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : env;
       
   211     pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
       
   212     ctx->DGL().glGetTexEnvfv (env, pname, params);
       
   213     GLES_LEAVE();
       
   214 }
       
   215 bool isValidTexParamEnum(GLenum pname)
       
   216 {
       
   217     switch(pname)
       
   218     {
       
   219     case GL_TEXTURE_MIN_FILTER:
       
   220     case GL_TEXTURE_MAG_FILTER:
       
   221     case GL_TEXTURE_WRAP_S:
       
   222     case GL_TEXTURE_WRAP_T:
       
   223     case GL_GENERATE_MIPMAP:
       
   224         return true;
       
   225     default:
       
   226         return false;
       
   227     }
       
   228 }
       
   229 GL_API void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params)
       
   230 {
       
   231     GLES_ENTER();
       
   232     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
   233     ctx->DGL().glGetTexParameterfv (target, pname, params);
       
   234     GLES_LEAVE();
       
   235 }
       
   236 bool isValidLightModelParamEnum(GLenum pname)
       
   237 {
       
   238     switch(pname)
       
   239     {
       
   240     case GL_LIGHT_MODEL_AMBIENT:
       
   241     case GL_LIGHT_MODEL_TWO_SIDE:
       
   242         return true;
       
   243     default:
       
   244         return false;
       
   245     }
       
   246 }
       
   247 GL_API void GL_APIENTRY glLightModelf (GLenum pname, GLfloat param)
       
   248 {
       
   249     GLES_ENTER();
       
   250     GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM);
       
   251     ctx->DGL().glLightModelf (pname, param);
       
   252     GLES_LEAVE();
       
   253 }
       
   254 GL_API void GL_APIENTRY glLightModelfv (GLenum pname, const GLfloat *params)
       
   255 {
       
   256     GLES_ENTER();
       
   257     GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM);
       
   258     ctx->DGL().glLightModelfv (pname, params);
       
   259     GLES_LEAVE();
       
   260 }
       
   261 GL_API void GL_APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param)
       
   262 {
       
   263     GLES_ENTER();
       
   264     ctx->DGL().glLightf (light, pname, param);
       
   265     GLES_LEAVE();
       
   266 }
       
   267 GL_API void GL_APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params)
       
   268 {
       
   269     GLES_ENTER();
       
   270     ctx->DGL().glLightfv (light, pname, params);
       
   271     GLES_LEAVE();
       
   272 }
       
   273 GL_API void GL_APIENTRY glLineWidth (GLfloat width)
       
   274 {
       
   275     GLES_ENTER();
       
   276     ctx->DGL().glLineWidth (width);
       
   277     GLES_LEAVE();
       
   278 }
       
   279 GL_API void GL_APIENTRY glLoadMatrixf (const GLfloat *m)
       
   280 {
       
   281     GLES_ENTER();
       
   282     ctx->DGL().glLoadMatrixf (m);
       
   283     GLES_LEAVE();
       
   284 }
       
   285 GL_API void GL_APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param)
       
   286 {
       
   287     GLES_ENTER();
       
   288     ctx->DGL().glMaterialf (face, pname, param);
       
   289     GLES_LEAVE();
       
   290 }
       
   291 bool isValidSingleValuedMaterialParamEnum(GLenum pname)
       
   292 {
       
   293     return pname == GL_SHININESS;
       
   294 }
       
   295 bool isValidMaterialParamEnum(GLenum pname)
       
   296 {
       
   297     if(isValidSingleValuedMaterialParamEnum(pname))
       
   298     {
       
   299         return true;
       
   300     }
       
   301     else
       
   302     {
       
   303         switch(pname)
       
   304         {
       
   305         case GL_AMBIENT:
       
   306         case GL_DIFFUSE:
       
   307         case GL_AMBIENT_AND_DIFFUSE:
       
   308         case GL_SPECULAR:
       
   309         case GL_EMISSION:
       
   310         case GL_SHININESS:
       
   311             return true;
       
   312         default:
       
   313             return false;
       
   314         }
       
   315     }
       
   316 }
       
   317 GL_API void GL_APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params)
       
   318 {
       
   319     GLES_ENTER();
       
   320     GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM);
       
   321     ctx->DGL().glMaterialfv (face, pname, params);
       
   322     GLES_LEAVE();
       
   323 }
       
   324 GL_API void GL_APIENTRY glMultMatrixf (const GLfloat *m)
       
   325 {
       
   326     GLES_ENTER();
       
   327     ctx->DGL().glMultMatrixf(m);
       
   328     GLES_LEAVE();
       
   329 }
       
   330 bool isValidTextureTargetEnum(GLenum target, unsigned int maxTextureUnits)
       
   331 {
       
   332     return target >= GL_TEXTURE0 && target < GL_TEXTURE0 + maxTextureUnits;
       
   333 }
       
   334 GL_API void GL_APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
       
   335 {
       
   336     GLES_ENTER();
       
   337     GLES_ERROR_IF(!isValidTextureTargetEnum(target, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
       
   338     ctx->DGL().glMultiTexCoord4f(target, s, t, r, q);
       
   339     GLES_LEAVE();
       
   340 }
       
   341 GL_API void GL_APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz)
       
   342 {
       
   343     GLES_ENTER();
       
   344     ctx->DGL().glNormal3f(nx, ny, nz);
       
   345     GLES_LEAVE();
       
   346 }
       
   347 GL_API void GL_APIENTRY glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
       
   348 {
       
   349     GLES_ENTER();
       
   350     ctx->DGL().glOrtho(left, right, bottom, top, zNear, zFar);
       
   351     GLES_LEAVE();
       
   352 }
       
   353 GL_API void GL_APIENTRY glPointParameterf (GLenum pname, GLfloat param)
       
   354 {
       
   355     GLES_ENTER();
       
   356     ctx->DGL().glPointParameterf (pname, param);
       
   357     GLES_LEAVE();
       
   358 }
       
   359 GL_API void GL_APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params)
       
   360 {
       
   361     GLES_ENTER();
       
   362     ctx->DGL().glPointParameterfv (pname, params);
       
   363     GLES_LEAVE();
       
   364 }
       
   365 GL_API void GL_APIENTRY glPointSize (GLfloat size)
       
   366 {
       
   367     GLES_ENTER();
       
   368     ctx->DGL().glPointSize (size);
       
   369     GLES_LEAVE();
       
   370 }
       
   371 GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units)
       
   372 {
       
   373     GLES_ENTER();
       
   374     ctx->DGL().glPolygonOffset (factor, units);
       
   375     GLES_LEAVE();
       
   376 }
       
   377 GL_API void GL_APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
       
   378 {
       
   379     GLES_ENTER();
       
   380     ctx->DGL().glRotatef (angle, x, y, z);
       
   381     GLES_LEAVE();
       
   382 }
       
   383 GL_API void GL_APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z)
       
   384 {
       
   385     GLES_ENTER();
       
   386     ctx->DGL().glScalef (x, y, z);
       
   387     GLES_LEAVE();
       
   388 }
       
   389 GL_API void GL_APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param)
       
   390 {
       
   391     GLES_ENTER();
       
   392     GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
       
   393     GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
       
   394     target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target;
       
   395     pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
       
   396     ctx->DGL().glTexEnvf (target, pname, param);
       
   397     GLES_LEAVE();
       
   398 }
       
   399 GL_API void GL_APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params)
       
   400 {
       
   401     GLES_ENTER();
       
   402     GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
       
   403     GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
       
   404     target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target;
       
   405     pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
       
   406     ctx->DGL().glTexEnvfv (target, pname, params);
       
   407     GLES_LEAVE();
       
   408 }
       
   409 GL_API void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param)
       
   410 {
       
   411     GLES_ENTER();
       
   412     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
   413     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
   414     pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
       
   415     ctx->DGL().glTexParameterf (target, pname, param);
       
   416     GLES_LEAVE();
       
   417 }
       
   418 GL_API void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params)
       
   419 {
       
   420     GLES_ENTER();
       
   421     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
   422     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
   423     target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target;
       
   424     pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
       
   425     ctx->DGL().glTexParameterfv (target, pname, params);
       
   426     GLES_LEAVE();
       
   427 }
       
   428 GL_API void GL_APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z)
       
   429 {
       
   430     GLES_ENTER();
       
   431     ctx->DGL().glTranslatef (x, y, z);
       
   432     GLES_LEAVE();
       
   433 }
       
   434 
       
   435 /* Available in both Common and Common-Lite profiles */
       
   436 GL_API void GL_APIENTRY glActiveTexture (GLenum texture)
       
   437 {
       
   438     GLES_ENTER();
       
   439     GLES_ERROR_IF(!isValidTextureTargetEnum(texture, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
       
   440     ctx->DGL().glActiveTexture (texture);
       
   441     GLES_LEAVE();
       
   442 }
       
   443 GL_API void GL_APIENTRY glAlphaFuncx (GLenum func, GLclampx ref)
       
   444 {
       
   445     GLES_ENTER();
       
   446     ctx->DGL().glAlphaFunc(func, X_TO_F(ref));
       
   447     GLES_LEAVE();
       
   448 }
       
   449 bool isValidBufferTarget(GLenum target)
       
   450 {
       
   451     switch(target)
       
   452     {
       
   453     case GL_ARRAY_BUFFER:
       
   454     case GL_ELEMENT_ARRAY_BUFFER:
       
   455         return true;
       
   456     default:
       
   457         return false;
       
   458     }
       
   459 }
       
   460 GL_API void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer)
       
   461 {
       
   462     GLES_ENTER();
       
   463     GLES_ERROR_IF(!isValidBufferTarget(target), GL_INVALID_ENUM);
       
   464     switch(target)
       
   465     {
       
   466     case GL_ARRAY_BUFFER:
       
   467         if(!ctx->BindArrayBuffer(buffer))
       
   468         {
       
   469             GLES_ERROR(GL_OUT_OF_MEMORY);
       
   470         }
       
   471         break;
       
   472     case GL_ELEMENT_ARRAY_BUFFER:
       
   473         if(!ctx->BindElementArrayBuffer(buffer))
       
   474         {
       
   475             GLES_ERROR(GL_OUT_OF_MEMORY);
       
   476         }
       
   477         break;
       
   478     default:
       
   479         GLES_ERROR(GL_INVALID_ENUM);
       
   480     }
       
   481     GLES_LEAVE();
       
   482 }
       
   483 GL_API void GL_APIENTRY glBindTexture (GLenum target, GLuint texture)
       
   484 {
       
   485     GLES_ENTER();
       
   486     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
   487     ctx->GetHostError();
       
   488     ctx->DGL().glBindTexture (target, texture);
       
   489     if(ctx->GetHostError() == GL_NO_ERROR)
       
   490     {
       
   491         ctx->BindTexture(texture);
       
   492     }
       
   493     GLES_LEAVE();
       
   494 }
       
   495 bool isValidSrcBlendFuncEnum(GLenum func)
       
   496 {
       
   497     switch(func)
       
   498     {
       
   499     case GL_ZERO:
       
   500     case GL_ONE:
       
   501     case GL_DST_COLOR:
       
   502     case GL_ONE_MINUS_DST_COLOR:
       
   503     case GL_SRC_ALPHA:
       
   504     case GL_ONE_MINUS_SRC_ALPHA:
       
   505     case GL_DST_ALPHA:
       
   506     case GL_ONE_MINUS_DST_ALPHA:
       
   507     case GL_SRC_ALPHA_SATURATE:
       
   508         return true;
       
   509     default:
       
   510         return false;
       
   511     }
       
   512 }
       
   513 bool isValidDstBlendFuncEnum(GLenum func)
       
   514 {
       
   515     switch(func)
       
   516     {
       
   517     case GL_ZERO:
       
   518     case GL_ONE:
       
   519     case GL_SRC_COLOR:
       
   520     case GL_ONE_MINUS_SRC_COLOR:
       
   521     case GL_SRC_ALPHA:
       
   522     case GL_ONE_MINUS_SRC_ALPHA:
       
   523     case GL_DST_ALPHA:
       
   524     case GL_ONE_MINUS_DST_ALPHA:
       
   525         return true;
       
   526     default:
       
   527         return false;
       
   528     }
       
   529 }
       
   530 GL_API void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor)
       
   531 {
       
   532     GLES_ENTER();
       
   533     GLES_ERROR_IF(!isValidSrcBlendFuncEnum(sfactor), GL_INVALID_ENUM);
       
   534     GLES_ERROR_IF(!isValidDstBlendFuncEnum(dfactor), GL_INVALID_ENUM);
       
   535     ctx->DGL().glBlendFunc (sfactor, dfactor);
       
   536     GLES_LEAVE();
       
   537 }
       
   538 GL_API void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
       
   539 {
       
   540     GLES_ENTER();
       
   541     GLES_ERROR_IF(size < 0, GL_INVALID_VALUE);
       
   542     GLES_ERROR_IF(usage != GL_STATIC_DRAW && usage != GL_DYNAMIC_DRAW, GL_INVALID_ENUM);
       
   543 
       
   544     GLESBuffer* buffer;
       
   545     switch(target)
       
   546     {
       
   547     case GL_ARRAY_BUFFER:
       
   548         GLES_ERROR_IF(ctx->ArrayBufferBinding() == 0, GL_INVALID_OPERATION);
       
   549         buffer = ctx->ArrayBuffer();
       
   550         break;
       
   551     case GL_ELEMENT_ARRAY_BUFFER:
       
   552         GLES_ERROR_IF(ctx->ElementArrayBufferBinding() == 0, GL_INVALID_OPERATION);
       
   553         buffer = ctx->ElementArrayBuffer();
       
   554         break;
       
   555     default:
       
   556         GLES_ERROR(GL_INVALID_ENUM);
       
   557     }
       
   558     GLES_ASSERT(buffer);
       
   559 
       
   560     delete[] buffer->data;
       
   561     buffer->data = GLES_NEW char[size];
       
   562     if(buffer->data == NULL)
       
   563     {
       
   564         GLES_ERROR(GL_OUT_OF_MEMORY);
       
   565     }
       
   566 
       
   567     if(data != NULL)
       
   568     {
       
   569         memcpy(buffer->data, data, size);
       
   570     }
       
   571 
       
   572     buffer->size = size;
       
   573     buffer->usage = usage;
       
   574 
       
   575     GLES_LEAVE();
       
   576 }
       
   577 GL_API void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
       
   578 {
       
   579     GLES_ENTER();
       
   580     GLES_ERROR_IF(offset < 0, GL_INVALID_VALUE);
       
   581     GLES_ERROR_IF(size < 0, GL_INVALID_VALUE);
       
   582 
       
   583     GLESBuffer* buffer;
       
   584     switch(target)
       
   585     {
       
   586     case GL_ARRAY_BUFFER:
       
   587         GLES_ERROR_IF(ctx->ArrayBufferBinding() == 0, GL_INVALID_OPERATION);
       
   588         buffer = ctx->ArrayBuffer();
       
   589         break;
       
   590     case GL_ELEMENT_ARRAY_BUFFER:
       
   591         GLES_ERROR_IF(ctx->ElementArrayBufferBinding() == 0, GL_INVALID_OPERATION);
       
   592         buffer = ctx->ElementArrayBuffer();
       
   593         break;
       
   594     default:
       
   595         GLES_ERROR(GL_INVALID_ENUM);
       
   596     }
       
   597     GLES_ASSERT(buffer);
       
   598 
       
   599     GLES_ERROR_IF(size + offset > buffer->size, GL_INVALID_VALUE);
       
   600     memcpy(static_cast<char*>(buffer->data) + offset, data, size);
       
   601 
       
   602     GLES_LEAVE();
       
   603 }
       
   604 GL_API void GL_APIENTRY glClear (GLbitfield mask)
       
   605 {
       
   606 	GLES_ENTER();
       
   607 	GLES_LOCK_DRAW_SURFACE();
       
   608 	ctx->DGL().glClear (mask);
       
   609 	GLES_UNLOCK_SURFACE();
       
   610     GLES_LEAVE();
       
   611 }
       
   612 GL_API void GL_APIENTRY glClearColorx (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
       
   613 {
       
   614     GLES_ENTER();
       
   615     ctx->DGL().glClearColor (X_TO_F(red), X_TO_F(green), X_TO_F(blue), X_TO_F(alpha));
       
   616     GLES_LEAVE();
       
   617 }
       
   618 GL_API void GL_APIENTRY glClearDepthx (GLclampx depth)
       
   619 {
       
   620     GLES_ENTER();
       
   621     ctx->DGL().glClearDepth (X_TO_D(depth));
       
   622     GLES_LEAVE();
       
   623 }
       
   624 GL_API void GL_APIENTRY glClearStencil (GLint s)
       
   625 {
       
   626     GLES_ENTER();
       
   627     ctx->DGL().glClearStencil (s);
       
   628     GLES_LEAVE();
       
   629 }
       
   630 GL_API void GL_APIENTRY glClientActiveTexture (GLenum texture)
       
   631 {
       
   632     GLES_ENTER();
       
   633     GLES_ERROR_IF(!isValidTextureTargetEnum(texture, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
       
   634     ctx->GetHostError();
       
   635     ctx->DGL().glClientActiveTexture (texture);
       
   636     if(ctx->GetHostError() == GL_NO_ERROR)
       
   637     {
       
   638         ctx->SetClientActiveTexture(texture - GL_TEXTURE0);
       
   639     }
       
   640     GLES_LEAVE_NO_ERROR_CHECK();
       
   641 }
       
   642 GL_API void GL_APIENTRY glClipPlanex (GLenum plane, const GLfixed *equation)
       
   643 {
       
   644     GLES_ENTER();
       
   645     GLdouble dequation[4];
       
   646     for(int i = 0; i < 4; i++)
       
   647     {
       
   648         dequation[i] = X_TO_D(equation[i]);
       
   649     }
       
   650     ctx->DGL().glClipPlane (plane, dequation);
       
   651     GLES_LEAVE();
       
   652 }
       
   653 GL_API void GL_APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
       
   654 {
       
   655     GLES_ENTER();
       
   656     ctx->DGL().glColor4ub (red, green, blue, alpha);
       
   657     GLES_LEAVE();
       
   658 }
       
   659 GL_API void GL_APIENTRY glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
       
   660 {
       
   661     GLES_ENTER();
       
   662     ctx->DGL().glColor4d(X_TO_D(red), X_TO_D(green), X_TO_D(blue), X_TO_D(alpha));
       
   663     GLES_LEAVE();
       
   664 }
       
   665 GL_API void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
       
   666 {
       
   667     GLES_ENTER();
       
   668     ctx->DGL().glColorMask (red, green, blue, alpha);
       
   669     GLES_LEAVE();
       
   670 }
       
   671 GL_API void GL_APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
       
   672 {
       
   673     GLES_ENTER();
       
   674     GLES_ERROR_IF(size != 4, GL_INVALID_VALUE);
       
   675     GLES_ERROR_IF(type != GL_UNSIGNED_BYTE && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
       
   676     GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
       
   677     ctx->SetColorArray(size, type, stride, pointer);
       
   678     GLES_LEAVE();
       
   679 }
       
   680 GL_API void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
       
   681 {
       
   682 	GLES_ENTER();
       
   683 	GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
   684 	GLES_ERROR_IF(level > 0, GL_INVALID_VALUE);
       
   685 	GLES_ERROR_IF(!glesIsValidCompressedFormat(internalformat), GL_INVALID_ENUM);
       
   686 	GLES_ERROR_IF(height < 0, GL_INVALID_VALUE);
       
   687 	GLES_ERROR_IF(width < 0, GL_INVALID_VALUE);
       
   688 	GLES_ERROR_IF(height > 0 && !glesIsPowerOfTwo(height), GL_INVALID_VALUE);
       
   689 	GLES_ERROR_IF(width > 0 && !glesIsPowerOfTwo(width), GL_INVALID_VALUE);
       
   690 	GLES_ERROR_IF(imageSize < 0, GL_INVALID_VALUE);
       
   691 
       
   692 	GLenum baseFormat = glesMapCompressedToBaseFormat(internalformat);
       
   693 
       
   694 	int numLevels = -level + 1;
       
   695 	for(int curLevel = 0; curLevel < numLevels; curLevel++)
       
   696 	{
       
   697 		if(data != NULL)
       
   698 		{
       
   699 			void* uncompressedData = glesUncompressImage(curLevel, internalformat, width, height, imageSize, data);
       
   700 			if(uncompressedData == NULL)
       
   701 			{
       
   702 				GLES_ERROR(GL_OUT_OF_MEMORY);
       
   703 			}
       
   704 			ctx->DGL().glTexImage2D(target, curLevel, baseFormat, width, height, border, baseFormat, GL_UNSIGNED_BYTE, uncompressedData);
       
   705 			delete uncompressedData;
       
   706 		}
       
   707 		else
       
   708 		{
       
   709 			ctx->DGL().glTexImage2D(target, curLevel, baseFormat, width, height, border, baseFormat, GL_UNSIGNED_BYTE, NULL);
       
   710 		}
       
   711 
       
   712 		if(ctx->GetHostError() == GL_NO_ERROR)
       
   713 		{
       
   714 			GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
       
   715 			GLES_ASSERT(texture != NULL);
       
   716 			texture->SetLevel(level, internalformat, width, height);
       
   717 
       
   718 			if(texture->Level(level)->boundSurface != NULL)
       
   719 			{
       
   720 				// Texture is respecified. Release the bound EGLSurface.
       
   721 				glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level);
       
   722 				texture->Level(level)->boundSurface = NULL;
       
   723 			}
       
   724 		}
       
   725 
       
   726 		width /= 2;
       
   727 		height /= 2;
       
   728 	}
       
   729 	
       
   730 	GLES_LEAVE();
       
   731 }
       
   732 static bool isPalettedFormat(GLenum format)
       
   733 {
       
   734     switch(format)
       
   735     {
       
   736     case GL_PALETTE4_RGB8_OES:
       
   737     case GL_PALETTE4_RGBA8_OES:
       
   738     case GL_PALETTE4_R5_G6_B5_OES:
       
   739     case GL_PALETTE4_RGBA4_OES:
       
   740     case GL_PALETTE4_RGB5_A1_OES:
       
   741     case GL_PALETTE8_RGB8_OES:
       
   742     case GL_PALETTE8_RGBA8_OES:
       
   743     case GL_PALETTE8_R5_G6_B5_OES:
       
   744     case GL_PALETTE8_RGBA4_OES:
       
   745     case GL_PALETTE8_RGB5_A1_OES:
       
   746         return true;
       
   747     default:
       
   748         return false;
       
   749     }
       
   750 }
       
   751 GL_API void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data)
       
   752 {
       
   753     GLES_ENTER();
       
   754     GLES_ERROR_IF(!isPalettedFormat(format), GL_INVALID_ENUM);
       
   755     // Not supported for compressed paletted textures.
       
   756     GLES_ERROR(GL_INVALID_OPERATION);
       
   757     GLES_LEAVE();
       
   758 }
       
   759 bool isValidPixelFormatEnum(GLenum format)
       
   760 {
       
   761     switch(format)
       
   762     {
       
   763     case GL_ALPHA:
       
   764     case GL_LUMINANCE:
       
   765     case GL_LUMINANCE_ALPHA:
       
   766     case GL_RGB:
       
   767     case GL_RGBA:
       
   768         return true;
       
   769     default:
       
   770         return false;
       
   771     }
       
   772 }
       
   773 GL_API void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
       
   774 {
       
   775 	GLES_ENTER();
       
   776 	GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
   777 	GLES_ERROR_IF(!isValidPixelFormatEnum(internalformat), GL_INVALID_ENUM);
       
   778 	
       
   779 	GLES_LOCK_READ_SURFACE();
       
   780 	ctx->DGL().glCopyTexImage2D (target, level, internalformat, x, y, width, height, border);
       
   781 	GLES_UNLOCK_SURFACE();
       
   782 
       
   783 	if(ctx->GetHostError() == GL_NO_ERROR)
       
   784 	{
       
   785 		GLint genMipmap;
       
   786 		ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
       
   787 		GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
       
   788 		GLES_ASSERT(texture != NULL);
       
   789 		if(level == 0 && genMipmap)
       
   790 		{
       
   791 			texture->GenerateMipmap();
       
   792 		}
       
   793 
       
   794 		if(texture->Level(level)->boundSurface != NULL)
       
   795 		{
       
   796 			// Texture is respecified. Release the bound EGLSurface.
       
   797 			glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level);
       
   798 			texture->Level(level)->boundSurface = NULL;
       
   799 		}
       
   800 	}
       
   801 
       
   802 	GLES_LEAVE();
       
   803 }
       
   804 GL_API void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
       
   805 {
       
   806 	GLES_ENTER();
       
   807 	GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
   808 
       
   809 	GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
       
   810 	GLES_ASSERT(texture != NULL);
       
   811 	const GLESTextureLevel* level_obj = texture->Level(level);
       
   812 	if(isPalettedFormat(level_obj->format))
       
   813 	{
       
   814 		GLES_ERROR(GL_INVALID_OPERATION);
       
   815 	}
       
   816 
       
   817 	GLES_LOCK_READ_SURFACE();
       
   818 	ctx->DGL().glCopyTexSubImage2D (target, level, xoffset, yoffset, x, y, width, height);
       
   819 	GLES_UNLOCK_SURFACE();
       
   820 
       
   821 	if(ctx->GetHostError() == GL_NO_ERROR)
       
   822 	{
       
   823 		GLint genMipmap;
       
   824 		ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
       
   825 		if(level == 0 && genMipmap)
       
   826 		{
       
   827 			GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
       
   828 			GLES_ASSERT(texture != NULL);
       
   829 			texture->GenerateMipmap();
       
   830 		}
       
   831 	}
       
   832 
       
   833 	GLES_LEAVE();
       
   834 }
       
   835 GL_API void GL_APIENTRY glCullFace (GLenum mode)
       
   836 {
       
   837     GLES_ENTER();
       
   838     ctx->DGL().glCullFace (mode);
       
   839     GLES_LEAVE();
       
   840 }
       
   841 GL_API void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers)
       
   842 {
       
   843     GLES_ENTER();
       
   844     GLES_ERROR_IF(n < 0, GL_INVALID_VALUE);
       
   845     for(int i = 0; i < n; i++)
       
   846     {
       
   847         ctx->DeleteBuffer(buffers[i]);
       
   848     }
       
   849     GLES_LEAVE();
       
   850 }
       
   851 GL_API void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures)
       
   852 {
       
   853     GLES_ENTER();
       
   854     GLES_ERROR_IF(n < 0, GL_INVALID_VALUE);
       
   855     ctx->GetHostError();
       
   856     ctx->DGL().glDeleteTextures (n, textures);
       
   857     if(ctx->GetHostError() == GL_NO_ERROR)
       
   858     {
       
   859         for(int i = 0; i < n; i++)
       
   860         {
       
   861             ctx->DeleteTexture(textures[i]);
       
   862         }
       
   863     }
       
   864     GLES_LEAVE();
       
   865 }
       
   866 GL_API void GL_APIENTRY glDepthFunc (GLenum func)
       
   867 {
       
   868     GLES_ENTER();
       
   869     ctx->DGL().glDepthFunc (func);
       
   870     GLES_LEAVE();
       
   871 }
       
   872 GL_API void GL_APIENTRY glDepthMask (GLboolean flag)
       
   873 {
       
   874     GLES_ENTER();
       
   875     ctx->DGL().glDepthMask (flag);
       
   876     GLES_LEAVE();
       
   877 }
       
   878 GL_API void GL_APIENTRY glDepthRangex (GLclampx zNear, GLclampx zFar)
       
   879 {
       
   880     GLES_ENTER();
       
   881     ctx->DGL().glDepthRange(X_TO_D(zNear), X_TO_D(zFar));
       
   882     GLES_LEAVE();
       
   883 }
       
   884 bool isValidCapabilityEnum(GLenum cap)
       
   885 {
       
   886     switch(cap)
       
   887     {
       
   888     case GL_NORMALIZE:
       
   889     case GL_RESCALE_NORMAL:
       
   890     case GL_CLIP_PLANE0:
       
   891     case GL_CLIP_PLANE1:
       
   892     case GL_CLIP_PLANE2:
       
   893     case GL_CLIP_PLANE3:
       
   894     case GL_CLIP_PLANE4:
       
   895     case GL_CLIP_PLANE5:
       
   896     case GL_FOG:
       
   897     case GL_LIGHTING:
       
   898     case GL_COLOR_MATERIAL:
       
   899     case GL_LIGHT0:
       
   900     case GL_LIGHT1:
       
   901     case GL_LIGHT2:
       
   902     case GL_LIGHT3:
       
   903     case GL_LIGHT4:
       
   904     case GL_LIGHT5:
       
   905     case GL_LIGHT6:
       
   906     case GL_LIGHT7:
       
   907     case GL_POINT_SMOOTH:
       
   908     case GL_POINT_SPRITE_OES:
       
   909     case GL_LINE_SMOOTH:
       
   910     case GL_CULL_FACE:
       
   911     case GL_POLYGON_OFFSET_FILL:
       
   912     case GL_MULTISAMPLE:
       
   913     case GL_SAMPLE_ALPHA_TO_COVERAGE:
       
   914     case GL_SAMPLE_ALPHA_TO_ONE:
       
   915     case GL_SAMPLE_COVERAGE:
       
   916     case GL_TEXTURE_2D:
       
   917     case GL_SCISSOR_TEST:
       
   918     case GL_ALPHA_TEST:
       
   919     case GL_STENCIL_TEST:
       
   920     case GL_DEPTH_TEST:
       
   921     case GL_BLEND:
       
   922     case GL_DITHER:
       
   923     case GL_COLOR_LOGIC_OP:
       
   924         return true;
       
   925     default:
       
   926         return false;
       
   927     }
       
   928 }
       
   929 GL_API void GL_APIENTRY glDisable (GLenum cap)
       
   930 {
       
   931     GLES_ENTER();
       
   932     GLES_ERROR_IF(!isValidCapabilityEnum(cap), GL_INVALID_ENUM);
       
   933     cap = cap == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : cap;
       
   934     ctx->DGL().glDisable (cap);
       
   935     GLES_LEAVE();
       
   936 }
       
   937 static GLESArrayFlag mapArrayType(GLenum type)
       
   938 {
       
   939     switch(type)
       
   940     {
       
   941     case GL_VERTEX_ARRAY:
       
   942         return GLES_VERTEX_ARRAY;
       
   943     case GL_NORMAL_ARRAY:
       
   944         return GLES_NORMAL_ARRAY;
       
   945     case GL_COLOR_ARRAY:
       
   946         return GLES_COLOR_ARRAY;
       
   947     case GL_POINT_SIZE_ARRAY_OES:
       
   948         return GLES_POINT_SIZE_ARRAY;
       
   949     case GL_TEXTURE_COORD_ARRAY:
       
   950         return GLES_TEXTURE_COORD_ARRAY;
       
   951     default:
       
   952         return GLES_INVALID_ARRAY;
       
   953     }
       
   954 }
       
   955 GL_API void GL_APIENTRY glDisableClientState (GLenum array)
       
   956 {
       
   957     GLES_ENTER();
       
   958     int flag = static_cast<int>(mapArrayType(array));
       
   959     GLES_ERROR_IF(flag == GLES_INVALID_ARRAY, GL_INVALID_ENUM);
       
   960     if(flag == GLES_TEXTURE_COORD_ARRAY)
       
   961     {
       
   962         flag <<= ctx->ClientActiveTexture();
       
   963     }
       
   964     ctx->DisableArray(static_cast<GLESArrayFlag>(flag));
       
   965     if(array != GL_POINT_SIZE_ARRAY_OES)
       
   966     {
       
   967         ctx->DGL().glDisableClientState(array);
       
   968     }
       
   969     GLES_LEAVE();
       
   970 }
       
   971 static bool convertArrays(const GLESContext& ctx, GLsizei count, GLESArray** vertexArr, GLESArray** normalArr,
       
   972                           GLESArray** colorArr, GLESArray** texCoordArr)
       
   973 {
       
   974     *vertexArr = ctx.VertexArray().Convert(count);
       
   975     if(*vertexArr == NULL)
       
   976     {
       
   977         return false;
       
   978     }
       
   979     ctx.DGL().glVertexPointer((*vertexArr)->Size(), (*vertexArr)->Type(), (*vertexArr)->Stride(), (*vertexArr)->Pointer());
       
   980 
       
   981     if(ctx.IsArrayEnabled(GLES_NORMAL_ARRAY))
       
   982     {
       
   983         *normalArr = ctx.NormalArray().Convert(count);
       
   984         if(*normalArr == NULL)
       
   985         {
       
   986             return false;
       
   987         }
       
   988         ctx.DGL().glNormalPointer((*normalArr)->Type(), (*normalArr)->Stride(), (*normalArr)->Pointer());
       
   989     }
       
   990 
       
   991     if(ctx.IsArrayEnabled(GLES_COLOR_ARRAY))
       
   992     {
       
   993         *colorArr = ctx.ColorArray().Convert(count);
       
   994         if(*colorArr == NULL)
       
   995         {
       
   996             return false;
       
   997         }
       
   998         ctx.DGL().glColorPointer((*colorArr)->Size(), (*colorArr)->Type(), (*colorArr)->Stride(), (*colorArr)->Pointer());
       
   999     }
       
  1000 
       
  1001     for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++)
       
  1002     {
       
  1003         if(ctx.IsArrayEnabled(static_cast<GLESArrayFlag>(GLES_TEXTURE_COORD_ARRAY << i)))
       
  1004         {
       
  1005             texCoordArr[i] = ctx.TexCoordArray(i).Convert(count);
       
  1006             if(texCoordArr[i] == NULL)
       
  1007             {
       
  1008                 return false;
       
  1009             }
       
  1010             ctx.DGL().glClientActiveTexture(GL_TEXTURE0 + i);
       
  1011             ctx.DGL().glTexCoordPointer(texCoordArr[i]->Size(), texCoordArr[i]->Type(),
       
  1012                                     texCoordArr[i]->Stride(), texCoordArr[i]->Pointer());
       
  1013         }
       
  1014     }
       
  1015 
       
  1016     // Reset state
       
  1017     ctx.DGL().glClientActiveTexture(GL_TEXTURE0 + ctx.ClientActiveTexture());
       
  1018 
       
  1019     return true;
       
  1020 }
       
  1021 void drawPoint(const GLESContext& ctx, int i, GLESArrayPointer& vertexPtr, GLESArrayPointer& normalPtr,
       
  1022                GLESArrayPointer& colorPtr, GLESArrayPointer& pointSizePtr,
       
  1023                GLESArrayPointer* texCoordPtr)
       
  1024 {
       
  1025     if(normalPtr != NULL)
       
  1026     {
       
  1027         switch(normalPtr.Type())
       
  1028         {
       
  1029         case GL_BYTE:
       
  1030         case GL_SHORT:
       
  1031             ctx.DGL().glNormal3sv(static_cast<const GLshort*>(normalPtr[i]));
       
  1032             break;
       
  1033         case GL_FIXED:
       
  1034         case GL_FLOAT:
       
  1035             ctx.DGL().glNormal3fv(static_cast<const GLfloat*>(normalPtr[i]));
       
  1036             break;
       
  1037         default:
       
  1038             GLES_ASSERT(false);
       
  1039         }
       
  1040     }
       
  1041 
       
  1042     if(colorPtr != NULL)
       
  1043     {
       
  1044         switch(colorPtr.Type())
       
  1045         {
       
  1046         case GL_UNSIGNED_BYTE:
       
  1047             ctx.DGL().glColor4ubv(static_cast<const GLubyte*>(colorPtr[i]));
       
  1048             break;
       
  1049         case GL_FIXED:
       
  1050         case GL_FLOAT:
       
  1051             ctx.DGL().glColor4fv(static_cast<const GLfloat*>(colorPtr[i]));
       
  1052             break;
       
  1053         default:
       
  1054             GLES_ASSERT(false);
       
  1055         }
       
  1056     }
       
  1057 
       
  1058     GLES_ASSERT(pointSizePtr != NULL);
       
  1059     ctx.DGL().glPointSize(*static_cast<const GLfloat*>(pointSizePtr[i]));
       
  1060 
       
  1061     for(unsigned int j = 0; j < ctx.MaxTextureUnits(); j++)
       
  1062     {
       
  1063         int texture = GL_TEXTURE0 + j;
       
  1064 		
       
  1065         if(texCoordPtr[j] != NULL)
       
  1066         {
       
  1067             switch(texCoordPtr[j].Type())
       
  1068             {
       
  1069             case GL_BYTE:
       
  1070             case GL_SHORT:
       
  1071                 switch(texCoordPtr[j].Size())
       
  1072                 {
       
  1073                 case 2:
       
  1074                     ctx.DGL().glMultiTexCoord2sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i]));
       
  1075                     break;
       
  1076                 case 3:
       
  1077                     ctx.DGL().glMultiTexCoord3sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i]));
       
  1078                     break;
       
  1079                 case 4:
       
  1080                     ctx.DGL().glMultiTexCoord4sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i]));
       
  1081                     break;
       
  1082                 default:
       
  1083                     GLES_ASSERT(false);
       
  1084                 }
       
  1085                 break;
       
  1086             case GL_FIXED:
       
  1087             case GL_FLOAT:
       
  1088                 switch(texCoordPtr[j].Size())
       
  1089                 {
       
  1090                 case 2:
       
  1091                     ctx.DGL().glMultiTexCoord2fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i]));
       
  1092                     break;
       
  1093                 case 3:
       
  1094                     ctx.DGL().glMultiTexCoord3fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i]));
       
  1095                     break;
       
  1096                 case 4:
       
  1097                     ctx.DGL().glMultiTexCoord4fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i]));
       
  1098                     break;
       
  1099                 default:
       
  1100                     GLES_ASSERT(false);
       
  1101                 }
       
  1102                 break;
       
  1103             default:
       
  1104                 GLES_ASSERT(false);
       
  1105             }
       
  1106         }
       
  1107     }
       
  1108 
       
  1109     GLES_ASSERT(vertexPtr != NULL);
       
  1110     ctx.DGL().glBegin(GL_POINTS);
       
  1111     switch(vertexPtr.Type())
       
  1112     {
       
  1113     case GL_BYTE:
       
  1114     case GL_SHORT:
       
  1115         switch(vertexPtr.Size())
       
  1116         {
       
  1117         case 2:
       
  1118             ctx.DGL().glVertex2sv(static_cast<const GLshort*>(vertexPtr[i]));
       
  1119             break;
       
  1120         case 3:
       
  1121             ctx.DGL().glVertex3sv(static_cast<const GLshort*>(vertexPtr[i]));
       
  1122             break;
       
  1123         case 4:
       
  1124             ctx.DGL().glVertex4sv(static_cast<const GLshort*>(vertexPtr[i]));
       
  1125             break;
       
  1126         default:
       
  1127             GLES_ASSERT(false);
       
  1128         }
       
  1129         break;
       
  1130     case GL_FIXED:
       
  1131     case GL_FLOAT:
       
  1132         switch(vertexPtr.Size())
       
  1133         {
       
  1134         case 2:
       
  1135             ctx.DGL().glVertex2fv(static_cast<const GLfloat*>(vertexPtr[i]));
       
  1136             break;
       
  1137         case 3:
       
  1138             ctx.DGL().glVertex3fv(static_cast<const GLfloat*>(vertexPtr[i]));
       
  1139             break;
       
  1140         case 4:
       
  1141             ctx.DGL().glVertex4fv(static_cast<const GLfloat*>(vertexPtr[i]));
       
  1142             break;
       
  1143         default:
       
  1144             GLES_ASSERT(false);
       
  1145         }
       
  1146         break;
       
  1147     default:
       
  1148         GLES_ASSERT(false);
       
  1149     }
       
  1150     ctx.DGL().glEnd();
       
  1151 }
       
  1152 bool drawPointArrays(const GLESContext& ctx, int first, int count,
       
  1153                      GLESArray* vertexArr, GLESArray* normalArr, GLESArray* colorArr, GLESArray** texCoordArr)
       
  1154 {
       
  1155     GLESArray* pointSizeArr = ctx.PointSizeArray().Convert(count);
       
  1156     if(pointSizeArr == NULL)
       
  1157     {
       
  1158         return false;
       
  1159     }
       
  1160 
       
  1161     GLES_ASSERT(vertexArr != NULL);
       
  1162     GLESArrayPointer vertexPtr = vertexArr->ArrayPointer();
       
  1163     GLESArrayPointer normalPtr = normalArr != NULL ? normalArr->ArrayPointer() : GLESArrayPointer();
       
  1164     GLESArrayPointer colorPtr = colorArr != NULL ? colorArr->ArrayPointer() : GLESArrayPointer();
       
  1165     GLESArrayPointer pointSizePtr = pointSizeArr != NULL ? pointSizeArr->ArrayPointer() : GLESArrayPointer();
       
  1166 
       
  1167     GLESArrayPointer* texCoordPtr = GLES_NEW GLESArrayPointer[ctx.MaxTextureUnits()];
       
  1168     if(texCoordPtr == NULL)
       
  1169     {
       
  1170         delete pointSizeArr;
       
  1171         return false;
       
  1172     }
       
  1173     for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++)
       
  1174     {
       
  1175         texCoordPtr[i] = texCoordArr[i] != NULL ? texCoordArr[i]->ArrayPointer() : GLESArrayPointer();
       
  1176     }
       
  1177 
       
  1178     // Draw individual points
       
  1179 
       
  1180     for(int i = first; i < first + count; i++)
       
  1181     {
       
  1182         drawPoint(ctx, i, vertexPtr, normalPtr, colorPtr, pointSizePtr, texCoordPtr);
       
  1183     }
       
  1184 
       
  1185     delete[] texCoordPtr;
       
  1186     delete pointSizeArr;
       
  1187 
       
  1188     return true;
       
  1189 }
       
  1190 bool drawPointElements(const GLESContext& ctx, int count, GLenum type, const void* indices,
       
  1191                        GLESArray* vertexArr, GLESArray* normalArr, GLESArray* colorArr, GLESArray** texCoordArr)
       
  1192 {
       
  1193     GLESArray* pointSizeArr = ctx.PointSizeArray().Convert(count);
       
  1194     if(pointSizeArr == NULL)
       
  1195     {
       
  1196         return false;
       
  1197     }
       
  1198 
       
  1199     GLES_ASSERT(vertexArr != NULL);
       
  1200     GLESArrayPointer vertexPtr = vertexArr->ArrayPointer();
       
  1201     GLESArrayPointer normalPtr = normalArr != NULL ? normalArr->ArrayPointer() : GLESArrayPointer();
       
  1202     GLESArrayPointer colorPtr = colorArr != NULL ? colorArr->ArrayPointer() : GLESArrayPointer();
       
  1203     GLESArrayPointer pointSizePtr = pointSizeArr != NULL ? pointSizeArr->ArrayPointer() : GLESArrayPointer();
       
  1204 
       
  1205     GLESArrayPointer* texCoordPtr = GLES_NEW GLESArrayPointer[ctx.MaxTextureUnits()];
       
  1206     if(texCoordPtr == NULL)
       
  1207     {
       
  1208         delete pointSizeArr;
       
  1209         return false;
       
  1210     }
       
  1211     for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++)
       
  1212     {
       
  1213         texCoordPtr[i] = texCoordArr[i] != NULL ? texCoordArr[i]->ArrayPointer() : GLESArrayPointer();
       
  1214     }
       
  1215 
       
  1216     // Draw individual points
       
  1217 
       
  1218     for(int i = 0; i < count; i++)
       
  1219     {
       
  1220         int index;
       
  1221         switch(type)
       
  1222         {
       
  1223         case GL_UNSIGNED_BYTE:
       
  1224             index = static_cast<const GLubyte*>(indices)[i];
       
  1225             break;
       
  1226         case GL_UNSIGNED_SHORT:
       
  1227             index = static_cast<const GLushort*>(indices)[i];
       
  1228             break;
       
  1229         default:
       
  1230             GLES_ASSERT(false);
       
  1231         }
       
  1232         drawPoint(ctx, index, vertexPtr, normalPtr, colorPtr, pointSizePtr, texCoordPtr);
       
  1233     }
       
  1234 
       
  1235     delete[] texCoordPtr;
       
  1236     delete pointSizeArr;
       
  1237 
       
  1238     return true;
       
  1239 }
       
  1240 GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count)
       
  1241 {
       
  1242 	GLES_ENTER();
       
  1243 	GLES_ERROR_IF(count < 0, GL_INVALID_VALUE);
       
  1244 
       
  1245     if(!ctx->IsArrayEnabled(GLES_VERTEX_ARRAY) || !count)
       
  1246     {
       
  1247         // Nothing to draw
       
  1248         GLES_LEAVE();
       
  1249     }
       
  1250 
       
  1251     GLESArray* vertexArr = NULL;
       
  1252     GLESArray* normalArr = NULL;
       
  1253     GLESArray* colorArr = NULL;
       
  1254     GLESArray** texCoordArr = GLES_NEW GLESArray*[ctx->MaxTextureUnits()];
       
  1255     for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
       
  1256     {
       
  1257         texCoordArr[i] = NULL;
       
  1258     }
       
  1259 
       
  1260     bool oom = !convertArrays(*ctx, count, &vertexArr, &normalArr, &colorArr, texCoordArr);
       
  1261     if(!oom)
       
  1262     {
       
  1263 		GLES_LOCK_DRAW_SURFACE();
       
  1264         if(mode == GL_POINTS && ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY))
       
  1265         {
       
  1266             oom = !drawPointArrays(*ctx, first, count, vertexArr, normalArr, colorArr, texCoordArr);
       
  1267         }
       
  1268         else
       
  1269         {
       
  1270             ctx->DGL().glDrawArrays (mode, first, count);
       
  1271         }
       
  1272 		GLES_UNLOCK_SURFACE();
       
  1273     }
       
  1274 
       
  1275     for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
       
  1276     {
       
  1277         delete texCoordArr[i];
       
  1278     }
       
  1279     delete colorArr;
       
  1280     delete normalArr;
       
  1281     delete vertexArr;
       
  1282     delete[] texCoordArr;
       
  1283 
       
  1284     if(oom)
       
  1285     {
       
  1286         GLES_ERROR(GL_OUT_OF_MEMORY);
       
  1287     }
       
  1288 
       
  1289     GLES_LEAVE();
       
  1290 }
       
  1291 GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
       
  1292 {
       
  1293 	GLES_ENTER();
       
  1294 	GLES_ERROR_IF(count < 0, GL_INVALID_VALUE);
       
  1295 	GLES_ERROR_IF(type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT, GL_INVALID_ENUM);
       
  1296 
       
  1297     if(!ctx->IsArrayEnabled(GLES_VERTEX_ARRAY) || !count)
       
  1298     {
       
  1299         // Nothing to draw
       
  1300         GLES_LEAVE();
       
  1301     }
       
  1302 
       
  1303     GLESArray* vertexArr = NULL;
       
  1304     GLESArray* normalArr = NULL;
       
  1305     GLESArray* colorArr = NULL;
       
  1306     GLESArray** texCoordArr = GLES_NEW GLESArray*[ctx->MaxTextureUnits()];
       
  1307     for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
       
  1308     {
       
  1309         texCoordArr[i] = NULL;
       
  1310     }
       
  1311 
       
  1312     bool oom = !convertArrays(*ctx, count, &vertexArr, &normalArr, &colorArr, texCoordArr);
       
  1313     if(!oom)
       
  1314     {
       
  1315         if(indices == NULL && ctx->ElementArrayBufferBinding())
       
  1316         {
       
  1317             indices = ctx->ElementArrayBuffer()->data;
       
  1318         }
       
  1319 
       
  1320 		GLES_LOCK_DRAW_SURFACE();
       
  1321         if(mode == GL_POINTS && ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY))
       
  1322         {
       
  1323             oom = !drawPointElements(*ctx, count, type, indices,
       
  1324                                      vertexArr, normalArr, colorArr, texCoordArr);
       
  1325         }
       
  1326         else
       
  1327         {
       
  1328             ctx->DGL().glDrawElements (mode, count, type, indices);
       
  1329         }
       
  1330 		GLES_UNLOCK_SURFACE();
       
  1331     }
       
  1332 
       
  1333     for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
       
  1334     {
       
  1335         delete texCoordArr[i];
       
  1336     }
       
  1337     delete colorArr;
       
  1338     delete normalArr;
       
  1339     delete vertexArr;
       
  1340     delete[] texCoordArr;
       
  1341 
       
  1342     if(oom)
       
  1343     {
       
  1344         GLES_ERROR(GL_OUT_OF_MEMORY);
       
  1345     }
       
  1346 
       
  1347     GLES_LEAVE();
       
  1348 }
       
  1349 GL_API void GL_APIENTRY glEnable (GLenum cap)
       
  1350 {
       
  1351     GLES_ENTER();
       
  1352     GLES_ERROR_IF(!isValidCapabilityEnum(cap), GL_INVALID_ENUM);
       
  1353     ctx->DGL().glEnable (cap);
       
  1354     GLES_LEAVE();
       
  1355 }
       
  1356 GL_API void GL_APIENTRY glEnableClientState (GLenum array)
       
  1357 {
       
  1358     GLES_ENTER();
       
  1359     array = array == GL_POINT_SIZE_ARRAY_OES ? GL_POINT_SIZE_ARRAY : array;
       
  1360     int flag = static_cast<int>(mapArrayType(array));
       
  1361     GLES_ERROR_IF(flag == GLES_INVALID_ARRAY, GL_INVALID_ENUM);
       
  1362     if(flag == GLES_TEXTURE_COORD_ARRAY)
       
  1363     {
       
  1364         flag <<= ctx->ClientActiveTexture();
       
  1365     }
       
  1366     ctx->EnableArray(static_cast<GLESArrayFlag>(flag));
       
  1367     if(array != GL_POINT_SIZE_ARRAY_OES)
       
  1368     {
       
  1369         ctx->DGL().glEnableClientState(array);
       
  1370     }
       
  1371     GLES_LEAVE();
       
  1372 }
       
  1373 GL_API void GL_APIENTRY glFinish (void)
       
  1374 {
       
  1375 	GLES_ENTER();
       
  1376 	ctx->DGL().glFinish();
       
  1377     GLES_LEAVE();
       
  1378 }
       
  1379 GL_API void GL_APIENTRY glFlush (void)
       
  1380 {
       
  1381 	GLES_ENTER();
       
  1382 	ctx->DGL().glFlush();
       
  1383     GLES_LEAVE();
       
  1384 }
       
  1385 GL_API void GL_APIENTRY glFogx (GLenum pname, GLfixed param)
       
  1386 {
       
  1387     GLES_ENTER();
       
  1388     GLES_ERROR_IF(!isValidSingleValuedFogParamEnum(pname), GL_INVALID_ENUM);
       
  1389     if(pname == GL_FOG_MODE)
       
  1390     {
       
  1391         ctx->DGL().glFogf(pname, static_cast<GLfloat>(param));
       
  1392     }
       
  1393     else
       
  1394     {
       
  1395         ctx->DGL().glFogf(pname, X_TO_F(param));
       
  1396     }
       
  1397     GLES_LEAVE();
       
  1398 }
       
  1399 GL_API void GL_APIENTRY glFogxv (GLenum pname, const GLfixed *params)
       
  1400 {
       
  1401     GLES_ENTER();
       
  1402     GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM);
       
  1403     if(pname == GL_FOG_MODE)
       
  1404     {
       
  1405         GLfloat fparam = static_cast<GLfloat>(params[0]);
       
  1406         ctx->DGL().glFogfv (pname, &fparam);
       
  1407     }
       
  1408     else
       
  1409     {
       
  1410         GLfloat fparams[4];
       
  1411         fparams[0] = X_TO_F(params[0]);
       
  1412         if (pname == GL_FOG_COLOR)
       
  1413         {
       
  1414             fparams[1] = X_TO_F(params[1]);
       
  1415             fparams[2] = X_TO_F(params[2]);
       
  1416             fparams[3] = X_TO_F(params[3]);
       
  1417         }
       
  1418         ctx->DGL().glFogfv (pname, fparams);
       
  1419     }
       
  1420 	
       
  1421     GLES_LEAVE();
       
  1422 }
       
  1423 GL_API void GL_APIENTRY glFrontFace (GLenum mode)
       
  1424 {
       
  1425     GLES_ENTER();
       
  1426     ctx->DGL().glFrontFace (mode);
       
  1427     GLES_LEAVE();
       
  1428 }
       
  1429 GL_API void GL_APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
       
  1430 {
       
  1431     GLES_ENTER();
       
  1432     ctx->DGL().glFrustum (X_TO_D(left), X_TO_D(right), X_TO_D(bottom), X_TO_D(top), X_TO_D(zNear), X_TO_D(zFar));
       
  1433     GLES_LEAVE();
       
  1434 }
       
  1435 GL_API void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *params)
       
  1436 {
       
  1437     GLES_ENTER();
       
  1438     if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_BOOLEAN, params))
       
  1439     {
       
  1440         GLES_ERROR(GL_INVALID_ENUM);
       
  1441     }
       
  1442     GLES_LEAVE();
       
  1443 }
       
  1444 GL_API void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params)
       
  1445 {
       
  1446     GLES_ENTER();
       
  1447     GLES_ERROR_IF(!isValidBufferTarget(target), GL_INVALID_ENUM);
       
  1448 	
       
  1449     const GLESBuffer* buffer;
       
  1450     switch(target)
       
  1451     {
       
  1452     case GL_ARRAY_BUFFER:
       
  1453         buffer = ctx->ArrayBuffer();
       
  1454         break;
       
  1455     case GL_ELEMENT_ARRAY_BUFFER:
       
  1456         buffer = ctx->ElementArrayBuffer();
       
  1457         break;
       
  1458     default:
       
  1459         GLES_ERROR(GL_INVALID_ENUM);
       
  1460     }
       
  1461 
       
  1462     switch(pname)
       
  1463     {
       
  1464     case GL_BUFFER_SIZE:
       
  1465         *params = buffer->size;
       
  1466         break;
       
  1467     case GL_BUFFER_USAGE:
       
  1468         *params = buffer->usage;
       
  1469         break;
       
  1470     default:
       
  1471         GLES_ERROR(GL_INVALID_ENUM);
       
  1472     }
       
  1473 
       
  1474     GLES_LEAVE();
       
  1475 }
       
  1476 GL_API void GL_APIENTRY glGetClipPlanex (GLenum pname, GLfixed eqn[4])
       
  1477 {
       
  1478     GLES_ENTER();
       
  1479     GLES_ERROR_IF(pname < GL_CLIP_PLANE0 || pname >= GL_CLIP_PLANE0 + ctx->MaxClipPlanes(), GL_INVALID_ENUM);
       
  1480     GLdouble deqn[4];
       
  1481     ctx->DGL().glGetClipPlane(pname, deqn);
       
  1482     for (int i = 0; i < 4; i++)
       
  1483     {
       
  1484         eqn[i] = D_TO_X(deqn[i]);
       
  1485     }
       
  1486     GLES_LEAVE();
       
  1487 }
       
  1488 GL_API void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers)
       
  1489 {
       
  1490     GLES_ENTER();
       
  1491     GLES_ERROR_IF(n < 0, GL_INVALID_VALUE);
       
  1492     ctx->ReserveBufferNames(n, buffers);
       
  1493     GLES_LEAVE();
       
  1494 }
       
  1495 GL_API void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures)
       
  1496 {
       
  1497     GLES_ENTER();
       
  1498     ctx->DGL().glGenTextures (n, textures);
       
  1499     GLES_LEAVE();
       
  1500 }
       
  1501 GL_API GLenum GL_APIENTRY glGetError (void)
       
  1502 {
       
  1503     GLES_ENTER_RET(GL_INVALID_OPERATION);
       
  1504     GLenum error = ctx->Error();
       
  1505     ctx->SetError(GL_NO_ERROR);
       
  1506     GLES_LEAVE_RET(error);
       
  1507 }
       
  1508 GL_API void GL_APIENTRY glGetFixedv (GLenum pname, GLfixed *params)
       
  1509 {
       
  1510     GLES_ENTER();
       
  1511     if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_FIXED, params))
       
  1512     {
       
  1513         GLES_ERROR(GL_INVALID_ENUM);
       
  1514     }
       
  1515     GLES_LEAVE();
       
  1516 }
       
  1517 GL_API void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *params)
       
  1518 {
       
  1519     GLES_ENTER();
       
  1520     if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_INTEGER, params))
       
  1521     {
       
  1522         GLES_ERROR(GL_INVALID_ENUM);
       
  1523     }
       
  1524     GLES_LEAVE();
       
  1525 }
       
  1526 bool isValidLightEnum(GLenum light, unsigned int maxLights)
       
  1527 {
       
  1528     return light >= GL_LIGHT0 && light < GL_LIGHT0 + maxLights;
       
  1529 }
       
  1530 GL_API void GL_APIENTRY glGetLightxv (GLenum light, GLenum pname, GLfixed *params)
       
  1531 {
       
  1532     GLES_ENTER();
       
  1533     GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM);
       
  1534 	
       
  1535     float fparams[4];
       
  1536     ctx->DGL().glGetLightfv(light, pname, fparams);
       
  1537 
       
  1538     switch (pname)
       
  1539     {
       
  1540     case GL_AMBIENT:
       
  1541     case GL_DIFFUSE:
       
  1542     case GL_SPECULAR:
       
  1543     case GL_POSITION:
       
  1544         params[3] = F_TO_X(fparams[3]);
       
  1545     case GL_SPOT_DIRECTION:
       
  1546         params[2] = F_TO_X(fparams[2]);
       
  1547         params[1] = F_TO_X(fparams[1]);
       
  1548     case GL_SPOT_EXPONENT:
       
  1549     case GL_SPOT_CUTOFF:
       
  1550     case GL_CONSTANT_ATTENUATION:
       
  1551     case GL_LINEAR_ATTENUATION:
       
  1552     case GL_QUADRATIC_ATTENUATION:
       
  1553         params[0] = F_TO_X(fparams[0]);
       
  1554         break;
       
  1555     default:
       
  1556         GLES_ERROR(GL_INVALID_ENUM);
       
  1557     }
       
  1558 	
       
  1559     GLES_LEAVE();
       
  1560 }
       
  1561 GL_API void GL_APIENTRY glGetMaterialxv (GLenum face, GLenum pname, GLfixed *params)
       
  1562 {
       
  1563     GLES_ENTER();
       
  1564     GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM);
       
  1565     GLfloat fparams[4];
       
  1566     ctx->DGL().glGetMaterialfv (face, pname, fparams);
       
  1567     params[0] = F_TO_X(fparams[0]);
       
  1568     if(pname != GL_SHININESS)
       
  1569     {
       
  1570         params[1] = F_TO_X(fparams[1]);
       
  1571         params[2] = F_TO_X(fparams[2]);
       
  1572         params[3] = F_TO_X(fparams[3]);
       
  1573     }
       
  1574     GLES_LEAVE();
       
  1575 }
       
  1576 GL_API void GL_APIENTRY glGetPointerv (GLenum pname, GLvoid **params)
       
  1577 {
       
  1578     GLES_ENTER();
       
  1579     switch(pname)
       
  1580     {
       
  1581     case GL_VERTEX_ARRAY_POINTER:
       
  1582         *params = const_cast<GLvoid*>(ctx->VertexArray().Pointer());
       
  1583         break;
       
  1584     case GL_NORMAL_ARRAY_POINTER:
       
  1585         *params = const_cast<GLvoid*>(ctx->NormalArray().Pointer());
       
  1586         break;
       
  1587     case GL_COLOR_ARRAY_POINTER:
       
  1588         *params = const_cast<GLvoid*>(ctx->ColorArray().Pointer());
       
  1589         break;
       
  1590     case GL_POINT_SIZE_ARRAY_POINTER_OES:
       
  1591         *params = const_cast<GLvoid*>(ctx->PointSizeArray().Pointer());
       
  1592         break;
       
  1593     case GL_TEXTURE_COORD_ARRAY_POINTER:
       
  1594         *params = const_cast<GLvoid*>(ctx->TexCoordArray().Pointer());
       
  1595         break;
       
  1596     default:
       
  1597         GLES_ERROR(GL_INVALID_ENUM);
       
  1598     }
       
  1599     GLES_LEAVE();
       
  1600 }
       
  1601 GL_API const GLubyte * GL_APIENTRY glGetString (GLenum name)
       
  1602 {
       
  1603     GLES_ENTER_RET(NULL);
       
  1604     static const GLubyte vendor[] = "Nokia";
       
  1605     static const GLubyte renderer[] = "OpenGL ES-CM 1.1";
       
  1606     static const GLubyte version[] = "OpenGL ES-CM 1.1";
       
  1607     static const GLubyte extensions[] = "GL_OES_read_format GL_OES_compressed_paletted_texture "
       
  1608                                         "GL_OES_point_size_array GL_OES_point_sprite";
       
  1609     const GLubyte* str = NULL;
       
  1610     switch(name)
       
  1611     {
       
  1612     case GL_VENDOR:
       
  1613         str = vendor;
       
  1614         break;
       
  1615     case GL_RENDERER:
       
  1616         str = renderer;
       
  1617         break;
       
  1618     case GL_VERSION:
       
  1619         str = version;
       
  1620         break;
       
  1621     case GL_EXTENSIONS:
       
  1622         str = extensions;
       
  1623         break;
       
  1624     default:
       
  1625         GLES_ERROR_RET(GL_INVALID_ENUM, NULL);
       
  1626         break;
       
  1627     }
       
  1628     GLES_LEAVE_RET(str);
       
  1629 }
       
  1630 GL_API void GL_APIENTRY glGetTexEnviv (GLenum env, GLenum pname, GLint *params)
       
  1631 {
       
  1632     GLES_ENTER();
       
  1633     pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
       
  1634     ctx->DGL().glGetTexEnviv (env, pname, params);
       
  1635     GLES_LEAVE();
       
  1636 }
       
  1637 GL_API void GL_APIENTRY glGetTexEnvxv (GLenum env, GLenum pname, GLfixed *params)
       
  1638 {
       
  1639     GLES_ENTER();
       
  1640     GLfloat fparams[4];
       
  1641 
       
  1642     pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
       
  1643 
       
  1644     switch (pname)
       
  1645     {
       
  1646     case GL_TEXTURE_ENV_COLOR:
       
  1647         ctx->DGL().glGetTexEnvfv(env, pname, fparams);
       
  1648         params[0] = F_TO_X(fparams[0]);
       
  1649         params[1] = F_TO_X(fparams[1]);
       
  1650         params[2] = F_TO_X(fparams[2]);
       
  1651         params[3] = F_TO_X(fparams[3]);
       
  1652         break;
       
  1653     case GL_RGB_SCALE:
       
  1654     case GL_ALPHA_SCALE:
       
  1655         ctx->DGL().glGetTexEnvfv(env, pname, fparams);
       
  1656         params[0] = F_TO_X(fparams[0]);
       
  1657         break;
       
  1658     case GL_COMBINE_RGB:
       
  1659     case GL_COMBINE_ALPHA:
       
  1660     case GL_COORD_REPLACE:
       
  1661     case GL_TEXTURE_ENV_MODE:
       
  1662     case GL_SRC0_RGB:
       
  1663     case GL_SRC0_ALPHA:
       
  1664     case GL_SRC1_RGB:
       
  1665     case GL_SRC1_ALPHA:
       
  1666     case GL_SRC2_RGB:
       
  1667     case GL_SRC2_ALPHA:
       
  1668     case GL_OPERAND0_RGB:
       
  1669     case GL_OPERAND0_ALPHA:
       
  1670     case GL_OPERAND1_RGB:
       
  1671     case GL_OPERAND1_ALPHA:
       
  1672     case GL_OPERAND2_RGB:
       
  1673     case GL_OPERAND2_ALPHA:
       
  1674         {
       
  1675             GLint i;
       
  1676             ctx->DGL().glGetTexEnviv(env, pname, &i);
       
  1677             params[0] = static_cast<GLfixed>(i);
       
  1678         }
       
  1679         break;
       
  1680     default:
       
  1681         GLES_ERROR(GL_INVALID_ENUM);
       
  1682     }
       
  1683     GLES_LEAVE();
       
  1684 }
       
  1685 GL_API void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
       
  1686 {
       
  1687     GLES_ENTER();
       
  1688     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
  1689     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
  1690     ctx->DGL().glGetTexParameteriv (target, pname, params);
       
  1691     GLES_LEAVE();
       
  1692 }
       
  1693 GL_API void GL_APIENTRY glGetTexParameterxv (GLenum target, GLenum pname, GLfixed *params)
       
  1694 {
       
  1695     GLES_ENTER();
       
  1696     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
  1697     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
  1698     // All parameters are enum values, no conversion to be done.
       
  1699     ctx->DGL().glGetTexParameteriv (target, pname, params);
       
  1700     GLES_LEAVE();
       
  1701 }
       
  1702 bool isValidHintEnum(GLenum hint)
       
  1703 {
       
  1704     switch(hint)
       
  1705     {
       
  1706     case GL_PERSPECTIVE_CORRECTION_HINT:
       
  1707     case GL_POINT_SMOOTH_HINT:
       
  1708     case GL_LINE_SMOOTH_HINT:
       
  1709     case GL_FOG_HINT:
       
  1710     case GL_GENERATE_MIPMAP_HINT:
       
  1711         return true;
       
  1712     default:
       
  1713         return false;
       
  1714     }
       
  1715 }
       
  1716 GL_API void GL_APIENTRY glHint (GLenum target, GLenum mode)
       
  1717 {
       
  1718     GLES_ENTER();
       
  1719     GLES_ERROR_IF(!isValidHintEnum(target), GL_INVALID_ENUM);
       
  1720     ctx->DGL().glHint (target, mode);
       
  1721     GLES_LEAVE();
       
  1722 }
       
  1723 GL_API GLboolean GL_APIENTRY glIsBuffer (GLuint buffer)
       
  1724 {
       
  1725     GLES_ENTER_RET(GL_FALSE);
       
  1726     return ctx->Buffer(buffer) != NULL;
       
  1727     GLES_LEAVE_RET(GL_FALSE);
       
  1728 }
       
  1729 GL_API GLboolean GL_APIENTRY glIsEnabled (GLenum cap)
       
  1730 {
       
  1731     GLES_ENTER_RET(GL_FALSE);
       
  1732     switch(cap)
       
  1733     {
       
  1734     case GL_VERTEX_ARRAY:
       
  1735         return ctx->IsArrayEnabled(GLES_VERTEX_ARRAY);
       
  1736     case GL_NORMAL_ARRAY:
       
  1737         return ctx->IsArrayEnabled(GLES_NORMAL_ARRAY);
       
  1738     case GL_COLOR_ARRAY:
       
  1739         return ctx->IsArrayEnabled(GLES_COLOR_ARRAY);
       
  1740     case GL_POINT_SIZE_ARRAY_OES:
       
  1741         return ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY);
       
  1742     case GL_TEXTURE_COORD_ARRAY:
       
  1743         {
       
  1744         int flag = static_cast<int>(GLES_TEXTURE_COORD_ARRAY);
       
  1745         flag <<= ctx->ClientActiveTexture();
       
  1746         return ctx->IsArrayEnabled(static_cast<GLESArrayFlag>(flag));
       
  1747         }
       
  1748     case GL_POINT_SPRITE_OES:
       
  1749         return ctx->DGL().glIsEnabled(GL_POINT_SPRITE);
       
  1750     default:
       
  1751         GLES_ERROR_IF_RET(!isValidCapabilityEnum(cap), GL_INVALID_ENUM, GL_FALSE);
       
  1752         return ctx->DGL().glIsEnabled(cap);
       
  1753     }
       
  1754     GLES_LEAVE_RET(ctx->DGL().glIsEnabled (cap));
       
  1755 }
       
  1756 GL_API GLboolean GL_APIENTRY glIsTexture (GLuint texture)
       
  1757 {
       
  1758     GLES_ENTER_RET(GL_FALSE);
       
  1759     GLES_LEAVE_RET(ctx->DGL().glIsTexture (texture));
       
  1760 }
       
  1761 GL_API void GL_APIENTRY glLightModelx (GLenum pname, GLfixed param)
       
  1762 {
       
  1763     GLES_ENTER();
       
  1764     GLES_ERROR_IF(pname != GL_LIGHT_MODEL_TWO_SIDE, GL_INVALID_ENUM);
       
  1765     ctx->DGL().glLightModelf (pname, static_cast<GLfloat>(param));
       
  1766     GLES_LEAVE();
       
  1767 }
       
  1768 GL_API void GL_APIENTRY glLightModelxv (GLenum pname, const GLfixed *params)
       
  1769 {
       
  1770     GLES_ENTER();
       
  1771     GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM);
       
  1772     if(pname == GL_LIGHT_MODEL_TWO_SIDE)
       
  1773     {
       
  1774         GLfloat fparam = static_cast<GLfloat>(params[0]);
       
  1775         ctx->DGL().glLightModelfv (pname, &fparam);
       
  1776     }
       
  1777     else
       
  1778     {
       
  1779         GLfloat fparams[4];
       
  1780         fparams[0] = X_TO_F(params[0]);
       
  1781         if(pname == GL_LIGHT_MODEL_AMBIENT)
       
  1782         {
       
  1783             fparams[1] = X_TO_F(params[1]);
       
  1784             fparams[2] = X_TO_F(params[2]);
       
  1785             fparams[3] = X_TO_F(params[3]);
       
  1786         }
       
  1787         ctx->DGL().glLightModelfv (pname, fparams);
       
  1788     }
       
  1789     GLES_LEAVE();
       
  1790 }
       
  1791 GL_API void GL_APIENTRY glLightx (GLenum light, GLenum pname, GLfixed param)
       
  1792 {
       
  1793     GLES_ENTER();
       
  1794     GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM);
       
  1795     ctx->DGL().glLightf (light, pname, X_TO_F(param));
       
  1796     GLES_LEAVE();
       
  1797 }
       
  1798 GL_API void GL_APIENTRY glLightxv (GLenum light, GLenum pname, const GLfixed *params)
       
  1799 {
       
  1800     GLES_ENTER();
       
  1801     GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM);
       
  1802     GLfloat fparams[4];
       
  1803     switch(pname)
       
  1804     {
       
  1805     case GL_AMBIENT:
       
  1806     case GL_DIFFUSE:
       
  1807     case GL_SPECULAR:
       
  1808     case GL_POSITION:
       
  1809         fparams[3] = X_TO_F(params[3]);
       
  1810     case GL_SPOT_DIRECTION:
       
  1811         fparams[2] = X_TO_F(params[2]);
       
  1812         fparams[1] = X_TO_F(params[1]);
       
  1813         break;
       
  1814     }
       
  1815     fparams[0] = X_TO_F(params[0]);
       
  1816     ctx->DGL().glLightfv (light, pname, fparams);
       
  1817     GLES_LEAVE();
       
  1818 }
       
  1819 GL_API void GL_APIENTRY glLineWidthx (GLfixed width)
       
  1820 {
       
  1821     GLES_ENTER();
       
  1822     ctx->DGL().glLineWidth (X_TO_F(width));
       
  1823     GLES_LEAVE();
       
  1824 }
       
  1825 GL_API void GL_APIENTRY glLoadIdentity (void)
       
  1826 {
       
  1827     GLES_ENTER();
       
  1828     ctx->DGL().glLoadIdentity ();
       
  1829     GLES_LEAVE();
       
  1830 }
       
  1831 GL_API void GL_APIENTRY glLoadMatrixx (const GLfixed *m)
       
  1832 {
       
  1833     GLES_ENTER();
       
  1834     GLfloat fm[16];
       
  1835     for(int i = 0; i < 16; i++)
       
  1836     {
       
  1837         fm[i] = X_TO_F(m[i]);
       
  1838     }
       
  1839     ctx->DGL().glLoadMatrixf (fm);
       
  1840     GLES_LEAVE();
       
  1841 }
       
  1842 GL_API void GL_APIENTRY glLogicOp (GLenum opcode)
       
  1843 {
       
  1844     GLES_ENTER();
       
  1845     ctx->DGL().glLogicOp (opcode);
       
  1846     GLES_LEAVE();
       
  1847 }
       
  1848 GL_API void GL_APIENTRY glMaterialx (GLenum face, GLenum pname, GLfixed param)
       
  1849 {
       
  1850     GLES_ENTER();
       
  1851     GLES_ERROR_IF(!isValidSingleValuedMaterialParamEnum(pname), GL_INVALID_ENUM);
       
  1852     ctx->DGL().glMaterialf (face, pname, X_TO_F(param));
       
  1853     GLES_LEAVE();
       
  1854 }
       
  1855 GL_API void GL_APIENTRY glMaterialxv (GLenum face, GLenum pname, const GLfixed *params)
       
  1856 {
       
  1857     GLES_ENTER();
       
  1858     GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM);
       
  1859     GLfloat fparams[4];
       
  1860     for(int i = 0; i < 4; i++)
       
  1861     {
       
  1862         fparams[i] = X_TO_F(params[i]);
       
  1863     }
       
  1864     ctx->DGL().glMaterialfv (face, pname, fparams);
       
  1865     GLES_LEAVE();
       
  1866 }
       
  1867 GL_API void GL_APIENTRY glMatrixMode (GLenum mode)
       
  1868 {
       
  1869     GLES_ENTER();
       
  1870     ctx->DGL().glMatrixMode (mode);
       
  1871     GLES_LEAVE();
       
  1872 }
       
  1873 GL_API void GL_APIENTRY glMultMatrixx (const GLfixed *m)
       
  1874 {
       
  1875     GLES_ENTER();
       
  1876     GLfloat fm[16];
       
  1877     for(int i = 0; i < 16; i++)
       
  1878     {
       
  1879         fm[i] = X_TO_F(m[i]);
       
  1880     }
       
  1881     ctx->DGL().glMultMatrixf (fm);
       
  1882     GLES_LEAVE();
       
  1883 }
       
  1884 GL_API void GL_APIENTRY glMultiTexCoord4x (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
       
  1885 {
       
  1886     GLES_ENTER();
       
  1887     GLES_ERROR_IF(!isValidTextureTargetEnum(target, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
       
  1888     ctx->DGL().glMultiTexCoord4f (target, X_TO_F(s), X_TO_F(t), X_TO_F(r), X_TO_F(q));
       
  1889     GLES_LEAVE();
       
  1890 }
       
  1891 GL_API void GL_APIENTRY glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz)
       
  1892 {
       
  1893     GLES_ENTER();
       
  1894     ctx->DGL().glNormal3f (X_TO_F(nx), X_TO_F(ny), X_TO_F(nz));
       
  1895     GLES_LEAVE();
       
  1896 }
       
  1897 GL_API void GL_APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer)
       
  1898 {
       
  1899     GLES_ENTER();
       
  1900     GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
       
  1901     GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
       
  1902     ctx->SetNormalArray(type, stride, pointer);
       
  1903     GLES_LEAVE();
       
  1904 }
       
  1905 GL_API void GL_APIENTRY glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
       
  1906 {
       
  1907     GLES_ENTER();
       
  1908     ctx->DGL().glOrtho (X_TO_D(left), X_TO_D(right), X_TO_D(bottom), X_TO_D(top), X_TO_D(zNear), X_TO_D(zFar));
       
  1909     GLES_LEAVE();
       
  1910 }
       
  1911 GL_API void GL_APIENTRY glPixelStorei (GLenum pname, GLint param)
       
  1912 {
       
  1913     GLES_ENTER();
       
  1914     ctx->DGL().glPixelStorei (pname, param);
       
  1915     GLES_LEAVE();
       
  1916 }
       
  1917 GL_API void GL_APIENTRY glPointParameterx (GLenum pname, GLfixed param)
       
  1918 {
       
  1919     GLES_ENTER();
       
  1920     ctx->DGL().glPointParameterf (pname, X_TO_F(param));
       
  1921     GLES_LEAVE();
       
  1922 }
       
  1923 GL_API void GL_APIENTRY glPointParameterxv (GLenum pname, const GLfixed *params)
       
  1924 {
       
  1925     GLES_ENTER();
       
  1926     GLfloat fparams[3];
       
  1927     fparams[0] = X_TO_F(params[0]);
       
  1928     if(pname == GL_POINT_DISTANCE_ATTENUATION)
       
  1929     {
       
  1930         fparams[1] = X_TO_F(params[1]);
       
  1931         fparams[2] = X_TO_F(params[2]);
       
  1932     }
       
  1933     ctx->DGL().glPointParameterfv (pname, fparams);
       
  1934     GLES_LEAVE();
       
  1935 }
       
  1936 GL_API void GL_APIENTRY glPointSizex (GLfixed size)
       
  1937 {
       
  1938     GLES_ENTER();
       
  1939     ctx->DGL().glPointSize (X_TO_F(size));
       
  1940     GLES_LEAVE();
       
  1941 }
       
  1942 GL_API void GL_APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units)
       
  1943 {
       
  1944     GLES_ENTER();
       
  1945     ctx->DGL().glPolygonOffset (X_TO_F(factor), X_TO_F(units));
       
  1946     GLES_LEAVE();
       
  1947 }
       
  1948 GL_API void GL_APIENTRY glPopMatrix (void)
       
  1949 {
       
  1950     GLES_ENTER();
       
  1951     ctx->DGL().glPopMatrix();
       
  1952     GLES_LEAVE();
       
  1953 }
       
  1954 GL_API void GL_APIENTRY glPushMatrix (void)
       
  1955 {
       
  1956     GLES_ENTER();
       
  1957     ctx->DGL().glPushMatrix();
       
  1958     GLES_LEAVE();
       
  1959 }
       
  1960 bool isValidPixelTypeEnum(GLenum type)
       
  1961 {
       
  1962     switch(type)
       
  1963     {
       
  1964     case GL_UNSIGNED_BYTE:
       
  1965     case GL_UNSIGNED_SHORT_5_6_5:
       
  1966     case GL_UNSIGNED_SHORT_4_4_4_4:
       
  1967     case GL_UNSIGNED_SHORT_5_5_5_1:
       
  1968         return true;
       
  1969     default:
       
  1970         return false;
       
  1971     }
       
  1972 }
       
  1973 GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
       
  1974 {
       
  1975 	GLES_ENTER();
       
  1976 	GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM);
       
  1977 	GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM);
       
  1978 	GLES_LOCK_READ_SURFACE();
       
  1979 	ctx->DGL().glReadPixels (x, y, width, height, format, type, pixels);
       
  1980 	GLES_UNLOCK_SURFACE();
       
  1981     GLES_LEAVE();
       
  1982 }
       
  1983 GL_API void GL_APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
       
  1984 {
       
  1985     GLES_ENTER();
       
  1986     ctx->DGL().glRotatef (X_TO_F(angle), X_TO_F(x), X_TO_F(y), X_TO_F(z));
       
  1987     GLES_LEAVE();
       
  1988 }
       
  1989 GL_API void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert)
       
  1990 {
       
  1991     GLES_ENTER();
       
  1992     ctx->DGL().glSampleCoverage (value, invert);
       
  1993     GLES_LEAVE();
       
  1994 }
       
  1995 GL_API void GL_APIENTRY glSampleCoveragex (GLclampx value, GLboolean invert)
       
  1996 {
       
  1997     GLES_ENTER();
       
  1998     ctx->DGL().glSampleCoverage (X_TO_F(value), invert);
       
  1999     GLES_LEAVE();
       
  2000 }
       
  2001 GL_API void GL_APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z)
       
  2002 {
       
  2003     GLES_ENTER();
       
  2004     ctx->DGL().glScalef (X_TO_F(x), X_TO_F(y), X_TO_F(z));
       
  2005     GLES_LEAVE();
       
  2006 }
       
  2007 GL_API void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height)
       
  2008 {
       
  2009     GLES_ENTER();
       
  2010     ctx->DGL().glScissor (x, y, width, height);
       
  2011     GLES_LEAVE();
       
  2012 }
       
  2013 GL_API void GL_APIENTRY glShadeModel (GLenum mode)
       
  2014 {
       
  2015     GLES_ENTER();
       
  2016     ctx->DGL().glShadeModel (mode);
       
  2017     GLES_LEAVE();
       
  2018 }
       
  2019 GL_API void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask)
       
  2020 {
       
  2021     GLES_ENTER();
       
  2022     ctx->DGL().glStencilFunc (func, ref, mask);
       
  2023     GLES_LEAVE();
       
  2024 }
       
  2025 GL_API void GL_APIENTRY glStencilMask (GLuint mask)
       
  2026 {
       
  2027     GLES_ENTER();
       
  2028     ctx->DGL().glStencilMask (mask);
       
  2029     GLES_LEAVE();
       
  2030 }
       
  2031 GL_API void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass)
       
  2032 {
       
  2033     GLES_ENTER();
       
  2034     ctx->DGL().glStencilOp (fail,  zfail, zpass);
       
  2035     GLES_LEAVE();
       
  2036 }
       
  2037 GL_API void GL_APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
       
  2038 {
       
  2039     GLES_ENTER();
       
  2040     GLES_ERROR_IF(size != 2 && size != 3 && size != 4, GL_INVALID_VALUE);
       
  2041     GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
       
  2042     GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
       
  2043     ctx->SetTexCoordArray(size, type, stride, pointer);
       
  2044     GLES_LEAVE();
       
  2045 }
       
  2046 GL_API void GL_APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param)
       
  2047 {
       
  2048     GLES_ENTER();
       
  2049     GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
       
  2050     GLES_ERROR_IF(!isValidSingleValuedTexEnvParamEnum(pname), GL_INVALID_ENUM);
       
  2051     ctx->DGL().glTexEnvi (target, pname, param);
       
  2052     GLES_LEAVE();
       
  2053 }
       
  2054 GL_API void GL_APIENTRY glTexEnvx (GLenum target, GLenum pname, GLfixed param)
       
  2055 {
       
  2056     GLES_ENTER();
       
  2057     GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
       
  2058     GLES_ERROR_IF(!isValidSingleValuedTexEnvParamEnum(pname), GL_INVALID_ENUM);
       
  2059     GLfloat fparam;
       
  2060     if(target == GL_TEXTURE_ENV && (pname == GL_RGB_SCALE || pname == GL_ALPHA_SCALE))
       
  2061     {
       
  2062         fparam = X_TO_F(param);
       
  2063     }
       
  2064     else
       
  2065     {
       
  2066         fparam = static_cast<GLfloat>(param);
       
  2067     }
       
  2068     ctx->DGL().glTexEnvf (target, pname, fparam);
       
  2069     GLES_LEAVE();
       
  2070 }
       
  2071 GL_API void GL_APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params)
       
  2072 {
       
  2073     GLES_ENTER();
       
  2074     GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
       
  2075     GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
       
  2076     ctx->DGL().glTexEnviv (target, pname, params);
       
  2077     GLES_LEAVE();
       
  2078 }
       
  2079 GL_API void GL_APIENTRY glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params)
       
  2080 {
       
  2081     GLES_ENTER();
       
  2082     GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
       
  2083     GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
       
  2084     GLfloat fparams[4];
       
  2085     switch(pname)
       
  2086     {
       
  2087     case GL_TEXTURE_ENV_COLOR:
       
  2088         fparams[3] = X_TO_F(params[3]);
       
  2089         fparams[2] = X_TO_F(params[2]);
       
  2090         fparams[1] = X_TO_F(params[1]);
       
  2091         // fall-through
       
  2092     case GL_RGB_SCALE:
       
  2093     case GL_ALPHA_SCALE:
       
  2094         fparams[0] = X_TO_F(params[0]);
       
  2095         break;
       
  2096     default:
       
  2097         fparams[0] = static_cast<GLfloat>(params[0]);
       
  2098     }
       
  2099     ctx->DGL().glTexEnvfv (target, pname, fparams);
       
  2100     GLES_LEAVE();
       
  2101 }
       
  2102 GL_API void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
       
  2103 {
       
  2104 	GLES_ENTER();
       
  2105 	GLES_ERROR_IF(!isValidPixelFormatEnum(internalformat), GL_INVALID_ENUM);
       
  2106 	GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM);
       
  2107 	GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM);
       
  2108 	GLES_ERROR_IF(internalformat != format, GL_INVALID_ENUM);
       
  2109 	GLES_ERROR_IF(isPalettedFormat(internalformat), GL_INVALID_OPERATION);
       
  2110 	
       
  2111 	ctx->DGL().glTexImage2D (target, level, internalformat, width, height, border, format, type, pixels);
       
  2112 	if(ctx->GetHostError() == GL_NO_ERROR)
       
  2113 	{
       
  2114 		GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
       
  2115 		GLES_ASSERT(texture != NULL);
       
  2116 		texture->SetLevel(level, internalformat, width, height);
       
  2117 
       
  2118 		GLint genMipmap;
       
  2119 		ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
       
  2120 		if(level == 0 && genMipmap)
       
  2121 		{
       
  2122 			GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
       
  2123 			GLES_ASSERT(texture != NULL);
       
  2124 			texture->GenerateMipmap();
       
  2125 		}
       
  2126 
       
  2127 		if(texture->Level(level)->boundSurface != NULL)
       
  2128 		{
       
  2129 			// Texture is respecified. Release the bound EGLSurface.
       
  2130 			glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level);
       
  2131 			texture->Level(level)->boundSurface = NULL;
       
  2132 		}
       
  2133 	}
       
  2134 
       
  2135 	GLES_LEAVE();
       
  2136 }
       
  2137 GL_API void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param)
       
  2138 {
       
  2139     GLES_ENTER();
       
  2140     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
  2141     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
  2142     ctx->DGL().glTexParameteri (target, pname, param);
       
  2143     GLES_LEAVE();
       
  2144 }
       
  2145 GL_API void GL_APIENTRY glTexParameterx (GLenum target, GLenum pname, GLfixed param)
       
  2146 {
       
  2147     GLES_ENTER();
       
  2148     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
  2149     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
  2150     ctx->DGL().glTexParameterf (target, pname, static_cast<GLfloat>(param));
       
  2151     GLES_LEAVE();
       
  2152 }
       
  2153 GL_API void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params)
       
  2154 {
       
  2155     GLES_ENTER();
       
  2156     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
  2157     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
  2158     ctx->DGL().glTexParameteriv (target, pname, params);
       
  2159     GLES_LEAVE();
       
  2160 }
       
  2161 GL_API void GL_APIENTRY glTexParameterxv (GLenum target, GLenum pname, const GLfixed *params)
       
  2162 {
       
  2163     GLES_ENTER();
       
  2164     GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
       
  2165     GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
       
  2166     GLfloat fparam = static_cast<GLfloat>(params[0]);
       
  2167     ctx->DGL().glTexParameterfv (target, pname, &fparam);
       
  2168     GLES_LEAVE();
       
  2169 }
       
  2170 GL_API void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
       
  2171 {
       
  2172 	GLES_ENTER();
       
  2173 	GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM);
       
  2174 	GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM);
       
  2175 	
       
  2176 	ctx->DGL().glTexSubImage2D (target, level, xoffset, yoffset, width, height, format, type, pixels);
       
  2177 
       
  2178 	if(ctx->GetHostError() == GL_NO_ERROR)
       
  2179 	{
       
  2180 		GLint genMipmap;
       
  2181 		ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
       
  2182 		if(level == 0 && genMipmap)
       
  2183 		{
       
  2184 			GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
       
  2185 			GLES_ASSERT(texture != NULL);
       
  2186 			texture->GenerateMipmap();
       
  2187 		}
       
  2188 	}
       
  2189 
       
  2190 	GLES_LEAVE();
       
  2191 }
       
  2192 GL_API void GL_APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z)
       
  2193 {
       
  2194     GLES_ENTER();
       
  2195     ctx->DGL().glTranslatef (X_TO_F(x), X_TO_F(y), X_TO_F(z));
       
  2196     GLES_LEAVE();
       
  2197 }
       
  2198 GL_API void GL_APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
       
  2199 {
       
  2200     GLES_ENTER();
       
  2201     GLES_ERROR_IF(size != 2 && size != 3 && size != 4, GL_INVALID_VALUE);
       
  2202     GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
       
  2203     GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
       
  2204     ctx->SetVertexArray(size, type, stride, pointer);
       
  2205     GLES_LEAVE();
       
  2206 }
       
  2207 GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
       
  2208 {
       
  2209     GLES_ENTER();
       
  2210     ctx->DGL().glViewport (x, y, width, height);
       
  2211     GLES_LEAVE();
       
  2212 }
       
  2213 
       
  2214 #ifdef GL_OES_point_size_array
       
  2215 GL_API void GL_APIENTRY glPointSizePointerOES (GLenum type, GLsizei stride, const GLvoid *pointer)
       
  2216 {
       
  2217     GLES_ENTER();
       
  2218     GLES_ERROR_IF(type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
       
  2219     GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
       
  2220     ctx->SetPointerSizeArray(type, stride, pointer);
       
  2221     GLES_LEAVE();
       
  2222 }
       
  2223 #endif
       
  2224 
       
  2225 #ifdef __cplusplus
       
  2226 }
       
  2227 #endif