Home | History | Annotate | Download | only in GLES_CM
      1 /*
      2 * Copyright (C) 2011 The Android Open Source Project
      3 *
      4 * Licensed under the Apache License, Version 2.0 (the "License");
      5 * you may not use this file except in compliance with the License.
      6 * You may obtain a copy of the License at
      7 *
      8 * http://www.apache.org/licenses/LICENSE-2.0
      9 *
     10 * Unless required by applicable law or agreed to in writing, software
     11 * distributed under the License is distributed on an "AS IS" BASIS,
     12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 * See the License for the specific language governing permissions and
     14 * limitations under the License.
     15 */
     16 
     17 #ifdef _WIN32
     18 #undef GL_API
     19 #define GL_API __declspec(dllexport)
     20 #define GL_APICALL __declspec(dllexport)
     21 #endif
     22 #define GL_GLEXT_PROTOTYPES
     23 #include "GLEScmContext.h"
     24 #include "GLEScmValidate.h"
     25 #include "GLEScmUtils.h"
     26 #include <GLcommon/TextureUtils.h>
     27 
     28 #include <stdio.h>
     29 #include <GLcommon/gldefs.h>
     30 #include <GLcommon/GLDispatch.h>
     31 #include <GLcommon/GLconversion_macros.h>
     32 #include <GLcommon/TranslatorIfaces.h>
     33 #include <GLcommon/FramebufferData.h>
     34 #include <GLES/gl.h>
     35 #include <GLES/glext.h>
     36 #include <cmath>
     37 #include <map>
     38 
     39 extern "C" {
     40 
     41 //decleration
     42 static void initContext(GLEScontext* ctx,ShareGroupPtr grp);
     43 static void deleteGLESContext(GLEScontext* ctx);
     44 static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp);
     45 static GLEScontext* createGLESContext();
     46 static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName);
     47 
     48 }
     49 
     50 /************************************** GLES EXTENSIONS *********************************************************/
     51 //extentions descriptor
     52 typedef std::map<std::string, __translatorMustCastToProperFunctionPointerType> ProcTableMap;
     53 ProcTableMap *s_glesExtensions = NULL;
     54 /****************************************************************************************************************/
     55 
     56 static EGLiface*  s_eglIface = NULL;
     57 static GLESiface  s_glesIface = {
     58     createGLESContext:createGLESContext,
     59     initContext      :initContext,
     60     deleteGLESContext:deleteGLESContext,
     61     flush            :(FUNCPTR)glFlush,
     62     finish           :(FUNCPTR)glFinish,
     63     setShareGroup    :setShareGroup,
     64     getProcAddress   :getProcAddress
     65 };
     66 
     67 #include <GLcommon/GLESmacros.h>
     68 
     69 extern "C" {
     70 
     71 static void initContext(GLEScontext* ctx,ShareGroupPtr grp) {
     72     if (!ctx->isInitialized()) {
     73         ctx->setShareGroup(grp);
     74         ctx->init();
     75         glBindTexture(GL_TEXTURE_2D,0);
     76         glBindTexture(GL_TEXTURE_CUBE_MAP_OES,0);
     77      }
     78 }
     79 
     80 static GLEScontext* createGLESContext() {
     81     return new GLEScmContext();
     82 }
     83 
     84 static void deleteGLESContext(GLEScontext* ctx) {
     85     if(ctx) delete ctx;
     86 }
     87 
     88 static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp) {
     89     if(ctx) {
     90         ctx->setShareGroup(grp);
     91     }
     92 }
     93 static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName) {
     94     GET_CTX_RET(NULL)
     95     ctx->getGlobalLock();
     96     static bool proc_table_initialized = false;
     97     if (!proc_table_initialized) {
     98         proc_table_initialized = true;
     99         if (!s_glesExtensions)
    100             s_glesExtensions = new ProcTableMap();
    101         else
    102             s_glesExtensions->clear();
    103         (*s_glesExtensions)["glEGLImageTargetTexture2DOES"] = (__translatorMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES;
    104         (*s_glesExtensions)["glEGLImageTargetRenderbufferStorageOES"]=(__translatorMustCastToProperFunctionPointerType)glEGLImageTargetRenderbufferStorageOES;
    105         (*s_glesExtensions)["glBlendEquationSeparateOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendEquationSeparateOES;
    106         (*s_glesExtensions)["glBlendFuncSeparateOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendFuncSeparateOES;
    107         (*s_glesExtensions)["glBlendEquationOES"] = (__translatorMustCastToProperFunctionPointerType)glBlendEquationOES;
    108 
    109         if (ctx->getCaps()->GL_ARB_MATRIX_PALETTE && ctx->getCaps()->GL_ARB_VERTEX_BLEND) {
    110             (*s_glesExtensions)["glCurrentPaletteMatrixOES"] = (__translatorMustCastToProperFunctionPointerType)glCurrentPaletteMatrixOES;
    111             (*s_glesExtensions)["glLoadPaletteFromModelViewMatrixOES"]=(__translatorMustCastToProperFunctionPointerType)glLoadPaletteFromModelViewMatrixOES;
    112             (*s_glesExtensions)["glMatrixIndexPointerOES"] = (__translatorMustCastToProperFunctionPointerType)glMatrixIndexPointerOES;
    113             (*s_glesExtensions)["glWeightPointerOES"] = (__translatorMustCastToProperFunctionPointerType)glWeightPointerOES;
    114         }
    115         (*s_glesExtensions)["glDepthRangefOES"] = (__translatorMustCastToProperFunctionPointerType)glDepthRangef;
    116         (*s_glesExtensions)["glFrustumfOES"] = (__translatorMustCastToProperFunctionPointerType)glFrustumf;
    117         (*s_glesExtensions)["glOrthofOES"] = (__translatorMustCastToProperFunctionPointerType)glOrthof;
    118         (*s_glesExtensions)["glClipPlanefOES"] = (__translatorMustCastToProperFunctionPointerType)glClipPlanef;
    119         (*s_glesExtensions)["glGetClipPlanefOES"] = (__translatorMustCastToProperFunctionPointerType)glGetClipPlanef;
    120         (*s_glesExtensions)["glClearDepthfOES"] = (__translatorMustCastToProperFunctionPointerType)glClearDepthf;
    121         (*s_glesExtensions)["glPointSizePointerOES"] = (__translatorMustCastToProperFunctionPointerType)glPointSizePointerOES;
    122         (*s_glesExtensions)["glTexGenfOES"] = (__translatorMustCastToProperFunctionPointerType)glTexGenfOES;
    123         (*s_glesExtensions)["glTexGenfvOES"] = (__translatorMustCastToProperFunctionPointerType)glTexGenfvOES;
    124         (*s_glesExtensions)["glTexGeniOES"] = (__translatorMustCastToProperFunctionPointerType)glTexGeniOES;
    125         (*s_glesExtensions)["glTexGenivOES"] = (__translatorMustCastToProperFunctionPointerType)glTexGenivOES;
    126         (*s_glesExtensions)["glTexGenxOES"] = (__translatorMustCastToProperFunctionPointerType)glTexGenxOES;
    127         (*s_glesExtensions)["glTexGenxvOES"] = (__translatorMustCastToProperFunctionPointerType)glTexGenxvOES;
    128         (*s_glesExtensions)["glGetTexGenfvOES"] = (__translatorMustCastToProperFunctionPointerType)glGetTexGenfvOES;
    129         (*s_glesExtensions)["glGetTexGenivOES"] = (__translatorMustCastToProperFunctionPointerType)glGetTexGenivOES;
    130         (*s_glesExtensions)["glGetTexGenxvOES"] = (__translatorMustCastToProperFunctionPointerType)glGetTexGenxvOES;
    131         if (ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT) {
    132             (*s_glesExtensions)["glIsRenderbufferOES"] = (__translatorMustCastToProperFunctionPointerType)glIsRenderbufferOES;
    133             (*s_glesExtensions)["glBindRenderbufferOES"] = (__translatorMustCastToProperFunctionPointerType)glBindRenderbufferOES;
    134             (*s_glesExtensions)["glDeleteRenderbuffersOES"] = (__translatorMustCastToProperFunctionPointerType)glDeleteRenderbuffersOES;
    135             (*s_glesExtensions)["glGenRenderbuffersOES"] = (__translatorMustCastToProperFunctionPointerType)glGenRenderbuffersOES;
    136             (*s_glesExtensions)["glRenderbufferStorageOES"] = (__translatorMustCastToProperFunctionPointerType)glRenderbufferStorageOES;
    137             (*s_glesExtensions)["glGetRenderbufferParameterivOES"] = (__translatorMustCastToProperFunctionPointerType)glGetRenderbufferParameterivOES;
    138             (*s_glesExtensions)["glIsFramebufferOES"] = (__translatorMustCastToProperFunctionPointerType)glIsFramebufferOES;
    139             (*s_glesExtensions)["glBindFramebufferOES"] = (__translatorMustCastToProperFunctionPointerType)glBindFramebufferOES;
    140             (*s_glesExtensions)["glDeleteFramebuffersOES"] = (__translatorMustCastToProperFunctionPointerType)glDeleteFramebuffersOES;
    141             (*s_glesExtensions)["glGenFramebuffersOES"] = (__translatorMustCastToProperFunctionPointerType)glGenFramebuffersOES;
    142             (*s_glesExtensions)["glCheckFramebufferStatusOES"] = (__translatorMustCastToProperFunctionPointerType)glCheckFramebufferStatusOES;
    143             (*s_glesExtensions)["glFramebufferTexture2DOES"] = (__translatorMustCastToProperFunctionPointerType)glFramebufferTexture2DOES;
    144             (*s_glesExtensions)["glFramebufferRenderbufferOES"] = (__translatorMustCastToProperFunctionPointerType)glFramebufferRenderbufferOES;
    145             (*s_glesExtensions)["glGetFramebufferAttachmentParameterivOES"] = (__translatorMustCastToProperFunctionPointerType)glGetFramebufferAttachmentParameterivOES;
    146             (*s_glesExtensions)["glGenerateMipmapOES"] = (__translatorMustCastToProperFunctionPointerType)glGenerateMipmapOES;
    147         }
    148         (*s_glesExtensions)["glDrawTexsOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexsOES;
    149         (*s_glesExtensions)["glDrawTexiOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexiOES;
    150         (*s_glesExtensions)["glDrawTexfOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexfOES;
    151         (*s_glesExtensions)["glDrawTexxOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexxOES;
    152         (*s_glesExtensions)["glDrawTexsvOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexsvOES;
    153         (*s_glesExtensions)["glDrawTexivOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexivOES;
    154         (*s_glesExtensions)["glDrawTexfvOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexfvOES;
    155         (*s_glesExtensions)["glDrawTexxvOES"] = (__translatorMustCastToProperFunctionPointerType)glDrawTexxvOES;
    156     }
    157     __translatorMustCastToProperFunctionPointerType ret=NULL;
    158     ProcTableMap::iterator val = s_glesExtensions->find(procName);
    159     if (val!=s_glesExtensions->end())
    160         ret = val->second;
    161     ctx->releaseGlobalLock();
    162 
    163     return ret;
    164 }
    165 
    166 GL_API GLESiface* __translator_getIfaces(EGLiface* eglIface){
    167     s_eglIface = eglIface;
    168     return & s_glesIface;
    169 }
    170 
    171 }
    172 
    173 static ObjectLocalName TextureLocalName(GLenum target, unsigned int tex) {
    174     GET_CTX_RET(0);
    175     return (tex!=0? tex : ctx->getDefaultTextureName(target));
    176 }
    177 
    178 static TextureData* getTextureData(ObjectLocalName tex){
    179     GET_CTX_RET(NULL);
    180 
    181     if(!ctx->shareGroup()->isObject(TEXTURE,tex))
    182     {
    183         return NULL;
    184     }
    185 
    186     TextureData *texData = NULL;
    187     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
    188     if(!objData.Ptr()){
    189         texData = new TextureData();
    190         ctx->shareGroup()->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
    191     } else {
    192         texData = (TextureData*)objData.Ptr();
    193     }
    194     return texData;
    195 }
    196 
    197 static TextureData* getTextureTargetData(GLenum target){
    198     GET_CTX_RET(NULL);
    199     unsigned int tex = ctx->getBindedTexture(target);
    200     return getTextureData(TextureLocalName(target,tex));
    201 }
    202 
    203 GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) {
    204     GET_CTX_RET(GL_FALSE)
    205 
    206     if(buffer && ctx->shareGroup().Ptr()) {
    207        ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer);
    208        return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
    209     }
    210     return GL_FALSE;
    211 }
    212 
    213 GL_API GLboolean GL_APIENTRY  glIsEnabled( GLenum cap) {
    214     GET_CTX_CM_RET(GL_FALSE)
    215     RET_AND_SET_ERROR_IF(!GLEScmValidate::capability(cap,ctx->getMaxLights(),ctx->getMaxClipPlanes()),GL_INVALID_ENUM,GL_FALSE);
    216 
    217     if (cap == GL_POINT_SIZE_ARRAY_OES)
    218         return ctx->isArrEnabled(cap);
    219     else if (cap==GL_TEXTURE_GEN_STR_OES)
    220         return (ctx->dispatcher().glIsEnabled(GL_TEXTURE_GEN_S) &&
    221                 ctx->dispatcher().glIsEnabled(GL_TEXTURE_GEN_T) &&
    222                 ctx->dispatcher().glIsEnabled(GL_TEXTURE_GEN_R));
    223     else
    224         return ctx->dispatcher().glIsEnabled(cap);
    225 }
    226 
    227 GL_API GLboolean GL_APIENTRY  glIsTexture( GLuint texture) {
    228     GET_CTX_RET(GL_FALSE)
    229 
    230     if(texture == 0) // Special case
    231         return GL_FALSE;
    232 
    233     TextureData* tex = getTextureData(texture);
    234     return tex ? tex->wasBound : GL_FALSE;
    235 }
    236 
    237 GL_API GLenum GL_APIENTRY  glGetError(void) {
    238     GET_CTX_RET(GL_NO_ERROR)
    239     GLenum err = ctx->getGLerror();
    240     if(err != GL_NO_ERROR) {
    241         ctx->setGLerror(GL_NO_ERROR);
    242         return err;
    243     }
    244 
    245     return ctx->dispatcher().glGetError();
    246 }
    247 
    248 GL_API const GLubyte * GL_APIENTRY  glGetString( GLenum name) {
    249 
    250     GET_CTX_RET(NULL)
    251     static const GLubyte VENDOR[]  = "Google";
    252     static const GLubyte VERSION[] = "OpenGL ES-CM 1.1";
    253 
    254     switch(name) {
    255         case GL_VENDOR:
    256             return VENDOR;
    257         case GL_RENDERER:
    258             return (const GLubyte*)ctx->getRendererString();
    259         case GL_VERSION:
    260             return VERSION;
    261         case GL_EXTENSIONS:
    262             return (const GLubyte*)ctx->getExtensionString();
    263         default:
    264             RET_AND_SET_ERROR_IF(true,GL_INVALID_ENUM,NULL);
    265     }
    266 }
    267 
    268 GL_API void GL_APIENTRY  glActiveTexture( GLenum texture) {
    269     GET_CTX_CM()
    270     SET_ERROR_IF(!GLEScmValidate::textureEnum(texture,ctx->getMaxTexUnits()),GL_INVALID_ENUM);
    271     ctx->setActiveTexture(texture);
    272     ctx->dispatcher().glActiveTexture(texture);
    273 }
    274 
    275 GL_API void GL_APIENTRY  glAlphaFunc( GLenum func, GLclampf ref) {
    276     GET_CTX()
    277     SET_ERROR_IF(!GLEScmValidate::alphaFunc(func),GL_INVALID_ENUM);
    278     ctx->dispatcher().glAlphaFunc(func,ref);
    279 }
    280 
    281 
    282 GL_API void GL_APIENTRY  glAlphaFuncx( GLenum func, GLclampx ref) {
    283     GET_CTX()
    284     SET_ERROR_IF(!GLEScmValidate::alphaFunc(func),GL_INVALID_ENUM);
    285     ctx->dispatcher().glAlphaFunc(func,X2F(ref));
    286 }
    287 
    288 
    289 GL_API void GL_APIENTRY  glBindBuffer( GLenum target, GLuint buffer) {
    290     GET_CTX()
    291     SET_ERROR_IF(!GLEScmValidate::bufferTarget(target),GL_INVALID_ENUM);
    292 
    293     //if buffer wasn't generated before,generate one
    294     if(buffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(VERTEXBUFFER,buffer)){
    295         ctx->shareGroup()->genName(VERTEXBUFFER,buffer);
    296         ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
    297     }
    298     ctx->bindBuffer(target,buffer);
    299     if (buffer) {
    300         GLESbuffer* vbo = (GLESbuffer*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).Ptr();
    301         vbo->setBinded();
    302     }
    303 }
    304 
    305 
    306 GL_API void GL_APIENTRY  glBindTexture( GLenum target, GLuint texture) {
    307     GET_CTX()
    308     SET_ERROR_IF(!GLEScmValidate::textureTarget(target),GL_INVALID_ENUM)
    309 
    310     //for handling default texture (0)
    311     ObjectLocalName localTexName = TextureLocalName(target,texture);
    312 
    313     GLuint globalTextureName = localTexName;
    314     if(ctx->shareGroup().Ptr()){
    315         globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
    316         //if texture wasn't generated before,generate one
    317         if(!globalTextureName){
    318             ctx->shareGroup()->genName(TEXTURE,localTexName);
    319             globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
    320         }
    321 
    322         TextureData* texData = getTextureData(localTexName);
    323         if (texData->target==0)
    324             texData->target = target;
    325         //if texture was already bound to another target
    326         SET_ERROR_IF(ctx->GLTextureTargetToLocal(texData->target) != ctx->GLTextureTargetToLocal(target), GL_INVALID_OPERATION);
    327         texData->wasBound = true;
    328     }
    329 
    330     ctx->setBindedTexture(target,texture);
    331     ctx->dispatcher().glBindTexture(target,globalTextureName);
    332 }
    333 
    334 GL_API void GL_APIENTRY  glBlendFunc( GLenum sfactor, GLenum dfactor) {
    335     GET_CTX()
    336     SET_ERROR_IF(!GLEScmValidate::blendSrc(sfactor) || !GLEScmValidate::blendDst(dfactor),GL_INVALID_ENUM)
    337     ctx->dispatcher().glBlendFunc(sfactor,dfactor);
    338 }
    339 
    340 GL_API void GL_APIENTRY  glBufferData( GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) {
    341     GET_CTX()
    342     SET_ERROR_IF(!GLEScmValidate::bufferTarget(target),GL_INVALID_ENUM);
    343     SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION);
    344     ctx->setBufferData(target,size,data,usage);
    345 }
    346 
    347 GL_API void GL_APIENTRY  glBufferSubData( GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data) {
    348     GET_CTX()
    349     SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION);
    350     SET_ERROR_IF(!GLEScmValidate::bufferTarget(target),GL_INVALID_ENUM);
    351     SET_ERROR_IF(!ctx->setBufferSubData(target,offset,size,data),GL_INVALID_VALUE);
    352 }
    353 
    354 GL_API void GL_APIENTRY  glClear( GLbitfield mask) {
    355     GET_CTX()
    356     ctx->drawValidate();
    357 
    358     ctx->dispatcher().glClear(mask);
    359 }
    360 
    361 GL_API void GL_APIENTRY  glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) {
    362     GET_CTX()
    363     ctx->dispatcher().glClearColor(red,green,blue,alpha);
    364 }
    365 
    366 GL_API void GL_APIENTRY  glClearColorx( GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha) {
    367     GET_CTX()
    368     ctx->dispatcher().glClearColor(X2F(red),X2F(green),X2F(blue),X2F(alpha));
    369 }
    370 
    371 
    372 GL_API void GL_APIENTRY  glClearDepthf( GLclampf depth) {
    373     GET_CTX()
    374     ctx->dispatcher().glClearDepth(depth);
    375 }
    376 
    377 GL_API void GL_APIENTRY  glClearDepthx( GLclampx depth) {
    378     GET_CTX()
    379     ctx->dispatcher().glClearDepth(X2F(depth));
    380 }
    381 
    382 GL_API void GL_APIENTRY  glClearStencil( GLint s) {
    383     GET_CTX()
    384     ctx->dispatcher().glClearStencil(s);
    385 }
    386 
    387 GL_API void GL_APIENTRY  glClientActiveTexture( GLenum texture) {
    388     GET_CTX_CM()
    389     SET_ERROR_IF(!GLEScmValidate::textureEnum(texture,ctx->getMaxTexUnits()),GL_INVALID_ENUM);
    390     ctx->setClientActiveTexture(texture);
    391     ctx->dispatcher().glClientActiveTexture(texture);
    392 
    393 }
    394 
    395 GL_API void GL_APIENTRY  glClipPlanef( GLenum plane, const GLfloat *equation) {
    396     GET_CTX()
    397     GLdouble tmpEquation[4];
    398 
    399     for(int i = 0; i < 4; i++) {
    400          tmpEquation[i] = static_cast<GLdouble>(equation[i]);
    401     }
    402     ctx->dispatcher().glClipPlane(plane,tmpEquation);
    403 }
    404 
    405 GL_API void GL_APIENTRY  glClipPlanex( GLenum plane, const GLfixed *equation) {
    406     GET_CTX()
    407     GLdouble tmpEquation[4];
    408     for(int i = 0; i < 4; i++) {
    409         tmpEquation[i] = X2D(equation[i]);
    410     }
    411     ctx->dispatcher().glClipPlane(plane,tmpEquation);
    412 }
    413 
    414 GL_API void GL_APIENTRY  glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
    415     GET_CTX()
    416     ctx->dispatcher().glColor4f(red,green,blue,alpha);
    417 }
    418 
    419 GL_API void GL_APIENTRY  glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) {
    420     GET_CTX()
    421     ctx->dispatcher().glColor4ub(red,green,blue,alpha);
    422 }
    423 
    424 GL_API void GL_APIENTRY  glColor4x( GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha) {
    425     GET_CTX()
    426     ctx->dispatcher().glColor4f(X2F(red),X2F(green),X2F(blue),X2F(alpha));
    427 }
    428 
    429 GL_API void GL_APIENTRY  glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
    430     GET_CTX()
    431     ctx->dispatcher().glColorMask(red,green,blue,alpha);
    432 }
    433 
    434 GL_API void GL_APIENTRY  glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
    435     GET_CTX()
    436     SET_ERROR_IF(!GLEScmValidate::colorPointerParams(size,stride),GL_INVALID_VALUE);
    437     SET_ERROR_IF(!GLEScmValidate::colorPointerType(type),GL_INVALID_ENUM);
    438     ctx->setPointer(GL_COLOR_ARRAY,size,type,stride,pointer);
    439 }
    440 
    441 GL_API void GL_APIENTRY  glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data) {
    442     GET_CTX_CM()
    443     SET_ERROR_IF(!GLEScmValidate::textureTargetEx(target),GL_INVALID_ENUM);
    444 
    445     doCompressedTexImage2D(ctx, target, level, internalformat,
    446                                 width, height, border,
    447                                 imageSize, data, (void*)glTexImage2D);
    448 }
    449 
    450 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) {
    451     GET_CTX_CM()
    452     SET_ERROR_IF(!(GLEScmValidate::texCompImgFrmt(format) && GLEScmValidate::textureTargetEx(target)),GL_INVALID_ENUM);
    453     SET_ERROR_IF(level < 0 || level > log2(ctx->getMaxTexSize()),GL_INVALID_VALUE)
    454 
    455     GLenum uncompressedFrmt;
    456     unsigned char* uncompressed = uncompressTexture(format,uncompressedFrmt,width,height,imageSize,data,level);
    457     ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,uncompressedFrmt,GL_UNSIGNED_BYTE,uncompressed);
    458     delete uncompressed;
    459 }
    460 
    461 GL_API void GL_APIENTRY  glCopyTexImage2D( GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) {
    462     GET_CTX()
    463     SET_ERROR_IF(!(GLEScmValidate::pixelFrmt(ctx,internalformat) && GLEScmValidate::textureTargetEx(target)),GL_INVALID_ENUM);
    464     SET_ERROR_IF(border != 0,GL_INVALID_VALUE);
    465     ctx->dispatcher().glCopyTexImage2D(target,level,internalformat,x,y,width,height,border);
    466 }
    467 
    468 GL_API void GL_APIENTRY  glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {
    469     GET_CTX()
    470     SET_ERROR_IF(!GLEScmValidate::textureTargetEx(target),GL_INVALID_ENUM);
    471     ctx->dispatcher().glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
    472 }
    473 
    474 GL_API void GL_APIENTRY  glCullFace( GLenum mode) {
    475     GET_CTX()
    476     ctx->dispatcher().glCullFace(mode);
    477 }
    478 
    479 GL_API void GL_APIENTRY  glDeleteBuffers( GLsizei n, const GLuint *buffers) {
    480     GET_CTX()
    481     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
    482     if(ctx->shareGroup().Ptr()) {
    483         for(int i=0; i < n; i++){
    484            ctx->shareGroup()->deleteName(VERTEXBUFFER,buffers[i]);
    485            ctx->unbindBuffer(buffers[i]);
    486         }
    487     }
    488 }
    489 
    490 GL_API void GL_APIENTRY  glDeleteTextures( GLsizei n, const GLuint *textures) {
    491     GET_CTX()
    492     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
    493     if(ctx->shareGroup().Ptr()) {
    494         for(int i=0; i < n; i++){
    495             if(textures[i] != 0)
    496             {
    497                 TextureData* tData = getTextureData(textures[i]);
    498                 // delete the underlying OpenGL texture but only if this
    499                 // texture is not a target of EGLImage.
    500                 if (!tData || tData->sourceEGLImage == 0) {
    501                     const GLuint globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,textures[i]);
    502                     ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
    503                 }
    504                 ctx->shareGroup()->deleteName(TEXTURE,textures[i]);
    505 
    506                 if(ctx->getBindedTexture(GL_TEXTURE_2D) == textures[i])
    507                     ctx->setBindedTexture(GL_TEXTURE_2D,0);
    508                 if (ctx->getBindedTexture(GL_TEXTURE_CUBE_MAP) == textures[i])
    509                     ctx->setBindedTexture(GL_TEXTURE_CUBE_MAP,0);
    510             }
    511         }
    512     }
    513 }
    514 
    515 GL_API void GL_APIENTRY  glDepthFunc( GLenum func) {
    516     GET_CTX()
    517     ctx->dispatcher().glDepthFunc(func);
    518 }
    519 
    520 GL_API void GL_APIENTRY  glDepthMask( GLboolean flag) {
    521     GET_CTX()
    522     ctx->dispatcher().glDepthMask(flag);
    523 }
    524 
    525 GL_API void GL_APIENTRY  glDepthRangef( GLclampf zNear, GLclampf zFar) {
    526     GET_CTX()
    527     ctx->dispatcher().glDepthRange(zNear,zFar);
    528 }
    529 
    530 GL_API void GL_APIENTRY  glDepthRangex( GLclampx zNear, GLclampx zFar) {
    531     GET_CTX()
    532     ctx->dispatcher().glDepthRange(X2F(zNear),X2F(zFar));
    533 }
    534 
    535 GL_API void GL_APIENTRY  glDisable( GLenum cap) {
    536     GET_CTX()
    537     if (cap==GL_TEXTURE_GEN_STR_OES) {
    538         ctx->dispatcher().glDisable(GL_TEXTURE_GEN_S);
    539         ctx->dispatcher().glDisable(GL_TEXTURE_GEN_T);
    540         ctx->dispatcher().glDisable(GL_TEXTURE_GEN_R);
    541     }
    542     else ctx->dispatcher().glDisable(cap);
    543     if (cap==GL_TEXTURE_2D || cap==GL_TEXTURE_CUBE_MAP_OES)
    544         ctx->setTextureEnabled(cap,false);
    545 }
    546 
    547 GL_API void GL_APIENTRY  glDisableClientState( GLenum array) {
    548     GET_CTX()
    549     SET_ERROR_IF(!GLEScmValidate::supportedArrays(array),GL_INVALID_ENUM)
    550 
    551     ctx->enableArr(array,false);
    552     if(array != GL_POINT_SIZE_ARRAY_OES) ctx->dispatcher().glDisableClientState(array);
    553 }
    554 
    555 
    556 GL_API void GL_APIENTRY  glDrawArrays( GLenum mode, GLint first, GLsizei count) {
    557     GET_CTX_CM()
    558     SET_ERROR_IF(count < 0,GL_INVALID_VALUE)
    559     SET_ERROR_IF(!GLEScmValidate::drawMode(mode),GL_INVALID_ENUM)
    560 
    561     ctx->drawValidate();
    562 
    563     if(!ctx->isArrEnabled(GL_VERTEX_ARRAY)) return;
    564 
    565     GLESConversionArrays tmpArrs;
    566     ctx->setupArraysPointers(tmpArrs,first,count,0,NULL,true);
    567     if(mode == GL_POINTS && ctx->isArrEnabled(GL_POINT_SIZE_ARRAY_OES)){
    568         ctx->drawPointsArrs(tmpArrs,first,count);
    569     }
    570     else
    571     {
    572         ctx->dispatcher().glDrawArrays(mode,first,count);
    573     }
    574 }
    575 
    576 GL_API void GL_APIENTRY  glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *elementsIndices) {
    577     GET_CTX_CM()
    578     SET_ERROR_IF(count < 0,GL_INVALID_VALUE)
    579     SET_ERROR_IF((!GLEScmValidate::drawMode(mode) || !GLEScmValidate::drawType(type)),GL_INVALID_ENUM)
    580     if(!ctx->isArrEnabled(GL_VERTEX_ARRAY)) return;
    581 
    582     ctx->drawValidate();
    583 
    584     const GLvoid* indices = elementsIndices;
    585     GLESConversionArrays tmpArrs;
    586     if(ctx->isBindedBuffer(GL_ELEMENT_ARRAY_BUFFER)) { // if vbo is binded take the indices from the vbo
    587         const unsigned char* buf = static_cast<unsigned char *>(ctx->getBindedBuffer(GL_ELEMENT_ARRAY_BUFFER));
    588         indices = buf+reinterpret_cast<uintptr_t>(elementsIndices);
    589     }
    590 
    591     ctx->setupArraysPointers(tmpArrs,0,count,type,indices,false);
    592     if(mode == GL_POINTS && ctx->isArrEnabled(GL_POINT_SIZE_ARRAY_OES)){
    593         ctx->drawPointsElems(tmpArrs,count,type,indices);
    594     }
    595     else{
    596         ctx->dispatcher().glDrawElements(mode,count,type,indices);
    597     }
    598 }
    599 
    600 GL_API void GL_APIENTRY  glEnable( GLenum cap) {
    601     GET_CTX()
    602     if (cap==GL_TEXTURE_GEN_STR_OES) {
    603         ctx->dispatcher().glEnable(GL_TEXTURE_GEN_S);
    604         ctx->dispatcher().glEnable(GL_TEXTURE_GEN_T);
    605         ctx->dispatcher().glEnable(GL_TEXTURE_GEN_R);
    606     }
    607     else
    608         ctx->dispatcher().glEnable(cap);
    609     if (cap==GL_TEXTURE_2D || cap==GL_TEXTURE_CUBE_MAP_OES)
    610         ctx->setTextureEnabled(cap,true);
    611 }
    612 
    613 GL_API void GL_APIENTRY  glEnableClientState( GLenum array) {
    614     GET_CTX()
    615     SET_ERROR_IF(!GLEScmValidate::supportedArrays(array),GL_INVALID_ENUM)
    616 
    617     ctx->enableArr(array,true);
    618     if(array != GL_POINT_SIZE_ARRAY_OES) ctx->dispatcher().glEnableClientState(array);
    619 }
    620 
    621 GL_API void GL_APIENTRY  glFinish( void) {
    622     GET_CTX()
    623     ctx->dispatcher().glFinish();
    624 }
    625 
    626 GL_API void GL_APIENTRY  glFlush( void) {
    627     GET_CTX()
    628     ctx->dispatcher().glFlush();
    629 }
    630 
    631 GL_API void GL_APIENTRY  glFogf( GLenum pname, GLfloat param) {
    632     GET_CTX()
    633     ctx->dispatcher().glFogf(pname,param);
    634 }
    635 
    636 GL_API void GL_APIENTRY  glFogfv( GLenum pname, const GLfloat *params) {
    637     GET_CTX()
    638     ctx->dispatcher().glFogfv(pname,params);
    639 }
    640 
    641 GL_API void GL_APIENTRY  glFogx( GLenum pname, GLfixed param) {
    642     GET_CTX()
    643     ctx->dispatcher().glFogf(pname,(pname == GL_FOG_MODE)? static_cast<GLfloat>(param):X2F(param));
    644 }
    645 
    646 GL_API void GL_APIENTRY  glFogxv( GLenum pname, const GLfixed *params) {
    647     GET_CTX()
    648     if(pname == GL_FOG_MODE) {
    649         GLfloat tmpParam = static_cast<GLfloat>(params[0]);
    650         ctx->dispatcher().glFogfv(pname,&tmpParam);
    651     } else {
    652         GLfloat tmpParams[4];
    653         for(int i=0; i< 4; i++) {
    654             tmpParams[i] = X2F(params[i]);
    655         }
    656         ctx->dispatcher().glFogfv(pname,tmpParams);
    657     }
    658 
    659 }
    660 
    661 GL_API void GL_APIENTRY  glFrontFace( GLenum mode) {
    662     GET_CTX()
    663     ctx->dispatcher().glFrontFace(mode);
    664 }
    665 
    666 GL_API void GL_APIENTRY  glFrustumf( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
    667     GET_CTX()
    668     ctx->dispatcher().glFrustum(left,right,bottom,top,zNear,zFar);
    669 }
    670 
    671 GL_API void GL_APIENTRY  glFrustumx( GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
    672     GET_CTX()
    673     ctx->dispatcher().glFrustum(X2F(left),X2F(right),X2F(bottom),X2F(top),X2F(zNear),X2F(zFar));
    674 }
    675 
    676 GL_API void GL_APIENTRY  glGenBuffers( GLsizei n, GLuint *buffers) {
    677     GET_CTX()
    678     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
    679     if(ctx->shareGroup().Ptr()) {
    680         for(int i=0; i<n ;i++) {
    681             buffers[i] = ctx->shareGroup()->genName(VERTEXBUFFER, 0, true);
    682             //generating vbo object related to this buffer name
    683             ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
    684         }
    685     }
    686 }
    687 
    688 GL_API void GL_APIENTRY  glGenTextures( GLsizei n, GLuint *textures) {
    689     GET_CTX();
    690     if(ctx->shareGroup().Ptr()) {
    691         for(int i=0; i<n ;i++) {
    692             textures[i] = ctx->shareGroup()->genName(TEXTURE, 0, true);
    693         }
    694     }
    695 }
    696 
    697 GL_API void GL_APIENTRY  glGetBooleanv( GLenum pname, GLboolean *params) {
    698     GET_CTX()
    699 
    700     if(ctx->glGetBooleanv(pname, params))
    701     {
    702         return;
    703     }
    704 
    705     GLint i;
    706 
    707     switch(pname)
    708     {
    709     case GL_FRAMEBUFFER_BINDING_OES:
    710     case GL_RENDERBUFFER_BINDING_OES:
    711         {
    712             GLint name;
    713             glGetIntegerv(pname,&name);
    714             *params = name!=0 ? GL_TRUE: GL_FALSE;
    715         }
    716     break;
    717     case GL_TEXTURE_GEN_STR_OES:
    718         {
    719             GLboolean state_s = GL_FALSE;
    720             GLboolean state_t = GL_FALSE;
    721             GLboolean state_r = GL_FALSE;
    722             ctx->dispatcher().glGetBooleanv(GL_TEXTURE_GEN_S,&state_s);
    723             ctx->dispatcher().glGetBooleanv(GL_TEXTURE_GEN_T,&state_t);
    724             ctx->dispatcher().glGetBooleanv(GL_TEXTURE_GEN_R,&state_r);
    725             *params = state_s && state_t && state_r ? GL_TRUE: GL_FALSE;
    726         }
    727     break;
    728     case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
    729         *params = (GLboolean)getCompressedFormats(NULL);
    730     break;
    731     case GL_COMPRESSED_TEXTURE_FORMATS:
    732         {
    733             int nparams = getCompressedFormats(NULL);
    734             if (nparams>0) {
    735                 int * iparams = new int[nparams];
    736                 getCompressedFormats(iparams);
    737                 for (int i=0; i<nparams; i++) params[i] = (GLboolean)iparams[i];
    738                 delete [] iparams;
    739             }
    740         }
    741     break;
    742     default:
    743         ctx->dispatcher().glGetBooleanv(pname,params);
    744     }
    745 }
    746 
    747 GL_API void GL_APIENTRY  glGetBufferParameteriv( GLenum target, GLenum pname, GLint *params) {
    748     GET_CTX()
    749     SET_ERROR_IF(!(GLEScmValidate::bufferTarget(target) && GLEScmValidate::bufferParam(pname)),GL_INVALID_ENUM);
    750     SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION);
    751     bool ret = true;
    752     switch(pname) {
    753     case GL_BUFFER_SIZE:
    754         ctx->getBufferSize(target,params);
    755         break;
    756     case GL_BUFFER_USAGE:
    757         ctx->getBufferUsage(target,params);
    758         break;
    759     }
    760 
    761 }
    762 
    763 GL_API void GL_APIENTRY  glGetClipPlanef( GLenum pname, GLfloat eqn[4]) {
    764     GET_CTX()
    765     GLdouble tmpEqn[4];
    766 
    767     ctx->dispatcher().glGetClipPlane(pname,tmpEqn);
    768     for(int i =0 ;i < 4; i++){
    769         eqn[i] = static_cast<GLfloat>(tmpEqn[i]);
    770     }
    771 }
    772 
    773 GL_API void GL_APIENTRY  glGetClipPlanex( GLenum pname, GLfixed eqn[4]) {
    774     GET_CTX()
    775     GLdouble tmpEqn[4];
    776 
    777     ctx->dispatcher().glGetClipPlane(pname,tmpEqn);
    778     for(int i =0 ;i < 4; i++){
    779         eqn[i] = F2X(tmpEqn[i]);
    780     }
    781 }
    782 
    783 GL_API void GL_APIENTRY  glGetFixedv( GLenum pname, GLfixed *params) {
    784     GET_CTX()
    785 
    786     if(ctx->glGetFixedv(pname, params))
    787     {
    788         return;
    789     }
    790 
    791     size_t nParams = glParamSize(pname);
    792     GLfloat fParams[16];
    793     GLint i;
    794 
    795     switch(pname)
    796     {
    797     case GL_FRAMEBUFFER_BINDING_OES:
    798     case GL_RENDERBUFFER_BINDING_OES:
    799     case GL_TEXTURE_GEN_STR_OES:
    800         glGetFloatv(pname,&fParams[0]);
    801         break;
    802     case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
    803         *params = I2X(getCompressedFormats(NULL));
    804         return;
    805     break;
    806     case GL_COMPRESSED_TEXTURE_FORMATS:
    807         {
    808             int nparams = getCompressedFormats(NULL);
    809             if (nparams>0) {
    810                 int * iparams = new int[nparams];
    811                 getCompressedFormats(iparams);
    812                 for (int i=0; i<nparams; i++) params[i] = I2X(iparams[i]);
    813                 delete [] iparams;
    814             }
    815             return;
    816         }
    817     break;
    818     default:
    819         ctx->dispatcher().glGetFloatv(pname,fParams);
    820     }
    821 
    822     if (nParams)
    823     {
    824         for(size_t i =0 ; i < nParams;i++) {
    825             params[i] = F2X(fParams[i]);
    826         }
    827     }
    828 }
    829 
    830 GL_API void GL_APIENTRY  glGetFloatv( GLenum pname, GLfloat *params) {
    831     GET_CTX()
    832 
    833     if(ctx->glGetFloatv(pname, params))
    834     {
    835         return;
    836     }
    837 
    838     GLint i;
    839 
    840     switch (pname) {
    841     case GL_FRAMEBUFFER_BINDING_OES:
    842     case GL_RENDERBUFFER_BINDING_OES:
    843     case GL_TEXTURE_GEN_STR_OES:
    844         glGetIntegerv(pname,&i);
    845         *params = (GLfloat)i;
    846     break;
    847     case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
    848         *params = (GLfloat)getCompressedFormats(NULL);
    849     break;
    850     case GL_COMPRESSED_TEXTURE_FORMATS:
    851         {
    852             int nparams = getCompressedFormats(NULL);
    853             if (nparams>0) {
    854                 int * iparams = new int[nparams];
    855                 getCompressedFormats(iparams);
    856                 for (int i=0; i<nparams; i++) params[i] = (GLfloat)iparams[i];
    857                 delete [] iparams;
    858             }
    859         }
    860     break;
    861     default:
    862         ctx->dispatcher().glGetFloatv(pname,params);
    863     }
    864 }
    865 
    866 GL_API void GL_APIENTRY  glGetIntegerv( GLenum pname, GLint *params) {
    867     GET_CTX()
    868 
    869     if(ctx->glGetIntegerv(pname, params))
    870     {
    871         return;
    872     }
    873 
    874     GLint i;
    875     GLfloat f;
    876 
    877     switch(pname)
    878     {
    879     case GL_TEXTURE_GEN_STR_OES:
    880         ctx->dispatcher().glGetIntegerv(GL_TEXTURE_GEN_S,&params[0]);
    881         break;
    882     case GL_FRAMEBUFFER_BINDING_OES:
    883         if (ctx->shareGroup().Ptr()) {
    884             ctx->dispatcher().glGetIntegerv(pname,&i);
    885             *params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i);
    886         }
    887         break;
    888     case GL_RENDERBUFFER_BINDING_OES:
    889         if (ctx->shareGroup().Ptr()) {
    890             ctx->dispatcher().glGetIntegerv(pname,&i);
    891             *params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i);
    892         }
    893         break;
    894     case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
    895         *params = getCompressedFormats(NULL);
    896         break;
    897     case GL_COMPRESSED_TEXTURE_FORMATS:
    898         getCompressedFormats(params);
    899         break;
    900     case GL_MAX_CLIP_PLANES:
    901         ctx->dispatcher().glGetIntegerv(pname,params);
    902         if(*params > 6)
    903         {
    904             // GLES spec requires only 6, and the ATI driver erronously
    905             // returns 8 (although it supports only 6). This WAR is simple,
    906             // compliant and good enough for developers.
    907             *params = 6;
    908         }
    909         break;
    910     case GL_ALPHA_TEST_REF:
    911         // Both the ATI and nVidia OpenGL drivers return the wrong answer
    912         // here. So return the right one.
    913         ctx->dispatcher().glGetFloatv(pname,&f);
    914         *params = (int)(f * (float)0x7fffffff);
    915         break;
    916     case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
    917         ctx->dispatcher().glGetIntegerv(pname,params);
    918         if(*params > 16)
    919         {
    920             // GLES spec requires only 2, and the ATI driver erronously
    921             // returns 32 (although it supports only 16). This WAR is simple,
    922             // compliant and good enough for developers.
    923             *params = 16;
    924         }
    925         break;
    926 
    927     default:
    928         ctx->dispatcher().glGetIntegerv(pname,params);
    929     }
    930 }
    931 
    932 GL_API void GL_APIENTRY  glGetLightfv( GLenum light, GLenum pname, GLfloat *params) {
    933     GET_CTX()
    934     ctx->dispatcher().glGetLightfv(light,pname,params);
    935 }
    936 
    937 GL_API void GL_APIENTRY  glGetLightxv( GLenum light, GLenum pname, GLfixed *params) {
    938     GET_CTX()
    939     GLfloat tmpParams[4];
    940 
    941     ctx->dispatcher().glGetLightfv(light,pname,tmpParams);
    942     switch (pname){
    943         case GL_AMBIENT:
    944         case GL_DIFFUSE:
    945         case GL_SPECULAR:
    946         case GL_POSITION:
    947             params[3] = F2X(tmpParams[3]);
    948         case GL_SPOT_DIRECTION:
    949             params[2] = F2X(tmpParams[2]);
    950         case GL_SPOT_EXPONENT:
    951         case GL_SPOT_CUTOFF:
    952         case GL_CONSTANT_ATTENUATION:
    953         case GL_LINEAR_ATTENUATION:
    954         case GL_QUADRATIC_ATTENUATION:
    955             params[1] = F2X(tmpParams[1]);
    956             break;
    957         default:{
    958             ctx->setGLerror(GL_INVALID_ENUM);
    959             return;
    960         }
    961 
    962     }
    963     params[0] = F2X(tmpParams[0]);
    964 }
    965 
    966 GL_API void GL_APIENTRY  glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params) {
    967     GET_CTX()
    968     ctx->dispatcher().glGetMaterialfv(face,pname,params);
    969 }
    970 
    971 GL_API void GL_APIENTRY  glGetMaterialxv( GLenum face, GLenum pname, GLfixed *params) {
    972     GET_CTX()
    973     GLfloat tmpParams[4];
    974     ctx->dispatcher().glGetMaterialfv(face,pname,tmpParams);
    975     switch(pname){
    976     case GL_AMBIENT:
    977     case GL_DIFFUSE:
    978     case GL_SPECULAR:
    979     case GL_EMISSION:
    980     case GL_AMBIENT_AND_DIFFUSE:
    981         params[3] = tmpParams[3];
    982         params[2] = tmpParams[2];
    983         params[1] = tmpParams[1];
    984     case GL_SHININESS:
    985         params[0] = tmpParams[0];
    986         break;
    987     default:{
    988             ctx->setGLerror(GL_INVALID_ENUM);
    989             return;
    990         }
    991     }
    992 }
    993 
    994 GL_API void GL_APIENTRY  glGetPointerv( GLenum pname, void **params) {
    995     GET_CTX()
    996     const GLESpointer* p = ctx->getPointer(pname);
    997     if(p) {
    998         if(p->isVBO())
    999         {
   1000             *params = (void*)(p->getBufferOffset());
   1001         }else{
   1002             *params = const_cast<void *>( p->getArrayData());
   1003         }
   1004     } else {
   1005         ctx->setGLerror(GL_INVALID_ENUM);
   1006     }
   1007 
   1008 }
   1009 
   1010 GL_API void GL_APIENTRY  glGetTexEnvfv( GLenum env, GLenum pname, GLfloat *params) {
   1011     GET_CTX()
   1012     ctx->dispatcher().glGetTexEnvfv(env,pname,params);
   1013 }
   1014 
   1015 GL_API void GL_APIENTRY  glGetTexEnviv( GLenum env, GLenum pname, GLint *params) {
   1016     GET_CTX()
   1017     ctx->dispatcher().glGetTexEnviv(env,pname,params);
   1018 }
   1019 
   1020 GL_API void GL_APIENTRY  glGetTexEnvxv( GLenum env, GLenum pname, GLfixed *params) {
   1021     GET_CTX()
   1022     GLfloat tmpParams[4];
   1023 
   1024     ctx->dispatcher().glGetTexEnvfv(env,pname,tmpParams);
   1025     if(pname == GL_TEXTURE_ENV_MODE) {
   1026         params[0] = static_cast<GLfixed>(tmpParams[0]);
   1027     } else {
   1028         for(int i=0 ; i < 4 ; i++)
   1029             params[i] = F2X(tmpParams[i]);
   1030     }
   1031 }
   1032 
   1033 GL_API void GL_APIENTRY  glGetTexParameterfv( GLenum target, GLenum pname, GLfloat *params) {
   1034     GET_CTX()
   1035    if (pname==GL_TEXTURE_CROP_RECT_OES) {
   1036       TextureData *texData = getTextureTargetData(target);
   1037       SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1038       for (int i=0;i<4;++i)
   1039         params[i] = texData->crop_rect[i];
   1040     }
   1041     else {
   1042       ctx->dispatcher().glGetTexParameterfv(target,pname,params);
   1043     }
   1044 }
   1045 
   1046 GL_API void GL_APIENTRY  glGetTexParameteriv( GLenum target, GLenum pname, GLint *params) {
   1047     GET_CTX()
   1048     if (pname==GL_TEXTURE_CROP_RECT_OES) {
   1049       TextureData *texData = getTextureTargetData(target);
   1050       SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1051       for (int i=0;i<4;++i)
   1052         params[i] = texData->crop_rect[i];
   1053     }
   1054     else {
   1055       ctx->dispatcher().glGetTexParameteriv(target,pname,params);
   1056     }
   1057 }
   1058 
   1059 GL_API void GL_APIENTRY  glGetTexParameterxv( GLenum target, GLenum pname, GLfixed *params) {
   1060     GET_CTX()
   1061     if (pname==GL_TEXTURE_CROP_RECT_OES) {
   1062       TextureData *texData = getTextureTargetData(target);
   1063       SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1064       for (int i=0;i<4;++i)
   1065         params[i] = F2X(texData->crop_rect[i]);
   1066     }
   1067     else {
   1068       GLfloat tmpParam;
   1069       ctx->dispatcher().glGetTexParameterfv(target,pname,&tmpParam);
   1070       params[0] = static_cast<GLfixed>(tmpParam);
   1071     }
   1072 }
   1073 
   1074 GL_API void GL_APIENTRY  glHint( GLenum target, GLenum mode) {
   1075     GET_CTX()
   1076     SET_ERROR_IF(!GLEScmValidate::hintTargetMode(target,mode),GL_INVALID_ENUM);
   1077     ctx->dispatcher().glHint(target,mode);
   1078 }
   1079 
   1080 GL_API void GL_APIENTRY  glLightModelf( GLenum pname, GLfloat param) {
   1081     GET_CTX()
   1082     ctx->dispatcher().glLightModelf(pname,param);
   1083 }
   1084 
   1085 GL_API void GL_APIENTRY  glLightModelfv( GLenum pname, const GLfloat *params) {
   1086     GET_CTX()
   1087     ctx->dispatcher().glLightModelfv(pname,params);
   1088 }
   1089 
   1090 GL_API void GL_APIENTRY  glLightModelx( GLenum pname, GLfixed param) {
   1091     GET_CTX()
   1092     GLfloat tmpParam = static_cast<GLfloat>(param);
   1093     ctx->dispatcher().glLightModelf(pname,tmpParam);
   1094 }
   1095 
   1096 GL_API void GL_APIENTRY  glLightModelxv( GLenum pname, const GLfixed *params) {
   1097     GET_CTX()
   1098     GLfloat tmpParams[4];
   1099     if(pname == GL_LIGHT_MODEL_TWO_SIDE) {
   1100         tmpParams[0] = X2F(params[0]);
   1101     } else if (pname == GL_LIGHT_MODEL_AMBIENT) {
   1102         for(int i=0;i<4;i++) {
   1103             tmpParams[i] = X2F(params[i]);
   1104         }
   1105     }
   1106 
   1107     ctx->dispatcher().glLightModelfv(pname,tmpParams);
   1108 }
   1109 
   1110 GL_API void GL_APIENTRY  glLightf( GLenum light, GLenum pname, GLfloat param) {
   1111     GET_CTX()
   1112     ctx->dispatcher().glLightf(light,pname,param);
   1113 }
   1114 
   1115 GL_API void GL_APIENTRY  glLightfv( GLenum light, GLenum pname, const GLfloat *params) {
   1116     GET_CTX()
   1117     ctx->dispatcher().glLightfv(light,pname,params);
   1118 }
   1119 
   1120 GL_API void GL_APIENTRY  glLightx( GLenum light, GLenum pname, GLfixed param) {
   1121     GET_CTX()
   1122     ctx->dispatcher().glLightf(light,pname,X2F(param));
   1123 }
   1124 
   1125 GL_API void GL_APIENTRY  glLightxv( GLenum light, GLenum pname, const GLfixed *params) {
   1126     GET_CTX()
   1127     GLfloat tmpParams[4];
   1128 
   1129     switch (pname) {
   1130         case GL_AMBIENT:
   1131         case GL_DIFFUSE:
   1132         case GL_SPECULAR:
   1133         case GL_EMISSION:
   1134         case GL_POSITION:
   1135             tmpParams[3] = X2F(params[3]);
   1136         case GL_SPOT_DIRECTION:
   1137             tmpParams[2] = X2F(params[2]);
   1138             tmpParams[1] = X2F(params[1]);
   1139         case GL_SPOT_EXPONENT:
   1140         case GL_SPOT_CUTOFF:
   1141         case GL_CONSTANT_ATTENUATION:
   1142         case GL_LINEAR_ATTENUATION:
   1143         case GL_QUADRATIC_ATTENUATION:
   1144             tmpParams[0] = X2F(params[0]);
   1145             break;
   1146         default: {
   1147                 ctx->setGLerror(GL_INVALID_ENUM);
   1148                 return;
   1149             }
   1150     }
   1151     ctx->dispatcher().glLightfv(light,pname,tmpParams);
   1152 }
   1153 
   1154 GL_API void GL_APIENTRY  glLineWidth( GLfloat width) {
   1155     GET_CTX()
   1156     ctx->dispatcher().glLineWidth(width);
   1157 }
   1158 
   1159 GL_API void GL_APIENTRY  glLineWidthx( GLfixed width) {
   1160     GET_CTX()
   1161     ctx->dispatcher().glLineWidth(X2F(width));
   1162 }
   1163 
   1164 GL_API void GL_APIENTRY  glLoadIdentity( void) {
   1165     GET_CTX()
   1166     ctx->dispatcher().glLoadIdentity();
   1167 }
   1168 
   1169 GL_API void GL_APIENTRY  glLoadMatrixf( const GLfloat *m) {
   1170     GET_CTX()
   1171     ctx->dispatcher().glLoadMatrixf(m);
   1172 }
   1173 
   1174 GL_API void GL_APIENTRY  glLoadMatrixx( const GLfixed *m) {
   1175     GET_CTX()
   1176     GLfloat mat[16];
   1177     for(int i=0; i< 16 ; i++) {
   1178         mat[i] = X2F(m[i]);
   1179     }
   1180     ctx->dispatcher().glLoadMatrixf(mat);
   1181 }
   1182 
   1183 GL_API void GL_APIENTRY  glLogicOp( GLenum opcode) {
   1184     GET_CTX()
   1185     ctx->dispatcher().glLogicOp(opcode);
   1186 }
   1187 
   1188 GL_API void GL_APIENTRY  glMaterialf( GLenum face, GLenum pname, GLfloat param) {
   1189     GET_CTX()
   1190     ctx->dispatcher().glMaterialf(face,pname,param);
   1191 }
   1192 
   1193 GL_API void GL_APIENTRY  glMaterialfv( GLenum face, GLenum pname, const GLfloat *params) {
   1194     GET_CTX()
   1195     ctx->dispatcher().glMaterialfv(face,pname,params);
   1196 }
   1197 
   1198 GL_API void GL_APIENTRY  glMaterialx( GLenum face, GLenum pname, GLfixed param) {
   1199     GET_CTX()
   1200     ctx->dispatcher().glMaterialf(face,pname,X2F(param));
   1201 }
   1202 
   1203 GL_API void GL_APIENTRY  glMaterialxv( GLenum face, GLenum pname, const GLfixed *params) {
   1204     GET_CTX()
   1205     GLfloat tmpParams[4];
   1206 
   1207     for(int i=0; i< 4; i++) {
   1208         tmpParams[i] = X2F(params[i]);
   1209     }
   1210     ctx->dispatcher().glMaterialfv(face,pname,tmpParams);
   1211 }
   1212 
   1213 GL_API void GL_APIENTRY  glMatrixMode( GLenum mode) {
   1214     GET_CTX()
   1215     ctx->dispatcher().glMatrixMode(mode);
   1216 }
   1217 
   1218 GL_API void GL_APIENTRY  glMultMatrixf( const GLfloat *m) {
   1219     GET_CTX()
   1220     ctx->dispatcher().glMultMatrixf(m);
   1221 }
   1222 
   1223 GL_API void GL_APIENTRY  glMultMatrixx( const GLfixed *m) {
   1224     GET_CTX()
   1225     GLfloat mat[16];
   1226     for(int i=0; i< 16 ; i++) {
   1227         mat[i] = X2F(m[i]);
   1228     }
   1229     ctx->dispatcher().glMultMatrixf(mat);
   1230 }
   1231 
   1232 GL_API void GL_APIENTRY  glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q) {
   1233     GET_CTX_CM()
   1234     SET_ERROR_IF(!GLEScmValidate::textureEnum(target,ctx->getMaxTexUnits()),GL_INVALID_ENUM);
   1235     ctx->dispatcher().glMultiTexCoord4f(target,s,t,r,q);
   1236 }
   1237 
   1238 GL_API void GL_APIENTRY  glMultiTexCoord4x( GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q) {
   1239     GET_CTX_CM()
   1240     SET_ERROR_IF(!GLEScmValidate::textureEnum(target,ctx->getMaxTexUnits()),GL_INVALID_ENUM);
   1241     ctx->dispatcher().glMultiTexCoord4f(target,X2F(s),X2F(t),X2F(r),X2F(q));
   1242 }
   1243 
   1244 GL_API void GL_APIENTRY  glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz) {
   1245     GET_CTX()
   1246     ctx->dispatcher().glNormal3f(nx,ny,nz);
   1247 }
   1248 
   1249 GL_API void GL_APIENTRY  glNormal3x( GLfixed nx, GLfixed ny, GLfixed nz) {
   1250     GET_CTX()
   1251     ctx->dispatcher().glNormal3f(X2F(nx),X2F(ny),X2F(nz));
   1252 }
   1253 
   1254 GL_API void GL_APIENTRY  glNormalPointer( GLenum type, GLsizei stride, const GLvoid *pointer) {
   1255     GET_CTX()
   1256     SET_ERROR_IF(stride < 0,GL_INVALID_VALUE);
   1257     SET_ERROR_IF(!GLEScmValidate::normalPointerType(type),GL_INVALID_ENUM);
   1258     ctx->setPointer(GL_NORMAL_ARRAY,3,type,stride,pointer);//3 normal verctor
   1259 }
   1260 
   1261 GL_API void GL_APIENTRY  glOrthof( GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar) {
   1262     GET_CTX()
   1263     ctx->dispatcher().glOrtho(left,right,bottom,top,zNear,zFar);
   1264 }
   1265 
   1266 GL_API void GL_APIENTRY  glOrthox( GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar) {
   1267     GET_CTX()
   1268     ctx->dispatcher().glOrtho(X2F(left),X2F(right),X2F(bottom),X2F(top),X2F(zNear),X2F(zFar));
   1269 }
   1270 
   1271 GL_API void GL_APIENTRY  glPixelStorei( GLenum pname, GLint param) {
   1272     GET_CTX()
   1273     SET_ERROR_IF(!(pname == GL_PACK_ALIGNMENT || pname == GL_UNPACK_ALIGNMENT),GL_INVALID_ENUM);
   1274     SET_ERROR_IF(!((param==1)||(param==2)||(param==4)||(param==8)), GL_INVALID_VALUE);
   1275     ctx->setUnpackAlignment(param);
   1276     ctx->dispatcher().glPixelStorei(pname,param);
   1277 }
   1278 
   1279 GL_API void GL_APIENTRY  glPointParameterf( GLenum pname, GLfloat param) {
   1280     GET_CTX()
   1281     ctx->dispatcher().glPointParameterf(pname,param);
   1282 }
   1283 
   1284 GL_API void GL_APIENTRY  glPointParameterfv( GLenum pname, const GLfloat *params) {
   1285     GET_CTX()
   1286     ctx->dispatcher().glPointParameterfv(pname,params);
   1287 }
   1288 
   1289 GL_API void GL_APIENTRY  glPointParameterx( GLenum pname, GLfixed param)
   1290 {
   1291     GET_CTX()
   1292     ctx->dispatcher().glPointParameterf(pname,X2F(param));
   1293 }
   1294 
   1295 GL_API void GL_APIENTRY  glPointParameterxv( GLenum pname, const GLfixed *params) {
   1296     GET_CTX()
   1297 
   1298     GLfloat tmpParam = X2F(*params) ;
   1299     ctx->dispatcher().glPointParameterfv(pname,&tmpParam);
   1300 }
   1301 
   1302 GL_API void GL_APIENTRY  glPointSize( GLfloat size) {
   1303     GET_CTX()
   1304     ctx->dispatcher().glPointSize(size);
   1305 }
   1306 
   1307 GL_API void GL_APIENTRY  glPointSizePointerOES( GLenum type, GLsizei stride, const GLvoid *pointer) {
   1308     GET_CTX()
   1309     SET_ERROR_IF(stride < 0,GL_INVALID_VALUE);
   1310     SET_ERROR_IF(!GLEScmValidate::pointPointerType(type),GL_INVALID_ENUM);
   1311     ctx->setPointer(GL_POINT_SIZE_ARRAY_OES,1,type,stride,pointer);
   1312 }
   1313 
   1314 GL_API void GL_APIENTRY  glPointSizex( GLfixed size) {
   1315     GET_CTX()
   1316     ctx->dispatcher().glPointSize(X2F(size));
   1317 }
   1318 
   1319 GL_API void GL_APIENTRY  glPolygonOffset( GLfloat factor, GLfloat units) {
   1320     GET_CTX()
   1321     ctx->dispatcher().glPolygonOffset(factor,units);
   1322 }
   1323 
   1324 GL_API void GL_APIENTRY  glPolygonOffsetx( GLfixed factor, GLfixed units) {
   1325     GET_CTX()
   1326     ctx->dispatcher().glPolygonOffset(X2F(factor),X2F(units));
   1327 }
   1328 
   1329 GL_API void GL_APIENTRY  glPopMatrix(void) {
   1330     GET_CTX()
   1331     ctx->dispatcher().glPopMatrix();
   1332 }
   1333 
   1334 GL_API void GL_APIENTRY  glPushMatrix(void) {
   1335     GET_CTX()
   1336     ctx->dispatcher().glPushMatrix();
   1337 }
   1338 
   1339 GL_API void GL_APIENTRY  glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels) {
   1340     GET_CTX()
   1341     SET_ERROR_IF(!(GLEScmValidate::pixelFrmt(ctx,format) && GLEScmValidate::pixelType(ctx,type)),GL_INVALID_ENUM);
   1342     SET_ERROR_IF(!(GLEScmValidate::pixelOp(format,type)),GL_INVALID_OPERATION);
   1343 
   1344     ctx->dispatcher().glReadPixels(x,y,width,height,format,type,pixels);
   1345 }
   1346 
   1347 GL_API void GL_APIENTRY  glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z) {
   1348     GET_CTX()
   1349     ctx->dispatcher().glRotatef(angle,x,y,z);
   1350 }
   1351 
   1352 GL_API void GL_APIENTRY  glRotatex( GLfixed angle, GLfixed x, GLfixed y, GLfixed z) {
   1353     GET_CTX()
   1354     ctx->dispatcher().glRotatef(angle,X2F(x),X2F(y),X2F(z));
   1355 }
   1356 
   1357 GL_API void GL_APIENTRY  glSampleCoverage( GLclampf value, GLboolean invert) {
   1358     GET_CTX()
   1359     ctx->dispatcher().glSampleCoverage(value,invert);
   1360 }
   1361 
   1362 GL_API void GL_APIENTRY  glSampleCoveragex( GLclampx value, GLboolean invert) {
   1363     GET_CTX()
   1364     ctx->dispatcher().glSampleCoverage(X2F(value),invert);
   1365 }
   1366 
   1367 GL_API void GL_APIENTRY  glScalef( GLfloat x, GLfloat y, GLfloat z) {
   1368     GET_CTX()
   1369     ctx->dispatcher().glScalef(x,y,z);
   1370 }
   1371 
   1372 GL_API void GL_APIENTRY  glScalex( GLfixed x, GLfixed y, GLfixed z) {
   1373     GET_CTX()
   1374     ctx->dispatcher().glScalef(X2F(x),X2F(y),X2F(z));
   1375 }
   1376 
   1377 GL_API void GL_APIENTRY  glScissor( GLint x, GLint y, GLsizei width, GLsizei height) {
   1378     GET_CTX()
   1379     ctx->dispatcher().glScissor(x,y,width,height);
   1380 }
   1381 
   1382 GL_API void GL_APIENTRY  glShadeModel( GLenum mode) {
   1383     GET_CTX()
   1384     ctx->dispatcher().glShadeModel(mode);
   1385 }
   1386 
   1387 GL_API void GL_APIENTRY  glStencilFunc( GLenum func, GLint ref, GLuint mask) {
   1388     GET_CTX()
   1389     ctx->dispatcher().glStencilFunc(func,ref,mask);
   1390 }
   1391 
   1392 GL_API void GL_APIENTRY  glStencilMask( GLuint mask) {
   1393     GET_CTX()
   1394     ctx->dispatcher().glStencilMask(mask);
   1395 }
   1396 
   1397 GL_API void GL_APIENTRY  glStencilOp( GLenum fail, GLenum zfail, GLenum zpass) {
   1398     GET_CTX()
   1399     SET_ERROR_IF(!(GLEScmValidate::stencilOp(fail) && GLEScmValidate::stencilOp(zfail) && GLEScmValidate::stencilOp(zpass)),GL_INVALID_ENUM);
   1400     ctx->dispatcher().glStencilOp(fail,zfail,zpass);
   1401 }
   1402 
   1403 GL_API void GL_APIENTRY  glTexCoordPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
   1404     GET_CTX()
   1405     SET_ERROR_IF(!GLEScmValidate::texCoordPointerParams(size,stride),GL_INVALID_VALUE);
   1406     SET_ERROR_IF(!GLEScmValidate::texCoordPointerType(type),GL_INVALID_ENUM);
   1407     ctx->setPointer(GL_TEXTURE_COORD_ARRAY,size,type,stride,pointer);
   1408 }
   1409 
   1410 GL_API void GL_APIENTRY  glTexEnvf( GLenum target, GLenum pname, GLfloat param) {
   1411     GET_CTX()
   1412     SET_ERROR_IF(!GLEScmValidate::texEnv(target,pname),GL_INVALID_ENUM);
   1413     ctx->dispatcher().glTexEnvf(target,pname,param);
   1414 }
   1415 
   1416 GL_API void GL_APIENTRY  glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params) {
   1417     GET_CTX()
   1418     SET_ERROR_IF(!GLEScmValidate::texEnv(target,pname),GL_INVALID_ENUM);
   1419     ctx->dispatcher().glTexEnvfv(target,pname,params);
   1420 }
   1421 
   1422 GL_API void GL_APIENTRY  glTexEnvi( GLenum target, GLenum pname, GLint param) {
   1423     GET_CTX()
   1424     SET_ERROR_IF(!GLEScmValidate::texEnv(target,pname),GL_INVALID_ENUM);
   1425     ctx->dispatcher().glTexEnvi(target,pname,param);
   1426 }
   1427 
   1428 GL_API void GL_APIENTRY  glTexEnviv( GLenum target, GLenum pname, const GLint *params) {
   1429     GET_CTX()
   1430     SET_ERROR_IF(!GLEScmValidate::texEnv(target,pname),GL_INVALID_ENUM);
   1431     ctx->dispatcher().glTexEnviv(target,pname,params);
   1432 }
   1433 
   1434 GL_API void GL_APIENTRY  glTexEnvx( GLenum target, GLenum pname, GLfixed param) {
   1435     GET_CTX()
   1436     SET_ERROR_IF(!GLEScmValidate::texEnv(target,pname),GL_INVALID_ENUM);
   1437     GLfloat tmpParam = static_cast<GLfloat>(param);
   1438     ctx->dispatcher().glTexEnvf(target,pname,tmpParam);
   1439 }
   1440 
   1441 GL_API void GL_APIENTRY  glTexEnvxv( GLenum target, GLenum pname, const GLfixed *params) {
   1442     GET_CTX()
   1443     SET_ERROR_IF(!GLEScmValidate::texEnv(target,pname),GL_INVALID_ENUM);
   1444 
   1445     GLfloat tmpParams[4];
   1446     if(pname == GL_TEXTURE_ENV_COLOR) {
   1447         for(int i =0;i<4;i++) {
   1448             tmpParams[i] = X2F(params[i]);
   1449         }
   1450     } else {
   1451         tmpParams[0] = static_cast<GLfloat>(params[0]);
   1452     }
   1453     ctx->dispatcher().glTexEnvfv(target,pname,tmpParams);
   1454 }
   1455 
   1456 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) {
   1457     GET_CTX()
   1458 
   1459     SET_ERROR_IF(!(GLEScmValidate::textureTargetEx(target) &&
   1460                      GLEScmValidate::pixelFrmt(ctx,internalformat) &&
   1461                      GLEScmValidate::pixelFrmt(ctx,format) &&
   1462                      GLEScmValidate::pixelType(ctx,type)),GL_INVALID_ENUM);
   1463 
   1464     SET_ERROR_IF(!(GLEScmValidate::pixelOp(format,type) && internalformat == ((GLint)format)),GL_INVALID_OPERATION);
   1465 
   1466     bool needAutoMipmap = false;
   1467 
   1468     if (ctx->shareGroup().Ptr()){
   1469         TextureData *texData = getTextureTargetData(target);
   1470         SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1471         if(texData) {
   1472             texData->width = width;
   1473             texData->height = height;
   1474             texData->border = border;
   1475             texData->internalFormat = internalformat;
   1476             texData->target = target;
   1477 
   1478             if (texData->sourceEGLImage != 0) {
   1479                 //
   1480                 // This texture was a target of EGLImage,
   1481                 // but now it is re-defined so we need to detach
   1482                 // from the EGLImage and re-generate global texture name
   1483                 // for it.
   1484                 //
   1485                 if (texData->eglImageDetach) {
   1486                     (*texData->eglImageDetach)(texData->sourceEGLImage);
   1487                 }
   1488                 unsigned int tex = ctx->getBindedTexture(target);
   1489                 ctx->shareGroup()->replaceGlobalName(TEXTURE,
   1490                                                      tex,
   1491                                                      texData->oldGlobal);
   1492                 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, texData->oldGlobal);
   1493                 texData->sourceEGLImage = 0;
   1494                 texData->oldGlobal = 0;
   1495             }
   1496 
   1497             needAutoMipmap = texData->requiresAutoMipmap;
   1498         }
   1499     }
   1500 
   1501     ctx->dispatcher().glTexImage2D(target,level,
   1502                                    internalformat,width,height,
   1503                                    border,format,type,pixels);
   1504 
   1505     if(needAutoMipmap)
   1506     {
   1507         ctx->dispatcher().glGenerateMipmapEXT(target);
   1508     }
   1509 }
   1510 
   1511 static bool handleMipmapGeneration(GLenum target, GLenum pname, bool param)
   1512 {
   1513     GET_CTX_RET(false)
   1514 
   1515     if(pname == GL_GENERATE_MIPMAP && !ctx->isAutoMipmapSupported())
   1516     {
   1517         TextureData *texData = getTextureTargetData(target);
   1518         if(texData)
   1519         {
   1520             texData->requiresAutoMipmap = param;
   1521         }
   1522         return true;
   1523     }
   1524 
   1525     return false;
   1526 }
   1527 
   1528 GL_API void GL_APIENTRY  glTexParameterf( GLenum target, GLenum pname, GLfloat param) {
   1529     GET_CTX()
   1530     SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
   1531 
   1532     if(handleMipmapGeneration(target, pname, (bool)param))
   1533         return;
   1534 
   1535     ctx->dispatcher().glTexParameterf(target,pname,param);
   1536 }
   1537 
   1538 GL_API void GL_APIENTRY  glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params) {
   1539     GET_CTX()
   1540     SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
   1541 
   1542     if(handleMipmapGeneration(target, pname, (bool)(*params)))
   1543         return;
   1544 
   1545     if (pname==GL_TEXTURE_CROP_RECT_OES) {
   1546         TextureData *texData = getTextureTargetData(target);
   1547         SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1548         for (int i=0;i<4;++i)
   1549             texData->crop_rect[i] = params[i];
   1550     }
   1551     else {
   1552         ctx->dispatcher().glTexParameterfv(target,pname,params);
   1553     }
   1554 }
   1555 
   1556 GL_API void GL_APIENTRY  glTexParameteri( GLenum target, GLenum pname, GLint param) {
   1557     GET_CTX()
   1558     SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
   1559 
   1560     if(handleMipmapGeneration(target, pname, (bool)param))
   1561         return;
   1562 
   1563     ctx->dispatcher().glTexParameteri(target,pname,param);
   1564 }
   1565 
   1566 GL_API void GL_APIENTRY  glTexParameteriv( GLenum target, GLenum pname, const GLint *params) {
   1567     GET_CTX()
   1568     SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
   1569 
   1570     if(handleMipmapGeneration(target, pname, (bool)(*params)))
   1571         return;
   1572 
   1573     if (pname==GL_TEXTURE_CROP_RECT_OES) {
   1574         TextureData *texData = getTextureTargetData(target);
   1575         SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1576         for (int i=0;i<4;++i)
   1577             texData->crop_rect[i] = params[i];
   1578     }
   1579     else {
   1580         ctx->dispatcher().glTexParameteriv(target,pname,params);
   1581     }
   1582 }
   1583 
   1584 GL_API void GL_APIENTRY  glTexParameterx( GLenum target, GLenum pname, GLfixed param) {
   1585     GET_CTX()
   1586     SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
   1587 
   1588     if(handleMipmapGeneration(target, pname, (bool)param))
   1589         return;
   1590 
   1591     ctx->dispatcher().glTexParameterf(target,pname,static_cast<GLfloat>(param));
   1592 }
   1593 
   1594 GL_API void GL_APIENTRY  glTexParameterxv( GLenum target, GLenum pname, const GLfixed *params) {
   1595     GET_CTX()
   1596     SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
   1597 
   1598     if(handleMipmapGeneration(target, pname, (bool)(*params)))
   1599         return;
   1600 
   1601     if (pname==GL_TEXTURE_CROP_RECT_OES) {
   1602         TextureData *texData = getTextureTargetData(target);
   1603         SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1604         for (int i=0;i<4;++i)
   1605             texData->crop_rect[i] = X2F(params[i]);
   1606     }
   1607     else {
   1608         GLfloat param = static_cast<GLfloat>(params[0]);
   1609         ctx->dispatcher().glTexParameterfv(target,pname,&param);
   1610     }
   1611 }
   1612 
   1613 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) {
   1614     GET_CTX()
   1615     SET_ERROR_IF(!(GLEScmValidate::textureTargetEx(target) &&
   1616                    GLEScmValidate::pixelFrmt(ctx,format)&&
   1617                    GLEScmValidate::pixelType(ctx,type)),GL_INVALID_ENUM);
   1618     SET_ERROR_IF(!GLEScmValidate::pixelOp(format,type),GL_INVALID_OPERATION);
   1619 
   1620     ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
   1621 
   1622     if (ctx->shareGroup().Ptr()){
   1623         TextureData *texData = getTextureTargetData(target);
   1624         SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1625         if(texData && texData->requiresAutoMipmap)
   1626         {
   1627                 ctx->dispatcher().glGenerateMipmapEXT(target);
   1628         }
   1629     }
   1630 }
   1631 
   1632 GL_API void GL_APIENTRY  glTranslatef( GLfloat x, GLfloat y, GLfloat z) {
   1633     GET_CTX()
   1634     ctx->dispatcher().glTranslatef(x,y,z);
   1635 }
   1636 
   1637 GL_API void GL_APIENTRY  glTranslatex( GLfixed x, GLfixed y, GLfixed z) {
   1638     GET_CTX()
   1639     ctx->dispatcher().glTranslatef(X2F(x),X2F(y),X2F(z));
   1640 }
   1641 
   1642 GL_API void GL_APIENTRY  glVertexPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
   1643     GET_CTX()
   1644     SET_ERROR_IF(!GLEScmValidate::vertexPointerParams(size,stride),GL_INVALID_VALUE);
   1645     SET_ERROR_IF(!GLEScmValidate::vertexPointerType(type),GL_INVALID_ENUM);
   1646     ctx->setPointer(GL_VERTEX_ARRAY,size,type,stride,pointer);
   1647 }
   1648 
   1649 GL_API void GL_APIENTRY  glViewport( GLint x, GLint y, GLsizei width, GLsizei height) {
   1650     GET_CTX()
   1651     ctx->dispatcher().glViewport(x,y,width,height);
   1652 }
   1653 
   1654 GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
   1655 {
   1656     GET_CTX();
   1657     SET_ERROR_IF(!GLEScmValidate::textureTargetLimited(target),GL_INVALID_ENUM);
   1658     unsigned int imagehndl = ToTargetCompatibleHandle((uintptr_t)image);
   1659     EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl);
   1660     if (img) {
   1661         // Create the texture object in the underlying EGL implementation,
   1662         // flag to the OpenGL layer to skip the image creation and map the
   1663         // current binded texture object to the existing global object.
   1664         if (ctx->shareGroup().Ptr()) {
   1665             ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
   1666             unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex);
   1667             // Delete old texture object but only if it is not a target of a EGLImage
   1668             if (oldGlobal) {
   1669                 TextureData* oldTexData = getTextureData(tex);
   1670                 if (!oldTexData || oldTexData->sourceEGLImage == 0) {
   1671                     ctx->dispatcher().glDeleteTextures(1, &oldGlobal);
   1672                 }
   1673             }
   1674             // replace mapping and bind the new global object
   1675             ctx->shareGroup()->replaceGlobalName(TEXTURE, tex,img->globalTexName);
   1676             ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName);
   1677             TextureData *texData = getTextureTargetData(target);
   1678             SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
   1679             texData->width = img->width;
   1680             texData->height = img->height;
   1681             texData->border = img->border;
   1682             texData->internalFormat = img->internalFormat;
   1683             texData->sourceEGLImage = imagehndl;
   1684             texData->eglImageDetach = s_eglIface->eglDetachEGLImage;
   1685             texData->oldGlobal = oldGlobal;
   1686         }
   1687     }
   1688 }
   1689 
   1690 GL_API void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
   1691 {
   1692     GET_CTX();
   1693     SET_ERROR_IF(target != GL_RENDERBUFFER_OES,GL_INVALID_ENUM);
   1694     unsigned int imagehndl = ToTargetCompatibleHandle((uintptr_t)image);
   1695     EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl);
   1696     SET_ERROR_IF(!img,GL_INVALID_VALUE);
   1697     SET_ERROR_IF(!ctx->shareGroup().Ptr(),GL_INVALID_OPERATION);
   1698 
   1699     // Get current bounded renderbuffer
   1700     // raise INVALID_OPERATIOn if no renderbuffer is bounded
   1701     GLuint rb = ctx->getRenderbufferBinding();
   1702     SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
   1703     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
   1704     RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
   1705     SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
   1706 
   1707     //
   1708     // flag in the renderbufferData that it is an eglImage target
   1709     //
   1710     rbData->sourceEGLImage = imagehndl;
   1711     rbData->eglImageDetach = s_eglIface->eglDetachEGLImage;
   1712     rbData->eglImageGlobalTexName = img->globalTexName;
   1713 
   1714     //
   1715     // if the renderbuffer is attached to a framebuffer
   1716     // change the framebuffer attachment in the undelying OpenGL
   1717     // to point to the eglImage texture object.
   1718     //
   1719     if (rbData->attachedFB) {
   1720         // update the framebuffer attachment point to the
   1721         // underlying texture of the img
   1722         GLuint prevFB = ctx->getFramebufferBinding();
   1723         if (prevFB != rbData->attachedFB) {
   1724             ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
   1725                                                    rbData->attachedFB);
   1726         }
   1727         ctx->dispatcher().glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
   1728                                                     rbData->attachedPoint,
   1729                                                     GL_TEXTURE_2D,
   1730                                                     img->globalTexName,0);
   1731         if (prevFB != rbData->attachedFB) {
   1732             ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
   1733                                                    prevFB);
   1734         }
   1735     }
   1736 }
   1737 
   1738 /* GL_OES_blend_subtract*/
   1739 GL_API void GL_APIENTRY glBlendEquationOES(GLenum mode) {
   1740     GET_CTX()
   1741     SET_ERROR_IF(!(GLEScmValidate::blendEquationMode(mode)), GL_INVALID_ENUM);
   1742     ctx->dispatcher().glBlendEquation(mode);
   1743 }
   1744 
   1745 /* GL_OES_blend_equation_separate */
   1746 GL_API void GL_APIENTRY glBlendEquationSeparateOES (GLenum modeRGB, GLenum modeAlpha) {
   1747     GET_CTX()
   1748     SET_ERROR_IF(!(GLEScmValidate::blendEquationMode(modeRGB) && GLEScmValidate::blendEquationMode(modeAlpha)), GL_INVALID_ENUM);
   1749     ctx->dispatcher().glBlendEquationSeparate(modeRGB,modeAlpha);
   1750 }
   1751 
   1752 /* GL_OES_blend_func_separate */
   1753 GL_API void GL_APIENTRY glBlendFuncSeparateOES(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) {
   1754     GET_CTX()
   1755     SET_ERROR_IF(!GLEScmValidate::blendSrc(srcRGB) || !GLEScmValidate::blendDst(dstRGB) ||
   1756                  !GLEScmValidate::blendSrc(srcAlpha) || ! GLEScmValidate::blendDst(dstAlpha) ,GL_INVALID_ENUM);
   1757     ctx->dispatcher().glBlendFuncSeparate(srcRGB,dstRGB,srcAlpha,dstAlpha);
   1758 }
   1759 
   1760 /* GL_OES_framebuffer_object */
   1761 GL_API GLboolean GL_APIENTRY glIsRenderbufferOES(GLuint renderbuffer) {
   1762     GET_CTX_RET(GL_FALSE)
   1763     RET_AND_SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION,GL_FALSE);
   1764     if(renderbuffer && ctx->shareGroup().Ptr()){
   1765         return ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE;
   1766     }
   1767     return ctx->dispatcher().glIsRenderbufferEXT(renderbuffer);
   1768 }
   1769 
   1770 GL_API void GLAPIENTRY glBindRenderbufferOES(GLenum target, GLuint renderbuffer) {
   1771     GET_CTX()
   1772     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1773     SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target),GL_INVALID_ENUM);
   1774 
   1775     //if buffer wasn't generated before,generate one
   1776     if(renderbuffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)){
   1777         ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
   1778         ctx->shareGroup()->setObjectData(RENDERBUFFER,
   1779                                          renderbuffer,
   1780                                          ObjectDataPtr(new RenderbufferData()));
   1781     }
   1782 
   1783     int globalBufferName = (renderbuffer != 0) ? ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer) : 0;
   1784     ctx->dispatcher().glBindRenderbufferEXT(target,globalBufferName);
   1785 
   1786     // update renderbuffer binding state
   1787     ctx->setRenderbufferBinding(renderbuffer);
   1788 }
   1789 
   1790 GL_API void GLAPIENTRY glDeleteRenderbuffersOES(GLsizei n, const GLuint *renderbuffers) {
   1791     GET_CTX()
   1792     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1793     for (int i=0;i<n;++i) {
   1794         GLuint globalBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffers[i]);
   1795         ctx->dispatcher().glDeleteRenderbuffersEXT(1,&globalBufferName);
   1796     }
   1797 }
   1798 
   1799 GL_API void GLAPIENTRY glGenRenderbuffersOES(GLsizei n, GLuint *renderbuffers) {
   1800     GET_CTX()
   1801     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1802     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
   1803     if(ctx->shareGroup().Ptr()) {
   1804         for(int i=0; i<n ;i++) {
   1805             renderbuffers[i] = ctx->shareGroup()->genName(RENDERBUFFER, 0, true);
   1806             ctx->shareGroup()->setObjectData(RENDERBUFFER,
   1807                                              renderbuffers[i],
   1808                                          ObjectDataPtr(new RenderbufferData()));
   1809         }
   1810     }
   1811 }
   1812 
   1813 GL_API void GLAPIENTRY glRenderbufferStorageOES(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){
   1814     GET_CTX()
   1815     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1816     SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target) || !GLEScmValidate::renderbufferInternalFrmt(ctx,internalformat) ,GL_INVALID_ENUM);
   1817     if (internalformat==GL_RGB565_OES) //RGB565 not supported by GL
   1818         internalformat = GL_RGB8_OES;
   1819 
   1820     // Get current bounded renderbuffer
   1821     // raise INVALID_OPERATIOn if no renderbuffer is bounded
   1822     GLuint rb = ctx->getRenderbufferBinding();
   1823     SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
   1824     ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
   1825     RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
   1826     SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
   1827 
   1828     //
   1829     // if the renderbuffer was an eglImage target, detach from
   1830     // the eglImage.
   1831     //
   1832     if (rbData->sourceEGLImage != 0) {
   1833         if (rbData->eglImageDetach) {
   1834             (*rbData->eglImageDetach)(rbData->sourceEGLImage);
   1835         }
   1836         rbData->sourceEGLImage = 0;
   1837         rbData->eglImageGlobalTexName = 0;
   1838     }
   1839 
   1840     ctx->dispatcher().glRenderbufferStorageEXT(target,internalformat,width,height);
   1841 }
   1842 
   1843 GL_API void GLAPIENTRY glGetRenderbufferParameterivOES(GLenum target, GLenum pname, GLint* params) {
   1844     GET_CTX()
   1845     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1846     SET_ERROR_IF(!GLEScmValidate::renderbufferTarget(target) || !GLEScmValidate::renderbufferParams(pname) ,GL_INVALID_ENUM);
   1847 
   1848     //
   1849     // If this is a renderbuffer which is eglimage's target, we
   1850     // should query the underlying eglimage's texture object instead.
   1851     //
   1852     GLuint rb = ctx->getRenderbufferBinding();
   1853     if (rb) {
   1854         ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
   1855         RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
   1856         if (rbData && rbData->sourceEGLImage != 0) {
   1857             GLenum texPname;
   1858             switch(pname) {
   1859                 case GL_RENDERBUFFER_WIDTH_OES:
   1860                     texPname = GL_TEXTURE_WIDTH;
   1861                     break;
   1862                 case GL_RENDERBUFFER_HEIGHT_OES:
   1863                     texPname = GL_TEXTURE_HEIGHT;
   1864                     break;
   1865                 case GL_RENDERBUFFER_INTERNAL_FORMAT_OES:
   1866                     texPname = GL_TEXTURE_INTERNAL_FORMAT;
   1867                     break;
   1868                 case GL_RENDERBUFFER_RED_SIZE_OES:
   1869                     texPname = GL_TEXTURE_RED_SIZE;
   1870                     break;
   1871                 case GL_RENDERBUFFER_GREEN_SIZE_OES:
   1872                     texPname = GL_TEXTURE_GREEN_SIZE;
   1873                     break;
   1874                 case GL_RENDERBUFFER_BLUE_SIZE_OES:
   1875                     texPname = GL_TEXTURE_BLUE_SIZE;
   1876                     break;
   1877                 case GL_RENDERBUFFER_ALPHA_SIZE_OES:
   1878                     texPname = GL_TEXTURE_ALPHA_SIZE;
   1879                     break;
   1880                 case GL_RENDERBUFFER_DEPTH_SIZE_OES:
   1881                     texPname = GL_TEXTURE_DEPTH_SIZE;
   1882                     break;
   1883                 case GL_RENDERBUFFER_STENCIL_SIZE_OES:
   1884                 default:
   1885                     *params = 0; //XXX
   1886                     return;
   1887                     break;
   1888             }
   1889 
   1890             GLint prevTex;
   1891             ctx->dispatcher().glGetIntegerv(GL_TEXTURE_BINDING_2D, &prevTex);
   1892             ctx->dispatcher().glBindTexture(GL_TEXTURE_2D,
   1893                                             rbData->eglImageGlobalTexName);
   1894             ctx->dispatcher().glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
   1895                                                        texPname,
   1896                                                        params);
   1897             ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, prevTex);
   1898             return;
   1899         }
   1900     }
   1901 
   1902     ctx->dispatcher().glGetRenderbufferParameterivEXT(target,pname,params);
   1903 }
   1904 
   1905 GL_API GLboolean GLAPIENTRY glIsFramebufferOES(GLuint framebuffer) {
   1906     GET_CTX_RET(GL_FALSE)
   1907     RET_AND_SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION,GL_FALSE);
   1908     if (framebuffer && ctx->shareGroup().Ptr()) {
   1909         return ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE : GL_FALSE;
   1910     }
   1911     return ctx->dispatcher().glIsFramebufferEXT(framebuffer);
   1912 }
   1913 
   1914 GL_API void GLAPIENTRY glBindFramebufferOES(GLenum target, GLuint framebuffer) {
   1915     GET_CTX()
   1916     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1917     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) ,GL_INVALID_ENUM);
   1918     if (framebuffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer)) {
   1919         ctx->shareGroup()->genName(FRAMEBUFFER,framebuffer);
   1920         ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffer,
   1921                                          ObjectDataPtr(new FramebufferData(framebuffer)));
   1922     }
   1923     int globalBufferName = (framebuffer!=0) ? ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer) : 0;
   1924     ctx->dispatcher().glBindFramebufferEXT(target,globalBufferName);
   1925 
   1926     // update framebuffer binding state
   1927     ctx->setFramebufferBinding(framebuffer);
   1928 }
   1929 
   1930 GL_API void GLAPIENTRY glDeleteFramebuffersOES(GLsizei n, const GLuint *framebuffers) {
   1931     GET_CTX()
   1932     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1933     for (int i=0;i<n;++i) {
   1934         GLuint globalBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffers[i]);
   1935         ctx->dispatcher().glDeleteFramebuffersEXT(1,&globalBufferName);
   1936     }
   1937 }
   1938 
   1939 GL_API void GLAPIENTRY glGenFramebuffersOES(GLsizei n, GLuint *framebuffers) {
   1940     GET_CTX()
   1941     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1942     SET_ERROR_IF(n<0,GL_INVALID_VALUE);
   1943     if (ctx->shareGroup().Ptr()) {
   1944         for (int i=0;i<n;i++) {
   1945             framebuffers[i] = ctx->shareGroup()->genName(FRAMEBUFFER, 0, true);
   1946             ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffers[i],
   1947                                              ObjectDataPtr(new FramebufferData(framebuffers[i])));
   1948         }
   1949     }
   1950 }
   1951 
   1952 GL_API GLenum GLAPIENTRY glCheckFramebufferStatusOES(GLenum target) {
   1953     GET_CTX_RET(0)
   1954     RET_AND_SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION,0);
   1955     RET_AND_SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) ,GL_INVALID_ENUM,0);
   1956     return ctx->dispatcher().glCheckFramebufferStatusEXT(target);
   1957 }
   1958 
   1959 GL_API void GLAPIENTRY glFramebufferTexture2DOES(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
   1960     GET_CTX()
   1961     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1962     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) || !GLEScmValidate::framebufferAttachment(attachment) ||
   1963                  !GLEScmValidate::textureTargetEx(textarget),GL_INVALID_ENUM);
   1964     SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
   1965 
   1966     GLuint globalTexName = 0;
   1967     if(texture) {
   1968         if (!ctx->shareGroup()->isObject(TEXTURE,texture)) {
   1969             ctx->shareGroup()->genName(TEXTURE,texture);
   1970         }
   1971         ObjectLocalName texname = TextureLocalName(textarget,texture);
   1972         globalTexName = ctx->shareGroup()->getGlobalName(TEXTURE,texname);
   1973     }
   1974 
   1975     ctx->dispatcher().glFramebufferTexture2DEXT(target,attachment,textarget,globalTexName,level);
   1976 
   1977     // Update the the current framebuffer object attachment state
   1978     GLuint fbName = ctx->getFramebufferBinding();
   1979     ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
   1980     if (fbObj.Ptr() != NULL) {
   1981         FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
   1982         fbData->setAttachment(attachment, textarget,
   1983                               texture, ObjectDataPtr(NULL));
   1984     }
   1985 }
   1986 
   1987 GL_API void GLAPIENTRY glFramebufferRenderbufferOES(GLenum target, GLenum attachment,GLenum renderbuffertarget, GLuint renderbuffer) {
   1988     GET_CTX()
   1989     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   1990     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) ||
   1991                  !GLEScmValidate::framebufferAttachment(attachment) ||
   1992                  !GLEScmValidate::renderbufferTarget(renderbuffertarget), GL_INVALID_ENUM);
   1993 
   1994     SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
   1995 
   1996     GLuint globalBufferName = 0;
   1997     ObjectDataPtr obj;
   1998 
   1999     // generate the renderbuffer object if not yet exist
   2000     if (renderbuffer) {
   2001         if (!ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)) {
   2002             ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
   2003             obj = ObjectDataPtr(new RenderbufferData());
   2004             ctx->shareGroup()->setObjectData(RENDERBUFFER,
   2005                                          renderbuffer,
   2006                                          ObjectDataPtr(new RenderbufferData()));
   2007         }
   2008         else {
   2009             obj = ctx->shareGroup()->getObjectData(RENDERBUFFER,renderbuffer);
   2010         }
   2011         globalBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
   2012     }
   2013 
   2014     // Update the the current framebuffer object attachment state
   2015     GLuint fbName = ctx->getFramebufferBinding();
   2016     ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
   2017     if (fbObj.Ptr() != NULL) {
   2018         FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
   2019         fbData->setAttachment(attachment, renderbuffertarget, renderbuffer, obj);
   2020     }
   2021 
   2022     if (renderbuffer && obj.Ptr() != NULL) {
   2023         RenderbufferData *rbData = (RenderbufferData *)obj.Ptr();
   2024         if (rbData->sourceEGLImage != 0) {
   2025             //
   2026             // This renderbuffer object is an eglImage target
   2027             // attach the eglimage's texture instead the renderbuffer.
   2028             //
   2029             ctx->dispatcher().glFramebufferTexture2DEXT(target,
   2030                                                     attachment,
   2031                                                     GL_TEXTURE_2D,
   2032                                                     rbData->eglImageGlobalTexName,0);
   2033             return;
   2034         }
   2035     }
   2036 
   2037     ctx->dispatcher().glFramebufferRenderbufferEXT(target,attachment,renderbuffertarget,globalBufferName);
   2038 }
   2039 
   2040 GL_API void GLAPIENTRY glGetFramebufferAttachmentParameterivOES(GLenum target, GLenum attachment, GLenum pname, GLint *params) {
   2041     GET_CTX()
   2042     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   2043     SET_ERROR_IF(!GLEScmValidate::framebufferTarget(target) || !GLEScmValidate::framebufferAttachment(attachment) ||
   2044                  !GLEScmValidate::framebufferAttachmentParams(pname), GL_INVALID_ENUM);
   2045 
   2046     //
   2047     // Take the attachment attribute from our state - if available
   2048     //
   2049     GLuint fbName = ctx->getFramebufferBinding();
   2050     if (fbName) {
   2051         ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
   2052         if (fbObj.Ptr() != NULL) {
   2053             FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
   2054             GLenum target;
   2055             GLuint name = fbData->getAttachment(attachment, &target, NULL);
   2056             if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES) {
   2057                 *params = target;
   2058                 return;
   2059             }
   2060             else if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES) {
   2061                 *params = name;
   2062                 return;
   2063             }
   2064         }
   2065     }
   2066 
   2067     ctx->dispatcher().glGetFramebufferAttachmentParameterivEXT(target,attachment,pname,params);
   2068 }
   2069 
   2070 GL_API void GL_APIENTRY glGenerateMipmapOES(GLenum target) {
   2071     GET_CTX()
   2072     SET_ERROR_IF(!ctx->getCaps()->GL_EXT_FRAMEBUFFER_OBJECT,GL_INVALID_OPERATION);
   2073     SET_ERROR_IF(!GLEScmValidate::textureTargetLimited(target),GL_INVALID_ENUM);
   2074     ctx->dispatcher().glGenerateMipmapEXT(target);
   2075 }
   2076 
   2077 GL_API void GL_APIENTRY glCurrentPaletteMatrixOES(GLuint index) {
   2078     GET_CTX()
   2079     SET_ERROR_IF(!(ctx->getCaps()->GL_ARB_MATRIX_PALETTE && ctx->getCaps()->GL_ARB_VERTEX_BLEND),GL_INVALID_OPERATION);
   2080     ctx->dispatcher().glCurrentPaletteMatrixARB(index);
   2081 }
   2082 
   2083 GL_API void GL_APIENTRY glLoadPaletteFromModelViewMatrixOES() {
   2084     GET_CTX()
   2085     SET_ERROR_IF(!(ctx->getCaps()->GL_ARB_MATRIX_PALETTE && ctx->getCaps()->GL_ARB_VERTEX_BLEND),GL_INVALID_OPERATION);
   2086     GLint matrix[16];
   2087     ctx->dispatcher().glGetIntegerv(GL_MODELVIEW_MATRIX,matrix);
   2088     ctx->dispatcher().glMatrixIndexuivARB(1,(GLuint*)matrix);
   2089 
   2090 }
   2091 
   2092 GL_API void GL_APIENTRY glMatrixIndexPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
   2093     GET_CTX()
   2094     SET_ERROR_IF(!(ctx->getCaps()->GL_ARB_MATRIX_PALETTE && ctx->getCaps()->GL_ARB_VERTEX_BLEND),GL_INVALID_OPERATION);
   2095     ctx->dispatcher().glMatrixIndexPointerARB(size,type,stride,pointer);
   2096 }
   2097 
   2098 GL_API void GL_APIENTRY glWeightPointerOES(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) {
   2099     GET_CTX()
   2100     SET_ERROR_IF(!(ctx->getCaps()->GL_ARB_MATRIX_PALETTE && ctx->getCaps()->GL_ARB_VERTEX_BLEND),GL_INVALID_OPERATION);
   2101     ctx->dispatcher().glWeightPointerARB(size,type,stride,pointer);
   2102 
   2103 }
   2104 
   2105 GL_API void GL_APIENTRY glTexGenfOES (GLenum coord, GLenum pname, GLfloat param) {
   2106     GET_CTX()
   2107     SET_ERROR_IF(!GLEScmValidate::texGen(coord,pname),GL_INVALID_ENUM);
   2108     if (coord == GL_TEXTURE_GEN_STR_OES) {
   2109         ctx->dispatcher().glTexGenf(GL_S,pname,param);
   2110         ctx->dispatcher().glTexGenf(GL_T,pname,param);
   2111         ctx->dispatcher().glTexGenf(GL_R,pname,param);
   2112     }
   2113     else
   2114         ctx->dispatcher().glTexGenf(coord,pname,param);
   2115 }
   2116 
   2117 GL_API void GL_APIENTRY glTexGenfvOES (GLenum coord, GLenum pname, const GLfloat *params) {
   2118     GET_CTX()
   2119     SET_ERROR_IF(!GLEScmValidate::texGen(coord,pname),GL_INVALID_ENUM);
   2120     if (coord == GL_TEXTURE_GEN_STR_OES) {
   2121         ctx->dispatcher().glTexGenfv(GL_S,pname,params);
   2122         ctx->dispatcher().glTexGenfv(GL_T,pname,params);
   2123         ctx->dispatcher().glTexGenfv(GL_R,pname,params);
   2124     }
   2125     else
   2126         ctx->dispatcher().glTexGenfv(coord,pname,params);
   2127 }
   2128 GL_API void GL_APIENTRY glTexGeniOES (GLenum coord, GLenum pname, GLint param) {
   2129     GET_CTX()
   2130     SET_ERROR_IF(!GLEScmValidate::texGen(coord,pname),GL_INVALID_ENUM);
   2131     if (coord == GL_TEXTURE_GEN_STR_OES) {
   2132         ctx->dispatcher().glTexGeni(GL_S,pname,param);
   2133         ctx->dispatcher().glTexGeni(GL_T,pname,param);
   2134         ctx->dispatcher().glTexGeni(GL_R,pname,param);
   2135     }
   2136     else
   2137         ctx->dispatcher().glTexGeni(coord,pname,param);
   2138 }
   2139 GL_API void GL_APIENTRY glTexGenivOES (GLenum coord, GLenum pname, const GLint *params) {
   2140     GET_CTX()
   2141     SET_ERROR_IF(!GLEScmValidate::texGen(coord,pname),GL_INVALID_ENUM);
   2142     if (coord == GL_TEXTURE_GEN_STR_OES) {
   2143         ctx->dispatcher().glTexGeniv(GL_S,pname,params);
   2144         ctx->dispatcher().glTexGeniv(GL_T,pname,params);
   2145         ctx->dispatcher().glTexGeniv(GL_R,pname,params);
   2146     }
   2147     else
   2148         ctx->dispatcher().glTexGeniv(coord,pname,params);
   2149 }
   2150 GL_API void GL_APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param) {
   2151     GET_CTX()
   2152     SET_ERROR_IF(!GLEScmValidate::texGen(coord,pname),GL_INVALID_ENUM);
   2153     if (coord == GL_TEXTURE_GEN_STR_OES) {
   2154         ctx->dispatcher().glTexGenf(GL_S,pname,X2F(param));
   2155         ctx->dispatcher().glTexGenf(GL_T,pname,X2F(param));
   2156         ctx->dispatcher().glTexGenf(GL_R,pname,X2F(param));
   2157     }
   2158     else
   2159         ctx->dispatcher().glTexGenf(coord,pname,X2F(param));
   2160 }
   2161 GL_API void GL_APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params) {
   2162     GLfloat tmpParams[1];
   2163     GET_CTX()
   2164     SET_ERROR_IF(!GLEScmValidate::texGen(coord,pname),GL_INVALID_ENUM);
   2165     tmpParams[0] = X2F(params[0]);
   2166     if (coord == GL_TEXTURE_GEN_STR_OES) {
   2167         ctx->dispatcher().glTexGenfv(GL_S,pname,tmpParams);
   2168         ctx->dispatcher().glTexGenfv(GL_T,pname,tmpParams);
   2169         ctx->dispatcher().glTexGenfv(GL_R,pname,tmpParams);
   2170     }
   2171     else
   2172         ctx->dispatcher().glTexGenfv(coord,pname,tmpParams);
   2173 }
   2174 
   2175 GL_API void GL_APIENTRY glGetTexGenfvOES (GLenum coord, GLenum pname, GLfloat *params) {
   2176     GET_CTX()
   2177     if (coord == GL_TEXTURE_GEN_STR_OES)
   2178     {
   2179         GLfloat state_s = GL_FALSE;
   2180         GLfloat state_t = GL_FALSE;
   2181         GLfloat state_r = GL_FALSE;
   2182         ctx->dispatcher().glGetTexGenfv(GL_S,pname,&state_s);
   2183         ctx->dispatcher().glGetTexGenfv(GL_T,pname,&state_t);
   2184         ctx->dispatcher().glGetTexGenfv(GL_R,pname,&state_r);
   2185         *params = state_s && state_t && state_r ? GL_TRUE: GL_FALSE;
   2186     }
   2187     else
   2188         ctx->dispatcher().glGetTexGenfv(coord,pname,params);
   2189 
   2190 }
   2191 GL_API void GL_APIENTRY glGetTexGenivOES (GLenum coord, GLenum pname, GLint *params) {
   2192     GET_CTX()
   2193     if (coord == GL_TEXTURE_GEN_STR_OES)
   2194     {
   2195         GLint state_s = GL_FALSE;
   2196         GLint state_t = GL_FALSE;
   2197         GLint state_r = GL_FALSE;
   2198         ctx->dispatcher().glGetTexGeniv(GL_S,pname,&state_s);
   2199         ctx->dispatcher().glGetTexGeniv(GL_T,pname,&state_t);
   2200         ctx->dispatcher().glGetTexGeniv(GL_R,pname,&state_r);
   2201         *params = state_s && state_t && state_r ? GL_TRUE: GL_FALSE;
   2202     }
   2203     else
   2204         ctx->dispatcher().glGetTexGeniv(coord,pname,params);
   2205 }
   2206 
   2207 GL_API void GL_APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params) {
   2208     GET_CTX()
   2209     GLfloat tmpParams[1];
   2210 
   2211     if (coord == GL_TEXTURE_GEN_STR_OES)
   2212     {
   2213         GLfloat state_s = GL_FALSE;
   2214         GLfloat state_t = GL_FALSE;
   2215         GLfloat state_r = GL_FALSE;
   2216         ctx->dispatcher().glGetTexGenfv(GL_TEXTURE_GEN_S,pname,&state_s);
   2217         ctx->dispatcher().glGetTexGenfv(GL_TEXTURE_GEN_T,pname,&state_t);
   2218         ctx->dispatcher().glGetTexGenfv(GL_TEXTURE_GEN_R,pname,&state_r);
   2219         tmpParams[0] = state_s && state_t && state_r ? GL_TRUE: GL_FALSE;
   2220     }
   2221     else
   2222         ctx->dispatcher().glGetTexGenfv(coord,pname,tmpParams);
   2223 
   2224     params[0] = F2X(tmpParams[1]);
   2225 }
   2226 
   2227 template <class T, GLenum TypeName>
   2228 void glDrawTexOES (T x, T y, T z, T width, T height) {
   2229     GET_CTX()
   2230 
   2231     SET_ERROR_IF((width<=0 || height<=0),GL_INVALID_VALUE);
   2232 
   2233     ctx->drawValidate();
   2234 
   2235     int numClipPlanes;
   2236 
   2237     GLint viewport[4];
   2238     z = (z>1 ? 1 : (z<0 ?  0 : z));
   2239 
   2240     T     vertices[4*3] = {x , y, z,
   2241                              x , y+height, z,
   2242                              x+width, y+height, z,
   2243                              x+width, y, z};
   2244     GLfloat texels[ctx->getMaxTexUnits()][4*2];
   2245     memset((void*)texels, 0, ctx->getMaxTexUnits()*4*2*sizeof(GLfloat));
   2246 
   2247     ctx->dispatcher().glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
   2248     ctx->dispatcher().glPushAttrib(GL_TRANSFORM_BIT);
   2249 
   2250     //setup projection matrix to draw in viewport aligned coordinates
   2251     ctx->dispatcher().glMatrixMode(GL_PROJECTION);
   2252     ctx->dispatcher().glPushMatrix();
   2253     ctx->dispatcher().glLoadIdentity();
   2254     ctx->dispatcher().glGetIntegerv(GL_VIEWPORT,viewport);
   2255     ctx->dispatcher().glOrtho(viewport[0],viewport[0] + viewport[2],viewport[1],viewport[1]+viewport[3],0,-1);
   2256     //setup texture matrix
   2257     ctx->dispatcher().glMatrixMode(GL_TEXTURE);
   2258     ctx->dispatcher().glPushMatrix();
   2259     ctx->dispatcher().glLoadIdentity();
   2260     //setup modelview matrix
   2261     ctx->dispatcher().glMatrixMode(GL_MODELVIEW);
   2262     ctx->dispatcher().glPushMatrix();
   2263     ctx->dispatcher().glLoadIdentity();
   2264     //backup vbo's
   2265     int array_buffer,element_array_buffer;
   2266     glGetIntegerv(GL_ARRAY_BUFFER_BINDING,&array_buffer);
   2267     glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING,&element_array_buffer);
   2268     ctx->dispatcher().glBindBuffer(GL_ARRAY_BUFFER,0);
   2269     ctx->dispatcher().glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
   2270 
   2271     //disable clip planes
   2272     ctx->dispatcher().glGetIntegerv(GL_MAX_CLIP_PLANES,&numClipPlanes);
   2273     for (int i=0;i<numClipPlanes;++i)
   2274         ctx->dispatcher().glDisable(GL_CLIP_PLANE0+i);
   2275 
   2276     int nTexPtrs = 0;
   2277     for (int i=0;i<ctx->getMaxTexUnits();++i) {
   2278         if (ctx->isTextureUnitEnabled(GL_TEXTURE0+i)) {
   2279             TextureData * texData = NULL;
   2280             unsigned int texname = ctx->getBindedTexture(GL_TEXTURE0+i,GL_TEXTURE_2D);
   2281             ObjectLocalName tex = TextureLocalName(GL_TEXTURE_2D,texname);
   2282             ctx->dispatcher().glClientActiveTexture(GL_TEXTURE0+i);
   2283             ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
   2284             if (objData.Ptr()) {
   2285                 texData = (TextureData*)objData.Ptr();
   2286                 //calculate texels
   2287                 texels[i][0] = (float)(texData->crop_rect[0])/(float)(texData->width);
   2288                 texels[i][1] = (float)(texData->crop_rect[1])/(float)(texData->height);
   2289 
   2290                 texels[i][2] = (float)(texData->crop_rect[0])/(float)(texData->width);
   2291                 texels[i][3] = (float)(texData->crop_rect[3]+texData->crop_rect[1])/(float)(texData->height);
   2292 
   2293                 texels[i][4] = (float)(texData->crop_rect[2]+texData->crop_rect[0])/(float)(texData->width);
   2294                 texels[i][5] = (float)(texData->crop_rect[3]+texData->crop_rect[1])/(float)(texData->height);
   2295 
   2296                 texels[i][6] = (float)(texData->crop_rect[2]+texData->crop_rect[0])/(float)(texData->width);
   2297                 texels[i][7] = (float)(texData->crop_rect[1])/(float)(texData->height);
   2298 
   2299                 ctx->dispatcher().glTexCoordPointer(2,GL_FLOAT,0,texels[i]);
   2300                 nTexPtrs++;
   2301              }
   2302         }
   2303     }
   2304 
   2305     if (nTexPtrs>0) {
   2306         //draw rectangle - only if we have some textures enabled & ready
   2307         ctx->dispatcher().glEnableClientState(GL_VERTEX_ARRAY);
   2308         ctx->dispatcher().glVertexPointer(3,TypeName,0,vertices);
   2309         ctx->dispatcher().glEnableClientState(GL_TEXTURE_COORD_ARRAY);
   2310         ctx->dispatcher().glDrawArrays(GL_TRIANGLE_FAN,0,4);
   2311     }
   2312 
   2313     //restore vbo's
   2314     ctx->dispatcher().glBindBuffer(GL_ARRAY_BUFFER,array_buffer);
   2315     ctx->dispatcher().glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,element_array_buffer);
   2316 
   2317     //restore matrix state
   2318 
   2319     ctx->dispatcher().glMatrixMode(GL_MODELVIEW);
   2320     ctx->dispatcher().glPopMatrix();
   2321     ctx->dispatcher().glMatrixMode(GL_TEXTURE);
   2322     ctx->dispatcher().glPopMatrix();
   2323     ctx->dispatcher().glMatrixMode(GL_PROJECTION);
   2324     ctx->dispatcher().glPopMatrix();
   2325 
   2326     ctx->dispatcher().glPopAttrib();
   2327     ctx->dispatcher().glPopClientAttrib();
   2328 }
   2329 
   2330 GL_API void GL_APIENTRY glDrawTexsOES (GLshort x, GLshort y, GLshort z, GLshort width, GLshort height) {
   2331     glDrawTexOES<GLshort,GL_SHORT>(x,y,z,width,height);
   2332 }
   2333 
   2334 GL_API void GL_APIENTRY glDrawTexiOES (GLint x, GLint y, GLint z, GLint width, GLint height) {
   2335     glDrawTexOES<GLint,GL_INT>(x,y,z,width,height);
   2336 }
   2337 
   2338 GL_API void GL_APIENTRY glDrawTexfOES (GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height) {
   2339     glDrawTexOES<GLfloat,GL_FLOAT>(x,y,z,width,height);
   2340 }
   2341 
   2342 GL_API void GL_APIENTRY glDrawTexxOES (GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height) {
   2343     glDrawTexOES<GLfloat,GL_FLOAT>(X2F(x),X2F(y),X2F(z),X2F(width),X2F(height));
   2344 }
   2345 
   2346 GL_API void GL_APIENTRY glDrawTexsvOES (const GLshort * coords) {
   2347     glDrawTexOES<GLshort,GL_SHORT>(coords[0],coords[1],coords[2],coords[3],coords[4]);
   2348 }
   2349 
   2350 GL_API void GL_APIENTRY glDrawTexivOES (const GLint * coords) {
   2351     glDrawTexOES<GLint,GL_INT>(coords[0],coords[1],coords[2],coords[3],coords[4]);
   2352 }
   2353 
   2354 GL_API void GL_APIENTRY glDrawTexfvOES (const GLfloat * coords) {
   2355     glDrawTexOES<GLfloat,GL_FLOAT>(coords[0],coords[1],coords[2],coords[3],coords[4]);
   2356 }
   2357 
   2358 GL_API void GL_APIENTRY glDrawTexxvOES (const GLfixed * coords) {
   2359     glDrawTexOES<GLfloat,GL_FLOAT>(X2F(coords[0]),X2F(coords[1]),X2F(coords[2]),X2F(coords[3]),X2F(coords[4]));
   2360 }
   2361