Modify bug235.pkgdef.xml in line with changes to package_definition.xml
Add license details to host support components.
/* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and /or associated documentation files
* (the "Materials "), to deal in the Materials without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Materials,
* and to permit persons to whom the Materials are furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Materials.
*
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
* THE USE OR OTHER DEALINGS IN THE MATERIALS.
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
#include <GLES/gl.h>
#include <GLES/glplatform.h>
#include <iostream>
#include "GLESDesktopGL.h"
#include "glesInternal.h"
#include "EGLInterface.h"
#include "GLESContext.h"
#include "GLESArray.h"
#include "GLESTexture.h"
#include "glesGet.h"
// exit()
#include <stdlib.h>
// memcpy
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
/* Available only in Common profile */
GL_API void GL_APIENTRY glAlphaFunc (GLenum func, GLclampf ref)
{
GLES_ENTER();
ctx->DGL().glAlphaFunc (func, ref);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
{
GLES_ENTER();
ctx->DGL().glClearColor (red, green, blue, alpha);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClearDepthf (GLclampf depth)
{
GLES_ENTER();
ctx->DGL().glClearDepth (depth);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClipPlanef (GLenum plane, const GLfloat *equation)
{
GLES_ENTER();
GLES_ERROR_IF(plane < GL_CLIP_PLANE0 || plane >= GL_CLIP_PLANE0 + ctx->MaxClipPlanes(), GL_INVALID_ENUM);
GLdouble dequation[4];
for(int i = 0; i < 4; i++)
{
dequation[i] = static_cast<GLdouble>(equation[i]);
}
ctx->DGL().glClipPlane (plane, dequation);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
{
GLES_ENTER();
ctx->DGL().glColor4f (red, green, blue, alpha);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glDepthRangef (GLclampf zNear, GLclampf zFar)
{
GLES_ENTER();
ctx->DGL().glDepthRange(zNear, zFar);
GLES_LEAVE();
}
bool isValidSingleValuedFogParamEnum(GLenum pname)
{
switch(pname)
{
case GL_FOG_MODE:
case GL_FOG_DENSITY:
case GL_FOG_START:
case GL_FOG_END:
return true;
default:
return false;
}
}
bool isValidFogParamEnum(GLenum pname)
{
return isValidSingleValuedFogParamEnum(pname) || pname == GL_FOG_COLOR;
}
GL_API void GL_APIENTRY glFogf (GLenum pname, GLfloat param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glFogf (pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFogfv (GLenum pname, const GLfloat *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glFogfv (pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFrustumf (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
{
GLES_ENTER();
ctx->DGL().glFrustum (left, right, bottom, top, zNear, zFar);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetClipPlanef (GLenum pname, GLfloat eqn[4])
{
GLES_ENTER();
GLdouble deqn[4];
ctx->DGL().glGetClipPlane (pname, deqn);
for(int i = 0; i < 4; i++)
{
eqn[i] = static_cast<GLfloat>(deqn[i]);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *params)
{
GLES_ENTER();
if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_FLOAT, params))
{
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params)
{
GLES_ENTER();
ctx->DGL().glGetLightfv (light, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params)
{
GLES_ENTER();
ctx->DGL().glGetMaterialfv (face, pname, params);
GLES_LEAVE();
}
bool isValidTexEnvTargetEnum(GLenum target)
{
switch(target)
{
case GL_POINT_SPRITE_OES:
case GL_TEXTURE_ENV:
return true;
default:
return false;
}
}
bool isValidSingleValuedTexEnvParamEnum(GLenum pname)
{
switch(pname)
{
case GL_TEXTURE_ENV_MODE:
case GL_COORD_REPLACE_OES:
case GL_COMBINE_RGB:
case GL_COMBINE_ALPHA:
case GL_SRC0_RGB:
case GL_SRC1_RGB:
case GL_SRC2_RGB:
case GL_SRC0_ALPHA:
case GL_SRC1_ALPHA:
case GL_SRC2_ALPHA:
case GL_OPERAND0_RGB:
case GL_OPERAND1_RGB:
case GL_OPERAND2_RGB:
case GL_OPERAND0_ALPHA:
case GL_OPERAND1_ALPHA:
case GL_OPERAND2_ALPHA:
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
return true;
default:
return false;
}
}
bool isValidTexEnvParamEnum(GLenum pname)
{
return isValidSingleValuedTexEnvParamEnum(pname) || pname == GL_TEXTURE_ENV_COLOR;
}
GL_API void GL_APIENTRY glGetTexEnvfv (GLenum env, GLenum pname, GLfloat *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexEnvTargetEnum(env), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
env = env == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : env;
pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
ctx->DGL().glGetTexEnvfv (env, pname, params);
GLES_LEAVE();
}
bool isValidTexParamEnum(GLenum pname)
{
switch(pname)
{
case GL_TEXTURE_MIN_FILTER:
case GL_TEXTURE_MAG_FILTER:
case GL_TEXTURE_WRAP_S:
case GL_TEXTURE_WRAP_T:
case GL_GENERATE_MIPMAP:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glGetTexParameterfv (target, pname, params);
GLES_LEAVE();
}
bool isValidLightModelParamEnum(GLenum pname)
{
switch(pname)
{
case GL_LIGHT_MODEL_AMBIENT:
case GL_LIGHT_MODEL_TWO_SIDE:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glLightModelf (GLenum pname, GLfloat param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glLightModelf (pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLightModelfv (GLenum pname, const GLfloat *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glLightModelfv (pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param)
{
GLES_ENTER();
ctx->DGL().glLightf (light, pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params)
{
GLES_ENTER();
ctx->DGL().glLightfv (light, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLineWidth (GLfloat width)
{
GLES_ENTER();
ctx->DGL().glLineWidth (width);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLoadMatrixf (const GLfloat *m)
{
GLES_ENTER();
ctx->DGL().glLoadMatrixf (m);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param)
{
GLES_ENTER();
ctx->DGL().glMaterialf (face, pname, param);
GLES_LEAVE();
}
bool isValidSingleValuedMaterialParamEnum(GLenum pname)
{
return pname == GL_SHININESS;
}
bool isValidMaterialParamEnum(GLenum pname)
{
if(isValidSingleValuedMaterialParamEnum(pname))
{
return true;
}
else
{
switch(pname)
{
case GL_AMBIENT:
case GL_DIFFUSE:
case GL_AMBIENT_AND_DIFFUSE:
case GL_SPECULAR:
case GL_EMISSION:
case GL_SHININESS:
return true;
default:
return false;
}
}
}
GL_API void GL_APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glMaterialfv (face, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glMultMatrixf (const GLfloat *m)
{
GLES_ENTER();
ctx->DGL().glMultMatrixf(m);
GLES_LEAVE();
}
bool isValidTextureTargetEnum(GLenum target, unsigned int maxTextureUnits)
{
return target >= GL_TEXTURE0 && target < GL_TEXTURE0 + maxTextureUnits;
}
GL_API void GL_APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTextureTargetEnum(target, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
ctx->DGL().glMultiTexCoord4f(target, s, t, r, q);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz)
{
GLES_ENTER();
ctx->DGL().glNormal3f(nx, ny, nz);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glOrthof (GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar)
{
GLES_ENTER();
ctx->DGL().glOrtho(left, right, bottom, top, zNear, zFar);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPointParameterf (GLenum pname, GLfloat param)
{
GLES_ENTER();
ctx->DGL().glPointParameterf (pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params)
{
GLES_ENTER();
ctx->DGL().glPointParameterfv (pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPointSize (GLfloat size)
{
GLES_ENTER();
ctx->DGL().glPointSize (size);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units)
{
GLES_ENTER();
ctx->DGL().glPolygonOffset (factor, units);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
{
GLES_ENTER();
ctx->DGL().glRotatef (angle, x, y, z);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z)
{
GLES_ENTER();
ctx->DGL().glScalef (x, y, z);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target;
pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
ctx->DGL().glTexEnvf (target, pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target;
pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
ctx->DGL().glTexEnvfv (target, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
ctx->DGL().glTexParameterf (target, pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
target = target == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : target;
pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
ctx->DGL().glTexParameterfv (target, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z)
{
GLES_ENTER();
ctx->DGL().glTranslatef (x, y, z);
GLES_LEAVE();
}
/* Available in both Common and Common-Lite profiles */
GL_API void GL_APIENTRY glActiveTexture (GLenum texture)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTextureTargetEnum(texture, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
ctx->DGL().glActiveTexture (texture);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glAlphaFuncx (GLenum func, GLclampx ref)
{
GLES_ENTER();
ctx->DGL().glAlphaFunc(func, X_TO_F(ref));
GLES_LEAVE();
}
bool isValidBufferTarget(GLenum target)
{
switch(target)
{
case GL_ARRAY_BUFFER:
case GL_ELEMENT_ARRAY_BUFFER:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidBufferTarget(target), GL_INVALID_ENUM);
switch(target)
{
case GL_ARRAY_BUFFER:
if(!ctx->BindArrayBuffer(buffer))
{
GLES_ERROR(GL_OUT_OF_MEMORY);
}
break;
case GL_ELEMENT_ARRAY_BUFFER:
if(!ctx->BindElementArrayBuffer(buffer))
{
GLES_ERROR(GL_OUT_OF_MEMORY);
}
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glBindTexture (GLenum target, GLuint texture)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
ctx->GetHostError();
ctx->DGL().glBindTexture (target, texture);
if(ctx->GetHostError() == GL_NO_ERROR)
{
ctx->BindTexture(texture);
}
GLES_LEAVE();
}
bool isValidSrcBlendFuncEnum(GLenum func)
{
switch(func)
{
case GL_ZERO:
case GL_ONE:
case GL_DST_COLOR:
case GL_ONE_MINUS_DST_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
case GL_SRC_ALPHA_SATURATE:
return true;
default:
return false;
}
}
bool isValidDstBlendFuncEnum(GLenum func)
{
switch(func)
{
case GL_ZERO:
case GL_ONE:
case GL_SRC_COLOR:
case GL_ONE_MINUS_SRC_COLOR:
case GL_SRC_ALPHA:
case GL_ONE_MINUS_SRC_ALPHA:
case GL_DST_ALPHA:
case GL_ONE_MINUS_DST_ALPHA:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidSrcBlendFuncEnum(sfactor), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidDstBlendFuncEnum(dfactor), GL_INVALID_ENUM);
ctx->DGL().glBlendFunc (sfactor, dfactor);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
{
GLES_ENTER();
GLES_ERROR_IF(size < 0, GL_INVALID_VALUE);
GLES_ERROR_IF(usage != GL_STATIC_DRAW && usage != GL_DYNAMIC_DRAW, GL_INVALID_ENUM);
GLESBuffer* buffer;
switch(target)
{
case GL_ARRAY_BUFFER:
GLES_ERROR_IF(ctx->ArrayBufferBinding() == 0, GL_INVALID_OPERATION);
buffer = ctx->ArrayBuffer();
break;
case GL_ELEMENT_ARRAY_BUFFER:
GLES_ERROR_IF(ctx->ElementArrayBufferBinding() == 0, GL_INVALID_OPERATION);
buffer = ctx->ElementArrayBuffer();
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_ASSERT(buffer);
delete[] buffer->data;
buffer->data = GLES_NEW char[size];
if(buffer->data == NULL)
{
GLES_ERROR(GL_OUT_OF_MEMORY);
}
if(data != NULL)
{
memcpy(buffer->data, data, size);
}
buffer->size = size;
buffer->usage = usage;
GLES_LEAVE();
}
GL_API void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data)
{
GLES_ENTER();
GLES_ERROR_IF(offset < 0, GL_INVALID_VALUE);
GLES_ERROR_IF(size < 0, GL_INVALID_VALUE);
GLESBuffer* buffer;
switch(target)
{
case GL_ARRAY_BUFFER:
GLES_ERROR_IF(ctx->ArrayBufferBinding() == 0, GL_INVALID_OPERATION);
buffer = ctx->ArrayBuffer();
break;
case GL_ELEMENT_ARRAY_BUFFER:
GLES_ERROR_IF(ctx->ElementArrayBufferBinding() == 0, GL_INVALID_OPERATION);
buffer = ctx->ElementArrayBuffer();
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_ASSERT(buffer);
GLES_ERROR_IF(size + offset > buffer->size, GL_INVALID_VALUE);
memcpy(static_cast<char*>(buffer->data) + offset, data, size);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClear (GLbitfield mask)
{
GLES_ENTER();
GLES_LOCK_DRAW_SURFACE();
ctx->DGL().glClear (mask);
GLES_UNLOCK_SURFACE();
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClearColorx (GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha)
{
GLES_ENTER();
ctx->DGL().glClearColor (X_TO_F(red), X_TO_F(green), X_TO_F(blue), X_TO_F(alpha));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClearDepthx (GLclampx depth)
{
GLES_ENTER();
ctx->DGL().glClearDepth (X_TO_D(depth));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClearStencil (GLint s)
{
GLES_ENTER();
ctx->DGL().glClearStencil (s);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glClientActiveTexture (GLenum texture)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTextureTargetEnum(texture, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
ctx->GetHostError();
ctx->DGL().glClientActiveTexture (texture);
if(ctx->GetHostError() == GL_NO_ERROR)
{
ctx->SetClientActiveTexture(texture - GL_TEXTURE0);
}
GLES_LEAVE_NO_ERROR_CHECK();
}
GL_API void GL_APIENTRY glClipPlanex (GLenum plane, const GLfixed *equation)
{
GLES_ENTER();
GLdouble dequation[4];
for(int i = 0; i < 4; i++)
{
dequation[i] = X_TO_D(equation[i]);
}
ctx->DGL().glClipPlane (plane, dequation);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)
{
GLES_ENTER();
ctx->DGL().glColor4ub (red, green, blue, alpha);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glColor4x (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha)
{
GLES_ENTER();
ctx->DGL().glColor4d(X_TO_D(red), X_TO_D(green), X_TO_D(blue), X_TO_D(alpha));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
{
GLES_ENTER();
ctx->DGL().glColorMask (red, green, blue, alpha);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
GLES_ENTER();
GLES_ERROR_IF(size != 4, GL_INVALID_VALUE);
GLES_ERROR_IF(type != GL_UNSIGNED_BYTE && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
ctx->SetColorArray(size, type, stride, pointer);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(level > 0, GL_INVALID_VALUE);
GLES_ERROR_IF(!glesIsValidCompressedFormat(internalformat), GL_INVALID_ENUM);
GLES_ERROR_IF(height < 0, GL_INVALID_VALUE);
GLES_ERROR_IF(width < 0, GL_INVALID_VALUE);
GLES_ERROR_IF(height > 0 && !glesIsPowerOfTwo(height), GL_INVALID_VALUE);
GLES_ERROR_IF(width > 0 && !glesIsPowerOfTwo(width), GL_INVALID_VALUE);
GLES_ERROR_IF(imageSize < 0, GL_INVALID_VALUE);
GLenum baseFormat = glesMapCompressedToBaseFormat(internalformat);
int numLevels = -level + 1;
for(int curLevel = 0; curLevel < numLevels; curLevel++)
{
if(data != NULL)
{
void* uncompressedData = glesUncompressImage(curLevel, internalformat, width, height, imageSize, data);
if(uncompressedData == NULL)
{
GLES_ERROR(GL_OUT_OF_MEMORY);
}
ctx->DGL().glTexImage2D(target, curLevel, baseFormat, width, height, border, baseFormat, GL_UNSIGNED_BYTE, uncompressedData);
delete uncompressedData;
}
else
{
ctx->DGL().glTexImage2D(target, curLevel, baseFormat, width, height, border, baseFormat, GL_UNSIGNED_BYTE, NULL);
}
if(ctx->GetHostError() == GL_NO_ERROR)
{
GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
GLES_ASSERT(texture != NULL);
texture->SetLevel(level, internalformat, width, height);
if(texture->Level(level)->boundSurface != NULL)
{
// Texture is respecified. Release the bound EGLSurface.
glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level);
texture->Level(level)->boundSurface = NULL;
}
}
width /= 2;
height /= 2;
}
GLES_LEAVE();
}
static bool isPalettedFormat(GLenum format)
{
switch(format)
{
case GL_PALETTE4_RGB8_OES:
case GL_PALETTE4_RGBA8_OES:
case GL_PALETTE4_R5_G6_B5_OES:
case GL_PALETTE4_RGBA4_OES:
case GL_PALETTE4_RGB5_A1_OES:
case GL_PALETTE8_RGB8_OES:
case GL_PALETTE8_RGBA8_OES:
case GL_PALETTE8_R5_G6_B5_OES:
case GL_PALETTE8_RGBA4_OES:
case GL_PALETTE8_RGB5_A1_OES:
return true;
default:
return false;
}
}
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)
{
GLES_ENTER();
GLES_ERROR_IF(!isPalettedFormat(format), GL_INVALID_ENUM);
// Not supported for compressed paletted textures.
GLES_ERROR(GL_INVALID_OPERATION);
GLES_LEAVE();
}
bool isValidPixelFormatEnum(GLenum format)
{
switch(format)
{
case GL_ALPHA:
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
case GL_RGB:
case GL_RGBA:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidPixelFormatEnum(internalformat), GL_INVALID_ENUM);
GLES_LOCK_READ_SURFACE();
ctx->DGL().glCopyTexImage2D (target, level, internalformat, x, y, width, height, border);
GLES_UNLOCK_SURFACE();
if(ctx->GetHostError() == GL_NO_ERROR)
{
GLint genMipmap;
ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
GLES_ASSERT(texture != NULL);
if(level == 0 && genMipmap)
{
texture->GenerateMipmap();
}
if(texture->Level(level)->boundSurface != NULL)
{
// Texture is respecified. Release the bound EGLSurface.
glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level);
texture->Level(level)->boundSurface = NULL;
}
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
GLES_ASSERT(texture != NULL);
const GLESTextureLevel* level_obj = texture->Level(level);
if(isPalettedFormat(level_obj->format))
{
GLES_ERROR(GL_INVALID_OPERATION);
}
GLES_LOCK_READ_SURFACE();
ctx->DGL().glCopyTexSubImage2D (target, level, xoffset, yoffset, x, y, width, height);
GLES_UNLOCK_SURFACE();
if(ctx->GetHostError() == GL_NO_ERROR)
{
GLint genMipmap;
ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
if(level == 0 && genMipmap)
{
GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
GLES_ASSERT(texture != NULL);
texture->GenerateMipmap();
}
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glCullFace (GLenum mode)
{
GLES_ENTER();
ctx->DGL().glCullFace (mode);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers)
{
GLES_ENTER();
GLES_ERROR_IF(n < 0, GL_INVALID_VALUE);
for(int i = 0; i < n; i++)
{
ctx->DeleteBuffer(buffers[i]);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures)
{
GLES_ENTER();
GLES_ERROR_IF(n < 0, GL_INVALID_VALUE);
ctx->GetHostError();
ctx->DGL().glDeleteTextures (n, textures);
if(ctx->GetHostError() == GL_NO_ERROR)
{
for(int i = 0; i < n; i++)
{
ctx->DeleteTexture(textures[i]);
}
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glDepthFunc (GLenum func)
{
GLES_ENTER();
ctx->DGL().glDepthFunc (func);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glDepthMask (GLboolean flag)
{
GLES_ENTER();
ctx->DGL().glDepthMask (flag);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glDepthRangex (GLclampx zNear, GLclampx zFar)
{
GLES_ENTER();
ctx->DGL().glDepthRange(X_TO_D(zNear), X_TO_D(zFar));
GLES_LEAVE();
}
bool isValidCapabilityEnum(GLenum cap)
{
switch(cap)
{
case GL_NORMALIZE:
case GL_RESCALE_NORMAL:
case GL_CLIP_PLANE0:
case GL_CLIP_PLANE1:
case GL_CLIP_PLANE2:
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
case GL_FOG:
case GL_LIGHTING:
case GL_COLOR_MATERIAL:
case GL_LIGHT0:
case GL_LIGHT1:
case GL_LIGHT2:
case GL_LIGHT3:
case GL_LIGHT4:
case GL_LIGHT5:
case GL_LIGHT6:
case GL_LIGHT7:
case GL_POINT_SMOOTH:
case GL_POINT_SPRITE_OES:
case GL_LINE_SMOOTH:
case GL_CULL_FACE:
case GL_POLYGON_OFFSET_FILL:
case GL_MULTISAMPLE:
case GL_SAMPLE_ALPHA_TO_COVERAGE:
case GL_SAMPLE_ALPHA_TO_ONE:
case GL_SAMPLE_COVERAGE:
case GL_TEXTURE_2D:
case GL_SCISSOR_TEST:
case GL_ALPHA_TEST:
case GL_STENCIL_TEST:
case GL_DEPTH_TEST:
case GL_BLEND:
case GL_DITHER:
case GL_COLOR_LOGIC_OP:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glDisable (GLenum cap)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidCapabilityEnum(cap), GL_INVALID_ENUM);
cap = cap == GL_POINT_SPRITE_OES ? GL_POINT_SPRITE : cap;
ctx->DGL().glDisable (cap);
GLES_LEAVE();
}
static GLESArrayFlag mapArrayType(GLenum type)
{
switch(type)
{
case GL_VERTEX_ARRAY:
return GLES_VERTEX_ARRAY;
case GL_NORMAL_ARRAY:
return GLES_NORMAL_ARRAY;
case GL_COLOR_ARRAY:
return GLES_COLOR_ARRAY;
case GL_POINT_SIZE_ARRAY_OES:
return GLES_POINT_SIZE_ARRAY;
case GL_TEXTURE_COORD_ARRAY:
return GLES_TEXTURE_COORD_ARRAY;
default:
return GLES_INVALID_ARRAY;
}
}
GL_API void GL_APIENTRY glDisableClientState (GLenum array)
{
GLES_ENTER();
int flag = static_cast<int>(mapArrayType(array));
GLES_ERROR_IF(flag == GLES_INVALID_ARRAY, GL_INVALID_ENUM);
if(flag == GLES_TEXTURE_COORD_ARRAY)
{
flag <<= ctx->ClientActiveTexture();
}
ctx->DisableArray(static_cast<GLESArrayFlag>(flag));
if(array != GL_POINT_SIZE_ARRAY_OES)
{
ctx->DGL().glDisableClientState(array);
}
GLES_LEAVE();
}
static bool convertArrays(const GLESContext& ctx, GLsizei count, GLESArray** vertexArr, GLESArray** normalArr,
GLESArray** colorArr, GLESArray** texCoordArr)
{
*vertexArr = ctx.VertexArray().Convert(count);
if(*vertexArr == NULL)
{
return false;
}
ctx.DGL().glVertexPointer((*vertexArr)->Size(), (*vertexArr)->Type(), (*vertexArr)->Stride(), (*vertexArr)->Pointer());
if(ctx.IsArrayEnabled(GLES_NORMAL_ARRAY))
{
*normalArr = ctx.NormalArray().Convert(count);
if(*normalArr == NULL)
{
return false;
}
ctx.DGL().glNormalPointer((*normalArr)->Type(), (*normalArr)->Stride(), (*normalArr)->Pointer());
}
if(ctx.IsArrayEnabled(GLES_COLOR_ARRAY))
{
*colorArr = ctx.ColorArray().Convert(count);
if(*colorArr == NULL)
{
return false;
}
ctx.DGL().glColorPointer((*colorArr)->Size(), (*colorArr)->Type(), (*colorArr)->Stride(), (*colorArr)->Pointer());
}
for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++)
{
if(ctx.IsArrayEnabled(static_cast<GLESArrayFlag>(GLES_TEXTURE_COORD_ARRAY << i)))
{
texCoordArr[i] = ctx.TexCoordArray(i).Convert(count);
if(texCoordArr[i] == NULL)
{
return false;
}
ctx.DGL().glClientActiveTexture(GL_TEXTURE0 + i);
ctx.DGL().glTexCoordPointer(texCoordArr[i]->Size(), texCoordArr[i]->Type(),
texCoordArr[i]->Stride(), texCoordArr[i]->Pointer());
}
}
// Reset state
ctx.DGL().glClientActiveTexture(GL_TEXTURE0 + ctx.ClientActiveTexture());
return true;
}
void drawPoint(const GLESContext& ctx, int i, GLESArrayPointer& vertexPtr, GLESArrayPointer& normalPtr,
GLESArrayPointer& colorPtr, GLESArrayPointer& pointSizePtr,
GLESArrayPointer* texCoordPtr)
{
if(normalPtr != NULL)
{
switch(normalPtr.Type())
{
case GL_BYTE:
case GL_SHORT:
ctx.DGL().glNormal3sv(static_cast<const GLshort*>(normalPtr[i]));
break;
case GL_FIXED:
case GL_FLOAT:
ctx.DGL().glNormal3fv(static_cast<const GLfloat*>(normalPtr[i]));
break;
default:
GLES_ASSERT(false);
}
}
if(colorPtr != NULL)
{
switch(colorPtr.Type())
{
case GL_UNSIGNED_BYTE:
ctx.DGL().glColor4ubv(static_cast<const GLubyte*>(colorPtr[i]));
break;
case GL_FIXED:
case GL_FLOAT:
ctx.DGL().glColor4fv(static_cast<const GLfloat*>(colorPtr[i]));
break;
default:
GLES_ASSERT(false);
}
}
GLES_ASSERT(pointSizePtr != NULL);
ctx.DGL().glPointSize(*static_cast<const GLfloat*>(pointSizePtr[i]));
for(unsigned int j = 0; j < ctx.MaxTextureUnits(); j++)
{
int texture = GL_TEXTURE0 + j;
if(texCoordPtr[j] != NULL)
{
switch(texCoordPtr[j].Type())
{
case GL_BYTE:
case GL_SHORT:
switch(texCoordPtr[j].Size())
{
case 2:
ctx.DGL().glMultiTexCoord2sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i]));
break;
case 3:
ctx.DGL().glMultiTexCoord3sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i]));
break;
case 4:
ctx.DGL().glMultiTexCoord4sv(texture, static_cast<const GLshort*>(texCoordPtr[j][i]));
break;
default:
GLES_ASSERT(false);
}
break;
case GL_FIXED:
case GL_FLOAT:
switch(texCoordPtr[j].Size())
{
case 2:
ctx.DGL().glMultiTexCoord2fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i]));
break;
case 3:
ctx.DGL().glMultiTexCoord3fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i]));
break;
case 4:
ctx.DGL().glMultiTexCoord4fv(texture, static_cast<const GLfloat*>(texCoordPtr[j][i]));
break;
default:
GLES_ASSERT(false);
}
break;
default:
GLES_ASSERT(false);
}
}
}
GLES_ASSERT(vertexPtr != NULL);
ctx.DGL().glBegin(GL_POINTS);
switch(vertexPtr.Type())
{
case GL_BYTE:
case GL_SHORT:
switch(vertexPtr.Size())
{
case 2:
ctx.DGL().glVertex2sv(static_cast<const GLshort*>(vertexPtr[i]));
break;
case 3:
ctx.DGL().glVertex3sv(static_cast<const GLshort*>(vertexPtr[i]));
break;
case 4:
ctx.DGL().glVertex4sv(static_cast<const GLshort*>(vertexPtr[i]));
break;
default:
GLES_ASSERT(false);
}
break;
case GL_FIXED:
case GL_FLOAT:
switch(vertexPtr.Size())
{
case 2:
ctx.DGL().glVertex2fv(static_cast<const GLfloat*>(vertexPtr[i]));
break;
case 3:
ctx.DGL().glVertex3fv(static_cast<const GLfloat*>(vertexPtr[i]));
break;
case 4:
ctx.DGL().glVertex4fv(static_cast<const GLfloat*>(vertexPtr[i]));
break;
default:
GLES_ASSERT(false);
}
break;
default:
GLES_ASSERT(false);
}
ctx.DGL().glEnd();
}
bool drawPointArrays(const GLESContext& ctx, int first, int count,
GLESArray* vertexArr, GLESArray* normalArr, GLESArray* colorArr, GLESArray** texCoordArr)
{
GLESArray* pointSizeArr = ctx.PointSizeArray().Convert(count);
if(pointSizeArr == NULL)
{
return false;
}
GLES_ASSERT(vertexArr != NULL);
GLESArrayPointer vertexPtr = vertexArr->ArrayPointer();
GLESArrayPointer normalPtr = normalArr != NULL ? normalArr->ArrayPointer() : GLESArrayPointer();
GLESArrayPointer colorPtr = colorArr != NULL ? colorArr->ArrayPointer() : GLESArrayPointer();
GLESArrayPointer pointSizePtr = pointSizeArr != NULL ? pointSizeArr->ArrayPointer() : GLESArrayPointer();
GLESArrayPointer* texCoordPtr = GLES_NEW GLESArrayPointer[ctx.MaxTextureUnits()];
if(texCoordPtr == NULL)
{
delete pointSizeArr;
return false;
}
for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++)
{
texCoordPtr[i] = texCoordArr[i] != NULL ? texCoordArr[i]->ArrayPointer() : GLESArrayPointer();
}
// Draw individual points
for(int i = first; i < first + count; i++)
{
drawPoint(ctx, i, vertexPtr, normalPtr, colorPtr, pointSizePtr, texCoordPtr);
}
delete[] texCoordPtr;
delete pointSizeArr;
return true;
}
bool drawPointElements(const GLESContext& ctx, int count, GLenum type, const void* indices,
GLESArray* vertexArr, GLESArray* normalArr, GLESArray* colorArr, GLESArray** texCoordArr)
{
GLESArray* pointSizeArr = ctx.PointSizeArray().Convert(count);
if(pointSizeArr == NULL)
{
return false;
}
GLES_ASSERT(vertexArr != NULL);
GLESArrayPointer vertexPtr = vertexArr->ArrayPointer();
GLESArrayPointer normalPtr = normalArr != NULL ? normalArr->ArrayPointer() : GLESArrayPointer();
GLESArrayPointer colorPtr = colorArr != NULL ? colorArr->ArrayPointer() : GLESArrayPointer();
GLESArrayPointer pointSizePtr = pointSizeArr != NULL ? pointSizeArr->ArrayPointer() : GLESArrayPointer();
GLESArrayPointer* texCoordPtr = GLES_NEW GLESArrayPointer[ctx.MaxTextureUnits()];
if(texCoordPtr == NULL)
{
delete pointSizeArr;
return false;
}
for(unsigned int i = 0; i < ctx.MaxTextureUnits(); i++)
{
texCoordPtr[i] = texCoordArr[i] != NULL ? texCoordArr[i]->ArrayPointer() : GLESArrayPointer();
}
// Draw individual points
for(int i = 0; i < count; i++)
{
int index;
switch(type)
{
case GL_UNSIGNED_BYTE:
index = static_cast<const GLubyte*>(indices)[i];
break;
case GL_UNSIGNED_SHORT:
index = static_cast<const GLushort*>(indices)[i];
break;
default:
GLES_ASSERT(false);
}
drawPoint(ctx, index, vertexPtr, normalPtr, colorPtr, pointSizePtr, texCoordPtr);
}
delete[] texCoordPtr;
delete pointSizeArr;
return true;
}
GL_API void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count)
{
GLES_ENTER();
GLES_ERROR_IF(count < 0, GL_INVALID_VALUE);
if(!ctx->IsArrayEnabled(GLES_VERTEX_ARRAY) || !count)
{
// Nothing to draw
GLES_LEAVE();
}
GLESArray* vertexArr = NULL;
GLESArray* normalArr = NULL;
GLESArray* colorArr = NULL;
GLESArray** texCoordArr = GLES_NEW GLESArray*[ctx->MaxTextureUnits()];
for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
{
texCoordArr[i] = NULL;
}
bool oom = !convertArrays(*ctx, count, &vertexArr, &normalArr, &colorArr, texCoordArr);
if(!oom)
{
GLES_LOCK_DRAW_SURFACE();
if(mode == GL_POINTS && ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY))
{
oom = !drawPointArrays(*ctx, first, count, vertexArr, normalArr, colorArr, texCoordArr);
}
else
{
ctx->DGL().glDrawArrays (mode, first, count);
}
GLES_UNLOCK_SURFACE();
}
for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
{
delete texCoordArr[i];
}
delete colorArr;
delete normalArr;
delete vertexArr;
delete[] texCoordArr;
if(oom)
{
GLES_ERROR(GL_OUT_OF_MEMORY);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
{
GLES_ENTER();
GLES_ERROR_IF(count < 0, GL_INVALID_VALUE);
GLES_ERROR_IF(type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_SHORT, GL_INVALID_ENUM);
if(!ctx->IsArrayEnabled(GLES_VERTEX_ARRAY) || !count)
{
// Nothing to draw
GLES_LEAVE();
}
GLESArray* vertexArr = NULL;
GLESArray* normalArr = NULL;
GLESArray* colorArr = NULL;
GLESArray** texCoordArr = GLES_NEW GLESArray*[ctx->MaxTextureUnits()];
for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
{
texCoordArr[i] = NULL;
}
bool oom = !convertArrays(*ctx, count, &vertexArr, &normalArr, &colorArr, texCoordArr);
if(!oom)
{
if(indices == NULL && ctx->ElementArrayBufferBinding())
{
indices = ctx->ElementArrayBuffer()->data;
}
GLES_LOCK_DRAW_SURFACE();
if(mode == GL_POINTS && ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY))
{
oom = !drawPointElements(*ctx, count, type, indices,
vertexArr, normalArr, colorArr, texCoordArr);
}
else
{
ctx->DGL().glDrawElements (mode, count, type, indices);
}
GLES_UNLOCK_SURFACE();
}
for(unsigned int i = 0; i < ctx->MaxTextureUnits(); i++)
{
delete texCoordArr[i];
}
delete colorArr;
delete normalArr;
delete vertexArr;
delete[] texCoordArr;
if(oom)
{
GLES_ERROR(GL_OUT_OF_MEMORY);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glEnable (GLenum cap)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidCapabilityEnum(cap), GL_INVALID_ENUM);
ctx->DGL().glEnable (cap);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glEnableClientState (GLenum array)
{
GLES_ENTER();
array = array == GL_POINT_SIZE_ARRAY_OES ? GL_POINT_SIZE_ARRAY : array;
int flag = static_cast<int>(mapArrayType(array));
GLES_ERROR_IF(flag == GLES_INVALID_ARRAY, GL_INVALID_ENUM);
if(flag == GLES_TEXTURE_COORD_ARRAY)
{
flag <<= ctx->ClientActiveTexture();
}
ctx->EnableArray(static_cast<GLESArrayFlag>(flag));
if(array != GL_POINT_SIZE_ARRAY_OES)
{
ctx->DGL().glEnableClientState(array);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFinish (void)
{
GLES_ENTER();
ctx->DGL().glFinish();
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFlush (void)
{
GLES_ENTER();
ctx->DGL().glFlush();
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFogx (GLenum pname, GLfixed param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidSingleValuedFogParamEnum(pname), GL_INVALID_ENUM);
if(pname == GL_FOG_MODE)
{
ctx->DGL().glFogf(pname, static_cast<GLfloat>(param));
}
else
{
ctx->DGL().glFogf(pname, X_TO_F(param));
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFogxv (GLenum pname, const GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidFogParamEnum(pname), GL_INVALID_ENUM);
if(pname == GL_FOG_MODE)
{
GLfloat fparam = static_cast<GLfloat>(params[0]);
ctx->DGL().glFogfv (pname, &fparam);
}
else
{
GLfloat fparams[4];
fparams[0] = X_TO_F(params[0]);
if (pname == GL_FOG_COLOR)
{
fparams[1] = X_TO_F(params[1]);
fparams[2] = X_TO_F(params[2]);
fparams[3] = X_TO_F(params[3]);
}
ctx->DGL().glFogfv (pname, fparams);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFrontFace (GLenum mode)
{
GLES_ENTER();
ctx->DGL().glFrontFace (mode);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glFrustumx (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
{
GLES_ENTER();
ctx->DGL().glFrustum (X_TO_D(left), X_TO_D(right), X_TO_D(bottom), X_TO_D(top), X_TO_D(zNear), X_TO_D(zFar));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *params)
{
GLES_ENTER();
if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_BOOLEAN, params))
{
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidBufferTarget(target), GL_INVALID_ENUM);
const GLESBuffer* buffer;
switch(target)
{
case GL_ARRAY_BUFFER:
buffer = ctx->ArrayBuffer();
break;
case GL_ELEMENT_ARRAY_BUFFER:
buffer = ctx->ElementArrayBuffer();
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
switch(pname)
{
case GL_BUFFER_SIZE:
*params = buffer->size;
break;
case GL_BUFFER_USAGE:
*params = buffer->usage;
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetClipPlanex (GLenum pname, GLfixed eqn[4])
{
GLES_ENTER();
GLES_ERROR_IF(pname < GL_CLIP_PLANE0 || pname >= GL_CLIP_PLANE0 + ctx->MaxClipPlanes(), GL_INVALID_ENUM);
GLdouble deqn[4];
ctx->DGL().glGetClipPlane(pname, deqn);
for (int i = 0; i < 4; i++)
{
eqn[i] = D_TO_X(deqn[i]);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers)
{
GLES_ENTER();
GLES_ERROR_IF(n < 0, GL_INVALID_VALUE);
ctx->ReserveBufferNames(n, buffers);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures)
{
GLES_ENTER();
ctx->DGL().glGenTextures (n, textures);
GLES_LEAVE();
}
GL_API GLenum GL_APIENTRY glGetError (void)
{
GLES_ENTER_RET(GL_INVALID_OPERATION);
GLenum error = ctx->Error();
ctx->SetError(GL_NO_ERROR);
GLES_LEAVE_RET(error);
}
GL_API void GL_APIENTRY glGetFixedv (GLenum pname, GLfixed *params)
{
GLES_ENTER();
if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_FIXED, params))
{
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *params)
{
GLES_ENTER();
if(!glesGetParameter(*ctx, ctx->DGL(), pname, GLES_TYPE_INTEGER, params))
{
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
bool isValidLightEnum(GLenum light, unsigned int maxLights)
{
return light >= GL_LIGHT0 && light < GL_LIGHT0 + maxLights;
}
GL_API void GL_APIENTRY glGetLightxv (GLenum light, GLenum pname, GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM);
float fparams[4];
ctx->DGL().glGetLightfv(light, pname, fparams);
switch (pname)
{
case GL_AMBIENT:
case GL_DIFFUSE:
case GL_SPECULAR:
case GL_POSITION:
params[3] = F_TO_X(fparams[3]);
case GL_SPOT_DIRECTION:
params[2] = F_TO_X(fparams[2]);
params[1] = F_TO_X(fparams[1]);
case GL_SPOT_EXPONENT:
case GL_SPOT_CUTOFF:
case GL_CONSTANT_ATTENUATION:
case GL_LINEAR_ATTENUATION:
case GL_QUADRATIC_ATTENUATION:
params[0] = F_TO_X(fparams[0]);
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetMaterialxv (GLenum face, GLenum pname, GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM);
GLfloat fparams[4];
ctx->DGL().glGetMaterialfv (face, pname, fparams);
params[0] = F_TO_X(fparams[0]);
if(pname != GL_SHININESS)
{
params[1] = F_TO_X(fparams[1]);
params[2] = F_TO_X(fparams[2]);
params[3] = F_TO_X(fparams[3]);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetPointerv (GLenum pname, GLvoid **params)
{
GLES_ENTER();
switch(pname)
{
case GL_VERTEX_ARRAY_POINTER:
*params = const_cast<GLvoid*>(ctx->VertexArray().Pointer());
break;
case GL_NORMAL_ARRAY_POINTER:
*params = const_cast<GLvoid*>(ctx->NormalArray().Pointer());
break;
case GL_COLOR_ARRAY_POINTER:
*params = const_cast<GLvoid*>(ctx->ColorArray().Pointer());
break;
case GL_POINT_SIZE_ARRAY_POINTER_OES:
*params = const_cast<GLvoid*>(ctx->PointSizeArray().Pointer());
break;
case GL_TEXTURE_COORD_ARRAY_POINTER:
*params = const_cast<GLvoid*>(ctx->TexCoordArray().Pointer());
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API const GLubyte * GL_APIENTRY glGetString (GLenum name)
{
GLES_ENTER_RET(NULL);
static const GLubyte vendor[] = "Nokia";
static const GLubyte renderer[] = "OpenGL ES-CM 1.1";
static const GLubyte version[] = "OpenGL ES-CM 1.1";
static const GLubyte extensions[] = "GL_OES_read_format GL_OES_compressed_paletted_texture "
"GL_OES_point_size_array GL_OES_point_sprite";
const GLubyte* str = NULL;
switch(name)
{
case GL_VENDOR:
str = vendor;
break;
case GL_RENDERER:
str = renderer;
break;
case GL_VERSION:
str = version;
break;
case GL_EXTENSIONS:
str = extensions;
break;
default:
GLES_ERROR_RET(GL_INVALID_ENUM, NULL);
break;
}
GLES_LEAVE_RET(str);
}
GL_API void GL_APIENTRY glGetTexEnviv (GLenum env, GLenum pname, GLint *params)
{
GLES_ENTER();
pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
ctx->DGL().glGetTexEnviv (env, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetTexEnvxv (GLenum env, GLenum pname, GLfixed *params)
{
GLES_ENTER();
GLfloat fparams[4];
pname = pname == GL_COORD_REPLACE_OES ? GL_COORD_REPLACE : pname;
switch (pname)
{
case GL_TEXTURE_ENV_COLOR:
ctx->DGL().glGetTexEnvfv(env, pname, fparams);
params[0] = F_TO_X(fparams[0]);
params[1] = F_TO_X(fparams[1]);
params[2] = F_TO_X(fparams[2]);
params[3] = F_TO_X(fparams[3]);
break;
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
ctx->DGL().glGetTexEnvfv(env, pname, fparams);
params[0] = F_TO_X(fparams[0]);
break;
case GL_COMBINE_RGB:
case GL_COMBINE_ALPHA:
case GL_COORD_REPLACE:
case GL_TEXTURE_ENV_MODE:
case GL_SRC0_RGB:
case GL_SRC0_ALPHA:
case GL_SRC1_RGB:
case GL_SRC1_ALPHA:
case GL_SRC2_RGB:
case GL_SRC2_ALPHA:
case GL_OPERAND0_RGB:
case GL_OPERAND0_ALPHA:
case GL_OPERAND1_RGB:
case GL_OPERAND1_ALPHA:
case GL_OPERAND2_RGB:
case GL_OPERAND2_ALPHA:
{
GLint i;
ctx->DGL().glGetTexEnviv(env, pname, &i);
params[0] = static_cast<GLfixed>(i);
}
break;
default:
GLES_ERROR(GL_INVALID_ENUM);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glGetTexParameteriv (target, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glGetTexParameterxv (GLenum target, GLenum pname, GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
// All parameters are enum values, no conversion to be done.
ctx->DGL().glGetTexParameteriv (target, pname, params);
GLES_LEAVE();
}
bool isValidHintEnum(GLenum hint)
{
switch(hint)
{
case GL_PERSPECTIVE_CORRECTION_HINT:
case GL_POINT_SMOOTH_HINT:
case GL_LINE_SMOOTH_HINT:
case GL_FOG_HINT:
case GL_GENERATE_MIPMAP_HINT:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glHint (GLenum target, GLenum mode)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidHintEnum(target), GL_INVALID_ENUM);
ctx->DGL().glHint (target, mode);
GLES_LEAVE();
}
GL_API GLboolean GL_APIENTRY glIsBuffer (GLuint buffer)
{
GLES_ENTER_RET(GL_FALSE);
return ctx->Buffer(buffer) != NULL;
GLES_LEAVE_RET(GL_FALSE);
}
GL_API GLboolean GL_APIENTRY glIsEnabled (GLenum cap)
{
GLES_ENTER_RET(GL_FALSE);
switch(cap)
{
case GL_VERTEX_ARRAY:
return ctx->IsArrayEnabled(GLES_VERTEX_ARRAY);
case GL_NORMAL_ARRAY:
return ctx->IsArrayEnabled(GLES_NORMAL_ARRAY);
case GL_COLOR_ARRAY:
return ctx->IsArrayEnabled(GLES_COLOR_ARRAY);
case GL_POINT_SIZE_ARRAY_OES:
return ctx->IsArrayEnabled(GLES_POINT_SIZE_ARRAY);
case GL_TEXTURE_COORD_ARRAY:
{
int flag = static_cast<int>(GLES_TEXTURE_COORD_ARRAY);
flag <<= ctx->ClientActiveTexture();
return ctx->IsArrayEnabled(static_cast<GLESArrayFlag>(flag));
}
case GL_POINT_SPRITE_OES:
return ctx->DGL().glIsEnabled(GL_POINT_SPRITE);
default:
GLES_ERROR_IF_RET(!isValidCapabilityEnum(cap), GL_INVALID_ENUM, GL_FALSE);
return ctx->DGL().glIsEnabled(cap);
}
GLES_LEAVE_RET(ctx->DGL().glIsEnabled (cap));
}
GL_API GLboolean GL_APIENTRY glIsTexture (GLuint texture)
{
GLES_ENTER_RET(GL_FALSE);
GLES_LEAVE_RET(ctx->DGL().glIsTexture (texture));
}
GL_API void GL_APIENTRY glLightModelx (GLenum pname, GLfixed param)
{
GLES_ENTER();
GLES_ERROR_IF(pname != GL_LIGHT_MODEL_TWO_SIDE, GL_INVALID_ENUM);
ctx->DGL().glLightModelf (pname, static_cast<GLfloat>(param));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLightModelxv (GLenum pname, const GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidLightModelParamEnum(pname), GL_INVALID_ENUM);
if(pname == GL_LIGHT_MODEL_TWO_SIDE)
{
GLfloat fparam = static_cast<GLfloat>(params[0]);
ctx->DGL().glLightModelfv (pname, &fparam);
}
else
{
GLfloat fparams[4];
fparams[0] = X_TO_F(params[0]);
if(pname == GL_LIGHT_MODEL_AMBIENT)
{
fparams[1] = X_TO_F(params[1]);
fparams[2] = X_TO_F(params[2]);
fparams[3] = X_TO_F(params[3]);
}
ctx->DGL().glLightModelfv (pname, fparams);
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLightx (GLenum light, GLenum pname, GLfixed param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM);
ctx->DGL().glLightf (light, pname, X_TO_F(param));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLightxv (GLenum light, GLenum pname, const GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidLightEnum(light, ctx->MaxLights()), GL_INVALID_ENUM);
GLfloat fparams[4];
switch(pname)
{
case GL_AMBIENT:
case GL_DIFFUSE:
case GL_SPECULAR:
case GL_POSITION:
fparams[3] = X_TO_F(params[3]);
case GL_SPOT_DIRECTION:
fparams[2] = X_TO_F(params[2]);
fparams[1] = X_TO_F(params[1]);
break;
}
fparams[0] = X_TO_F(params[0]);
ctx->DGL().glLightfv (light, pname, fparams);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLineWidthx (GLfixed width)
{
GLES_ENTER();
ctx->DGL().glLineWidth (X_TO_F(width));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLoadIdentity (void)
{
GLES_ENTER();
ctx->DGL().glLoadIdentity ();
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLoadMatrixx (const GLfixed *m)
{
GLES_ENTER();
GLfloat fm[16];
for(int i = 0; i < 16; i++)
{
fm[i] = X_TO_F(m[i]);
}
ctx->DGL().glLoadMatrixf (fm);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glLogicOp (GLenum opcode)
{
GLES_ENTER();
ctx->DGL().glLogicOp (opcode);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glMaterialx (GLenum face, GLenum pname, GLfixed param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidSingleValuedMaterialParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glMaterialf (face, pname, X_TO_F(param));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glMaterialxv (GLenum face, GLenum pname, const GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidMaterialParamEnum(pname), GL_INVALID_ENUM);
GLfloat fparams[4];
for(int i = 0; i < 4; i++)
{
fparams[i] = X_TO_F(params[i]);
}
ctx->DGL().glMaterialfv (face, pname, fparams);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glMatrixMode (GLenum mode)
{
GLES_ENTER();
ctx->DGL().glMatrixMode (mode);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glMultMatrixx (const GLfixed *m)
{
GLES_ENTER();
GLfloat fm[16];
for(int i = 0; i < 16; i++)
{
fm[i] = X_TO_F(m[i]);
}
ctx->DGL().glMultMatrixf (fm);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glMultiTexCoord4x (GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTextureTargetEnum(target, ctx->MaxTextureUnits()), GL_INVALID_ENUM);
ctx->DGL().glMultiTexCoord4f (target, X_TO_F(s), X_TO_F(t), X_TO_F(r), X_TO_F(q));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glNormal3x (GLfixed nx, GLfixed ny, GLfixed nz)
{
GLES_ENTER();
ctx->DGL().glNormal3f (X_TO_F(nx), X_TO_F(ny), X_TO_F(nz));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer)
{
GLES_ENTER();
GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
ctx->SetNormalArray(type, stride, pointer);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glOrthox (GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar)
{
GLES_ENTER();
ctx->DGL().glOrtho (X_TO_D(left), X_TO_D(right), X_TO_D(bottom), X_TO_D(top), X_TO_D(zNear), X_TO_D(zFar));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPixelStorei (GLenum pname, GLint param)
{
GLES_ENTER();
ctx->DGL().glPixelStorei (pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPointParameterx (GLenum pname, GLfixed param)
{
GLES_ENTER();
ctx->DGL().glPointParameterf (pname, X_TO_F(param));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPointParameterxv (GLenum pname, const GLfixed *params)
{
GLES_ENTER();
GLfloat fparams[3];
fparams[0] = X_TO_F(params[0]);
if(pname == GL_POINT_DISTANCE_ATTENUATION)
{
fparams[1] = X_TO_F(params[1]);
fparams[2] = X_TO_F(params[2]);
}
ctx->DGL().glPointParameterfv (pname, fparams);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPointSizex (GLfixed size)
{
GLES_ENTER();
ctx->DGL().glPointSize (X_TO_F(size));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPolygonOffsetx (GLfixed factor, GLfixed units)
{
GLES_ENTER();
ctx->DGL().glPolygonOffset (X_TO_F(factor), X_TO_F(units));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPopMatrix (void)
{
GLES_ENTER();
ctx->DGL().glPopMatrix();
GLES_LEAVE();
}
GL_API void GL_APIENTRY glPushMatrix (void)
{
GLES_ENTER();
ctx->DGL().glPushMatrix();
GLES_LEAVE();
}
bool isValidPixelTypeEnum(GLenum type)
{
switch(type)
{
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_SHORT_5_6_5:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_5_5_5_1:
return true;
default:
return false;
}
}
GL_API void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM);
GLES_LOCK_READ_SURFACE();
ctx->DGL().glReadPixels (x, y, width, height, format, type, pixels);
GLES_UNLOCK_SURFACE();
GLES_LEAVE();
}
GL_API void GL_APIENTRY glRotatex (GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
{
GLES_ENTER();
ctx->DGL().glRotatef (X_TO_F(angle), X_TO_F(x), X_TO_F(y), X_TO_F(z));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glSampleCoverage (GLclampf value, GLboolean invert)
{
GLES_ENTER();
ctx->DGL().glSampleCoverage (value, invert);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glSampleCoveragex (GLclampx value, GLboolean invert)
{
GLES_ENTER();
ctx->DGL().glSampleCoverage (X_TO_F(value), invert);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glScalex (GLfixed x, GLfixed y, GLfixed z)
{
GLES_ENTER();
ctx->DGL().glScalef (X_TO_F(x), X_TO_F(y), X_TO_F(z));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height)
{
GLES_ENTER();
ctx->DGL().glScissor (x, y, width, height);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glShadeModel (GLenum mode)
{
GLES_ENTER();
ctx->DGL().glShadeModel (mode);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask)
{
GLES_ENTER();
ctx->DGL().glStencilFunc (func, ref, mask);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glStencilMask (GLuint mask)
{
GLES_ENTER();
ctx->DGL().glStencilMask (mask);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass)
{
GLES_ENTER();
ctx->DGL().glStencilOp (fail, zfail, zpass);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
GLES_ENTER();
GLES_ERROR_IF(size != 2 && size != 3 && size != 4, GL_INVALID_VALUE);
GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
ctx->SetTexCoordArray(size, type, stride, pointer);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidSingleValuedTexEnvParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glTexEnvi (target, pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexEnvx (GLenum target, GLenum pname, GLfixed param)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidSingleValuedTexEnvParamEnum(pname), GL_INVALID_ENUM);
GLfloat fparam;
if(target == GL_TEXTURE_ENV && (pname == GL_RGB_SCALE || pname == GL_ALPHA_SCALE))
{
fparam = X_TO_F(param);
}
else
{
fparam = static_cast<GLfloat>(param);
}
ctx->DGL().glTexEnvf (target, pname, fparam);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glTexEnviv (target, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexEnvxv (GLenum target, GLenum pname, const GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidTexEnvTargetEnum(target), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexEnvParamEnum(pname), GL_INVALID_ENUM);
GLfloat fparams[4];
switch(pname)
{
case GL_TEXTURE_ENV_COLOR:
fparams[3] = X_TO_F(params[3]);
fparams[2] = X_TO_F(params[2]);
fparams[1] = X_TO_F(params[1]);
// fall-through
case GL_RGB_SCALE:
case GL_ALPHA_SCALE:
fparams[0] = X_TO_F(params[0]);
break;
default:
fparams[0] = static_cast<GLfloat>(params[0]);
}
ctx->DGL().glTexEnvfv (target, pname, fparams);
GLES_LEAVE();
}
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)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidPixelFormatEnum(internalformat), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM);
GLES_ERROR_IF(internalformat != format, GL_INVALID_ENUM);
GLES_ERROR_IF(isPalettedFormat(internalformat), GL_INVALID_OPERATION);
ctx->DGL().glTexImage2D (target, level, internalformat, width, height, border, format, type, pixels);
if(ctx->GetHostError() == GL_NO_ERROR)
{
GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
GLES_ASSERT(texture != NULL);
texture->SetLevel(level, internalformat, width, height);
GLint genMipmap;
ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
if(level == 0 && genMipmap)
{
GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
GLES_ASSERT(texture != NULL);
texture->GenerateMipmap();
}
if(texture->Level(level)->boundSurface != NULL)
{
// Texture is respecified. Release the bound EGLSurface.
glesReleaseTexImage(texture->Level(level)->boundSurface, texture->Name(), level);
texture->Level(level)->boundSurface = NULL;
}
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glTexParameteri (target, pname, param);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexParameterx (GLenum target, GLenum pname, GLfixed param)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glTexParameterf (target, pname, static_cast<GLfloat>(param));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
ctx->DGL().glTexParameteriv (target, pname, params);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTexParameterxv (GLenum target, GLenum pname, const GLfixed *params)
{
GLES_ENTER();
GLES_ERROR_IF(target != GL_TEXTURE_2D, GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidTexParamEnum(pname), GL_INVALID_ENUM);
GLfloat fparam = static_cast<GLfloat>(params[0]);
ctx->DGL().glTexParameterfv (target, pname, &fparam);
GLES_LEAVE();
}
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)
{
GLES_ENTER();
GLES_ERROR_IF(!isValidPixelFormatEnum(format), GL_INVALID_ENUM);
GLES_ERROR_IF(!isValidPixelTypeEnum(type), GL_INVALID_ENUM);
ctx->DGL().glTexSubImage2D (target, level, xoffset, yoffset, width, height, format, type, pixels);
if(ctx->GetHostError() == GL_NO_ERROR)
{
GLint genMipmap;
ctx->DGL().glGetTexParameteriv(target, GL_GENERATE_MIPMAP, &genMipmap);
if(level == 0 && genMipmap)
{
GLESTexture* texture = ctx->Texture(ctx->TextureBinding());
GLES_ASSERT(texture != NULL);
texture->GenerateMipmap();
}
}
GLES_LEAVE();
}
GL_API void GL_APIENTRY glTranslatex (GLfixed x, GLfixed y, GLfixed z)
{
GLES_ENTER();
ctx->DGL().glTranslatef (X_TO_F(x), X_TO_F(y), X_TO_F(z));
GLES_LEAVE();
}
GL_API void GL_APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
{
GLES_ENTER();
GLES_ERROR_IF(size != 2 && size != 3 && size != 4, GL_INVALID_VALUE);
GLES_ERROR_IF(type != GL_BYTE && type != GL_SHORT && type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
ctx->SetVertexArray(size, type, stride, pointer);
GLES_LEAVE();
}
GL_API void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height)
{
GLES_ENTER();
ctx->DGL().glViewport (x, y, width, height);
GLES_LEAVE();
}
#ifdef GL_OES_point_size_array
GL_API void GL_APIENTRY glPointSizePointerOES (GLenum type, GLsizei stride, const GLvoid *pointer)
{
GLES_ENTER();
GLES_ERROR_IF(type != GL_FIXED && type != GL_FLOAT, GL_INVALID_ENUM);
GLES_ERROR_IF(stride < 0, GL_INVALID_VALUE);
ctx->SetPointerSizeArray(type, stride, pointer);
GLES_LEAVE();
}
#endif
#ifdef __cplusplus
}
#endif