aboutsummaryrefslogtreecommitdiffstats
path: root/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp')
-rw-r--r--emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp2243
1 files changed, 0 insertions, 2243 deletions
diff --git a/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp b/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
deleted file mode 100644
index 7f4cd4f..0000000
--- a/emulator/opengl/host/libs/Translator/GLES_V2/GLESv2Imp.cpp
+++ /dev/null
@@ -1,2243 +0,0 @@
-/*
-* Copyright (C) 2011 The Android Open Source Project
-*
-* Licensed under the Apache License, Version 2.0 (the "License")
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#ifdef _WIN32
-#undef GL_APICALL
-#define GL_API __declspec(dllexport)
-#define GL_APICALL __declspec(dllexport)
-#endif
-
-#define GL_GLEXT_PROTOTYPES
-#include <stdio.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <GLcommon/TranslatorIfaces.h>
-#include <GLcommon/gldefs.h>
-#include "GLESv2Context.h"
-#include "GLESv2Validate.h"
-#include "ShaderParser.h"
-#include "ProgramData.h"
-#include <GLcommon/TextureUtils.h>
-#include <GLcommon/FramebufferData.h>
-
-extern "C" {
-
-//decleration
-static void initContext(GLEScontext* ctx,ShareGroupPtr grp);
-static void deleteGLESContext(GLEScontext* ctx);
-static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp);
-static GLEScontext* createGLESContext();
-static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName);
-
-}
-
-/************************************** GLES EXTENSIONS *********************************************************/
-//extentions descriptor
-typedef std::map<std::string, __translatorMustCastToProperFunctionPointerType> ProcTableMap;
-ProcTableMap *s_glesExtensions = NULL;
-/****************************************************************************************************************/
-
-static EGLiface* s_eglIface = NULL;
-static GLESiface s_glesIface = {
- createGLESContext:createGLESContext,
- initContext :initContext,
- deleteGLESContext:deleteGLESContext,
- flush :(FUNCPTR)glFlush,
- finish :(FUNCPTR)glFinish,
- setShareGroup :setShareGroup,
- getProcAddress :getProcAddress
-};
-
-#include <GLcommon/GLESmacros.h>
-
-extern "C" {
-
-static void initContext(GLEScontext* ctx,ShareGroupPtr grp) {
- if (!ctx->isInitialized()) {
- ctx->setShareGroup(grp);
- ctx->init();
- glBindTexture(GL_TEXTURE_2D,0);
- glBindTexture(GL_TEXTURE_CUBE_MAP,0);
- }
-}
-static GLEScontext* createGLESContext() {
- return new GLESv2Context();
-}
-
-static void deleteGLESContext(GLEScontext* ctx) {
- delete ctx;
-}
-
-static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp) {
- if(ctx) {
- ctx->setShareGroup(grp);
- }
-}
-
-static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName) {
- GET_CTX_RET(NULL)
- ctx->getGlobalLock();
- static bool proc_table_initialized = false;
- if (!proc_table_initialized) {
- proc_table_initialized = true;
- if (!s_glesExtensions)
- s_glesExtensions = new ProcTableMap();
- else
- s_glesExtensions->clear();
- (*s_glesExtensions)["glEGLImageTargetTexture2DOES"] = (__translatorMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES;
- (*s_glesExtensions)["glEGLImageTargetRenderbufferStorageOES"]=(__translatorMustCastToProperFunctionPointerType)glEGLImageTargetRenderbufferStorageOES;
- }
- __translatorMustCastToProperFunctionPointerType ret=NULL;
- ProcTableMap::iterator val = s_glesExtensions->find(procName);
- if (val!=s_glesExtensions->end())
- ret = val->second;
- ctx->releaseGlobalLock();
-
- return ret;
-}
-
-GL_APICALL GLESiface* __translator_getIfaces(EGLiface* eglIface){
- s_eglIface = eglIface;
- return & s_glesIface;
-}
-
-}
-
-static void s_attachShader(GLEScontext* ctx, GLuint program, GLuint shader) {
- if (ctx && program && shader && ctx->shareGroup().Ptr()) {
- ObjectDataPtr shaderData = ctx->shareGroup()->getObjectData(SHADER,shader);
- if (!shaderData.Ptr()) return;
- ShaderParser* shaderParser = (ShaderParser*)shaderData.Ptr();
- shaderParser->setAttachedProgram(program);
- }
-}
-
-static void s_detachShader(GLEScontext* ctx, GLuint shader) {
- if (ctx && shader && ctx->shareGroup().Ptr()) {
- ObjectDataPtr shaderData = ctx->shareGroup()->getObjectData(SHADER,shader);
- if (!shaderData.Ptr()) return;
- ShaderParser* shaderParser = (ShaderParser*)shaderData.Ptr();
- shaderParser->setAttachedProgram(0);
- if (shaderParser->getDeleteStatus()) {
- ctx->shareGroup()->deleteName(SHADER, shader);
- }
- }
-}
-
-static ObjectLocalName TextureLocalName(GLenum target,unsigned int tex) {
- GET_CTX_RET(0);
- return (tex!=0? tex : ctx->getDefaultTextureName(target));
-}
-
-static TextureData* getTextureData(ObjectLocalName tex) {
- GET_CTX_RET(NULL);
- TextureData *texData = NULL;
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex);
- if(!objData.Ptr()){
- texData = new TextureData();
- ctx->shareGroup()->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
- } else {
- texData = (TextureData*)objData.Ptr();
- }
- return texData;
-}
-
-static TextureData* getTextureTargetData(GLenum target){
- GET_CTX_RET(NULL);
- unsigned int tex = ctx->getBindedTexture(target);
- return getTextureData(TextureLocalName(target,tex));
-}
-
-GL_APICALL void GL_APIENTRY glActiveTexture(GLenum texture){
- GET_CTX_V2();
- SET_ERROR_IF (!GLESv2Validate::textureEnum(texture,ctx->getMaxTexUnits()),GL_INVALID_ENUM);
- ctx->setActiveTexture(texture);
- ctx->dispatcher().glActiveTexture(texture);
-}
-
-GL_APICALL void GL_APIENTRY glAttachShader(GLuint program, GLuint shader){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
-
- ObjectDataPtr programData = ctx->shareGroup()->getObjectData(SHADER,program);
- ObjectDataPtr shaderData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(!shaderData.Ptr() || !programData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(!(shaderData.Ptr()->getDataType() ==SHADER_DATA) ||
- !(programData.Ptr()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION);
-
- GLenum shaderType = ((ShaderParser*)shaderData.Ptr())->getType();
- ProgramData* pData = (ProgramData*)programData.Ptr();
- SET_ERROR_IF((pData->getAttachedShader(shaderType)!=0), GL_INVALID_OPERATION);
- pData->attachShader(shader,shaderType);
- s_attachShader(ctx, program, shader);
- ctx->dispatcher().glAttachShader(globalProgramName,globalShaderName);
- }
-}
-
-GL_APICALL void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::attribName(name),GL_INVALID_OPERATION);
- SET_ERROR_IF(!GLESv2Validate::attribIndex(index),GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
-
- ctx->dispatcher().glBindAttribLocation(globalProgramName,index,name);
- }
-}
-
-GL_APICALL void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM);
- //if buffer wasn't generated before,generate one
- if(buffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(VERTEXBUFFER,buffer)){
- ctx->shareGroup()->genName(VERTEXBUFFER,buffer);
- ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer()));
- }
- ctx->bindBuffer(target,buffer);
- if (buffer) {
- GLESbuffer* vbo = (GLESbuffer*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).Ptr();
- vbo->setBinded();
- }
-}
-
-GL_APICALL void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::framebufferTarget(target),GL_INVALID_ENUM);
-
- GLuint globalFrameBufferName = framebuffer;
- if(framebuffer && ctx->shareGroup().Ptr()){
- globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer);
- //if framebuffer wasn't generated before,generate one
- if(!globalFrameBufferName){
- ctx->shareGroup()->genName(FRAMEBUFFER,framebuffer);
- ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffer,
- ObjectDataPtr(new FramebufferData(framebuffer)));
- globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer);
- }
- }
- ctx->dispatcher().glBindFramebufferEXT(target,globalFrameBufferName);
-
- // update framebuffer binding state
- ctx->setFramebufferBinding(framebuffer);
-}
-
-GL_APICALL void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::renderbufferTarget(target),GL_INVALID_ENUM);
-
- GLuint globalRenderBufferName = renderbuffer;
- if(renderbuffer && ctx->shareGroup().Ptr()){
- globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
- //if renderbuffer wasn't generated before,generate one
- if(!globalRenderBufferName){
- ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
- ctx->shareGroup()->setObjectData(RENDERBUFFER,
- renderbuffer,
- ObjectDataPtr(new RenderbufferData()));
- globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
- }
- }
- ctx->dispatcher().glBindRenderbufferEXT(target,globalRenderBufferName);
-
- // update renderbuffer binding state
- ctx->setRenderbufferBinding(renderbuffer);
-}
-
-GL_APICALL void GL_APIENTRY glBindTexture(GLenum target, GLuint texture){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::textureTarget(target),GL_INVALID_ENUM)
-
- //for handling default texture (0)
- ObjectLocalName localTexName = TextureLocalName(target,texture);
-
- GLuint globalTextureName = localTexName;
- if(ctx->shareGroup().Ptr()){
- globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
- //if texture wasn't generated before,generate one
- if(!globalTextureName){
- ctx->shareGroup()->genName(TEXTURE,localTexName);
- globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName);
- }
-
- TextureData* texData = getTextureData(localTexName);
- if (texData->target==0)
- texData->target = target;
- //if texture was already bound to another target
- SET_ERROR_IF(ctx->GLTextureTargetToLocal(texData->target) != ctx->GLTextureTargetToLocal(target), GL_INVALID_OPERATION);
- texData->wasBound = true;
- }
-
- ctx->setBindedTexture(target,texture);
- ctx->dispatcher().glBindTexture(target,globalTextureName);
-}
-
-GL_APICALL void GL_APIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){
- GET_CTX();
- ctx->dispatcher().glBlendColor(red,green,blue,alpha);
-}
-
-GL_APICALL void GL_APIENTRY glBlendEquation( GLenum mode ){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::blendEquationMode(mode),GL_INVALID_ENUM)
- ctx->dispatcher().glBlendEquation(mode);
-}
-
-GL_APICALL void GL_APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::blendEquationMode(modeRGB) && GLESv2Validate::blendEquationMode(modeAlpha)),GL_INVALID_ENUM);
- ctx->dispatcher().glBlendEquationSeparate(modeRGB,modeAlpha);
-}
-
-GL_APICALL void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::blendSrc(sfactor) || !GLESv2Validate::blendDst(dfactor),GL_INVALID_ENUM)
- ctx->dispatcher().glBlendFunc(sfactor,dfactor);
-}
-
-GL_APICALL void GL_APIENTRY glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha){
- GET_CTX();
- SET_ERROR_IF(
-!(GLESv2Validate::blendSrc(srcRGB) && GLESv2Validate::blendDst(dstRGB) && GLESv2Validate::blendSrc(srcAlpha) && GLESv2Validate::blendDst(dstAlpha)),GL_INVALID_ENUM);
- ctx->dispatcher().glBlendFuncSeparate(srcRGB,dstRGB,srcAlpha,dstAlpha);
-}
-
-GL_APICALL void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM);
- SET_ERROR_IF(!GLESv2Validate::bufferUsage(usage),GL_INVALID_ENUM);
- SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION);
- ctx->setBufferData(target,size,data,usage);
-}
-
-GL_APICALL void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data){
- GET_CTX();
- SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION);
- SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM);
- SET_ERROR_IF(!ctx->setBufferSubData(target,offset,size,data),GL_INVALID_VALUE);
-}
-
-
-GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target){
- GET_CTX_RET(GL_FRAMEBUFFER_COMPLETE);
- RET_AND_SET_ERROR_IF(!GLESv2Validate::framebufferTarget(target),GL_INVALID_ENUM,GL_FRAMEBUFFER_COMPLETE);
- ctx->drawValidate();
- return ctx->dispatcher().glCheckFramebufferStatusEXT(target);
-}
-
-GL_APICALL void GL_APIENTRY glClear(GLbitfield mask){
- GET_CTX();
- GLbitfield allowed_bits = GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
- GLbitfield has_disallowed_bits = (mask & ~allowed_bits);
- SET_ERROR_IF(has_disallowed_bits, GL_INVALID_VALUE);
- ctx->drawValidate();
-
- ctx->dispatcher().glClear(mask);
-}
-GL_APICALL void GL_APIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){
- GET_CTX();
- ctx->dispatcher().glClearColor(red,green,blue,alpha);
-}
-GL_APICALL void GL_APIENTRY glClearDepthf(GLclampf depth){
- GET_CTX();
- ctx->dispatcher().glClearDepth(depth);
-}
-GL_APICALL void GL_APIENTRY glClearStencil(GLint s){
- GET_CTX();
- ctx->dispatcher().glClearStencil(s);
-}
-GL_APICALL void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha){
- GET_CTX();
- ctx->dispatcher().glColorMask(red,green,blue,alpha);
-}
-
-GL_APICALL void GL_APIENTRY glCompileShader(GLuint shader){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(objData.Ptr()->getDataType()!= SHADER_DATA,GL_INVALID_OPERATION);
- ShaderParser* sp = (ShaderParser*)objData.Ptr();
- ctx->dispatcher().glCompileShader(globalShaderName);
-
- GLsizei infoLogLength=0;
- GLchar* infoLog;
- ctx->dispatcher().glGetShaderiv(globalShaderName,GL_INFO_LOG_LENGTH,&infoLogLength);
- infoLog = new GLchar[infoLogLength+1];
- ctx->dispatcher().glGetShaderInfoLog(globalShaderName,infoLogLength,NULL,infoLog);
- sp->setInfoLog(infoLog);
- }
-}
-
-GL_APICALL void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data)
-{
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM);
- SET_ERROR_IF(level < 0 || imageSize < 0, GL_INVALID_VALUE);
-
- doCompressedTexImage2D(ctx, target, level, internalformat,
- width, height, border,
- imageSize, data, (void*)glTexImage2D);
-}
-
-GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM);
- ctx->dispatcher().glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data);
-}
-
-GL_APICALL void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::pixelFrmt(ctx,internalformat) && GLESv2Validate::textureTargetEx(target)),GL_INVALID_ENUM);
- SET_ERROR_IF(border != 0,GL_INVALID_VALUE);
- ctx->dispatcher().glCopyTexImage2D(target,level,internalformat,x,y,width,height,border);
-}
-
-GL_APICALL void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM);
- ctx->dispatcher().glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height);
-}
-
-GL_APICALL GLuint GL_APIENTRY glCreateProgram(void){
- GET_CTX_RET(0);
- const GLuint globalProgramName = ctx->dispatcher().glCreateProgram();
- if(ctx->shareGroup().Ptr() && globalProgramName) {
- ProgramData* programInfo = new ProgramData();
- const GLuint localProgramName = ctx->shareGroup()->genName(SHADER, 0, true);
- ctx->shareGroup()->replaceGlobalName(SHADER,localProgramName,globalProgramName);
- ctx->shareGroup()->setObjectData(SHADER,localProgramName,ObjectDataPtr(programInfo));
- return localProgramName;
- }
- if(globalProgramName){
- ctx->dispatcher().glDeleteProgram(globalProgramName);
- }
- return 0;
-}
-
-GL_APICALL GLuint GL_APIENTRY glCreateShader(GLenum type){
- GET_CTX_V2_RET(0);
- RET_AND_SET_ERROR_IF(!GLESv2Validate::shaderType(type),GL_INVALID_ENUM,0);
- const GLuint globalShaderName = ctx->dispatcher().glCreateShader(type);
- if(ctx->shareGroup().Ptr() && globalShaderName) {
- const GLuint localShaderName = ctx->shareGroup()->genName(SHADER, 0, true);
- ShaderParser* sp = new ShaderParser(type);
- ctx->shareGroup()->replaceGlobalName(SHADER,localShaderName,globalShaderName);
- ctx->shareGroup()->setObjectData(SHADER,localShaderName,ObjectDataPtr(sp));
- return localShaderName;
- }
- if(globalShaderName){
- ctx->dispatcher().glDeleteShader(globalShaderName);
- }
- return 0;
-}
-
-GL_APICALL void GL_APIENTRY glCullFace(GLenum mode){
- GET_CTX();
- ctx->dispatcher().glCullFace(mode);
-}
-
-GL_APICALL void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i < n; i++){
- ctx->shareGroup()->deleteName(VERTEXBUFFER,buffers[i]);
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i < n; i++){
- const GLuint globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffers[i]);
- ctx->shareGroup()->deleteName(FRAMEBUFFER,framebuffers[i]);
- ctx->dispatcher().glDeleteFramebuffersEXT(1,&globalFrameBufferName);
- }
- }
-}
-
-static void s_detachFromFramebuffer(GLuint bufferType, GLuint texture) {
- GET_CTX();
- GLuint fbName = ctx->getFramebufferBinding();
- if (!fbName) return;
- ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
- if (fbObj.Ptr() == NULL) return;
- FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
- GLenum target;
- const GLenum kAttachments[] = {GL_COLOR_ATTACHMENT0, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
- const size_t sizen = sizeof(kAttachments)/sizeof(GLenum);
- for (size_t i = 0; i < sizen; ++i ) {
- GLuint name = fbData->getAttachment(kAttachments[i], &target, NULL);
- if (name != texture) continue;
- if (TEXTURE == bufferType && GLESv2Validate::textureTargetEx(target)) {
- glFramebufferTexture2D(GL_FRAMEBUFFER, kAttachments[i], target, 0, 0);
- } else if (RENDERBUFFER == bufferType && GLESv2Validate::renderbufferTarget(target)) {
- glFramebufferRenderbuffer(GL_FRAMEBUFFER, kAttachments[i], target, 0);
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i < n; i++){
- const GLuint globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffers[i]);
- ctx->shareGroup()->deleteName(RENDERBUFFER,renderbuffers[i]);
- ctx->dispatcher().glDeleteRenderbuffersEXT(1,&globalRenderBufferName);
- s_detachFromFramebuffer(RENDERBUFFER, renderbuffers[i]);
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i < n; i++){
- if (textures[i]!=0) {
- TextureData* tData = getTextureData(textures[i]);
- // delete the underlying OpenGL texture but only if this
- // texture is not a target of EGLImage.
- if (!tData || tData->sourceEGLImage == 0) {
- const GLuint globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,textures[i]);
- ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
- }
- ctx->shareGroup()->deleteName(TEXTURE,textures[i]);
-
- if (ctx->getBindedTexture(GL_TEXTURE_2D) == textures[i])
- ctx->setBindedTexture(GL_TEXTURE_2D,0);
- if (ctx->getBindedTexture(GL_TEXTURE_CUBE_MAP) == textures[i])
- ctx->setBindedTexture(GL_TEXTURE_CUBE_MAP,0);
- s_detachFromFramebuffer(TEXTURE, textures[i]);
- }
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glDeleteProgram(GLuint program){
- GET_CTX();
- if(program && ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(!globalProgramName, GL_INVALID_VALUE);
-
- ObjectDataPtr programData = ctx->shareGroup()->getObjectData(SHADER,program);
- ProgramData* pData = (ProgramData*)programData.Ptr();
- if (pData && pData->isInUse()) {
- pData->setDeleteStatus(true);
- return;
- }
- s_detachShader(ctx, pData->getAttachedVertexShader());
- s_detachShader(ctx, pData->getAttachedFragmentShader());
-
- ctx->shareGroup()->deleteName(SHADER,program);
- ctx->dispatcher().glDeleteProgram(globalProgramName);
- }
-}
-
-GL_APICALL void GL_APIENTRY glDeleteShader(GLuint shader){
- GET_CTX();
- if(shader && ctx->shareGroup().Ptr()) {
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- SET_ERROR_IF(!globalShaderName, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
- ShaderParser* sp = (ShaderParser*)objData.Ptr();
- if (sp->getAttachedProgram()) {
- sp->setDeleteStatus(true);
- } else {
- ctx->shareGroup()->deleteName(SHADER,shader);
- }
- ctx->dispatcher().glDeleteShader(globalShaderName);
- }
-
-}
-
-GL_APICALL void GL_APIENTRY glDepthFunc(GLenum func){
- GET_CTX();
- ctx->dispatcher().glDepthFunc(func);
-}
-GL_APICALL void GL_APIENTRY glDepthMask(GLboolean flag){
- GET_CTX();
- ctx->dispatcher().glDepthMask(flag);
-}
-GL_APICALL void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar){
- GET_CTX();
- ctx->dispatcher().glDepthRange(zNear,zFar);
-}
-
-GL_APICALL void GL_APIENTRY glDetachShader(GLuint program, GLuint shader){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
-
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION);
- SET_ERROR_IF(!(objData.Ptr()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION);
-
- ProgramData* programData = (ProgramData*)objData.Ptr();
- SET_ERROR_IF(!programData->isAttached(shader),GL_INVALID_OPERATION);
- programData->detachShader(shader);
-
- s_detachShader(ctx, shader);
-
- ctx->dispatcher().glDetachShader(globalProgramName,globalShaderName);
- }
-}
-
-GL_APICALL void GL_APIENTRY glDisable(GLenum cap){
- GET_CTX();
- ctx->dispatcher().glDisable(cap);
-}
-
-GL_APICALL void GL_APIENTRY glDisableVertexAttribArray(GLuint index){
- GET_CTX();
- SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE);
- ctx->enableArr(index,false);
- ctx->dispatcher().glDisableVertexAttribArray(index);
-}
-
-GL_APICALL void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count){
- GET_CTX_V2();
- SET_ERROR_IF(count < 0,GL_INVALID_VALUE)
- SET_ERROR_IF(!GLESv2Validate::drawMode(mode),GL_INVALID_ENUM);
-
- ctx->drawValidate();
-
- GLESConversionArrays tmpArrs;
- ctx->setupArraysPointers(tmpArrs,first,count,0,NULL,true);
-
- ctx->validateAtt0PreDraw(count);
-
- //Enable texture generation for GL_POINTS and gl_PointSize shader variable
- //GLES2 assumes this is enabled by default, we need to set this state for GL
- if (mode==GL_POINTS) {
- ctx->dispatcher().glEnable(GL_POINT_SPRITE);
- ctx->dispatcher().glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
- }
-
- ctx->dispatcher().glDrawArrays(mode,first,count);
-
- if (mode==GL_POINTS) {
- ctx->dispatcher().glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
- ctx->dispatcher().glDisable(GL_POINT_SPRITE);
- }
-
- ctx->validateAtt0PostDraw();
-}
-
-GL_APICALL void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* elementsIndices){
- GET_CTX_V2();
- SET_ERROR_IF(count < 0,GL_INVALID_VALUE)
- SET_ERROR_IF(!(GLESv2Validate::drawMode(mode) && GLESv2Validate::drawType(type)),GL_INVALID_ENUM);
-
- ctx->drawValidate();
-
- const GLvoid* indices = elementsIndices;
- if(ctx->isBindedBuffer(GL_ELEMENT_ARRAY_BUFFER)) { // if vbo is binded take the indices from the vbo
- const unsigned char* buf = static_cast<unsigned char *>(ctx->getBindedBuffer(GL_ELEMENT_ARRAY_BUFFER));
- indices = buf + SafeUIntFromPointer(elementsIndices);
- }
-
- GLESConversionArrays tmpArrs;
- ctx->setupArraysPointers(tmpArrs,0,count,type,indices,false);
-
- int maxIndex = ctx->findMaxIndex(count, type, indices);
- ctx->validateAtt0PreDraw(maxIndex);
-
- //See glDrawArrays
- if (mode==GL_POINTS) {
- ctx->dispatcher().glEnable(GL_POINT_SPRITE);
- ctx->dispatcher().glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
- }
-
- ctx->dispatcher().glDrawElements(mode,count,type,indices);
-
- if (mode==GL_POINTS) {
- ctx->dispatcher().glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
- ctx->dispatcher().glDisable(GL_POINT_SPRITE);
- }
-
- ctx->validateAtt0PostDraw();
-}
-
-GL_APICALL void GL_APIENTRY glEnable(GLenum cap){
- GET_CTX();
- ctx->dispatcher().glEnable(cap);
-}
-
-GL_APICALL void GL_APIENTRY glEnableVertexAttribArray(GLuint index){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE);
- ctx->enableArr(index,true);
- ctx->dispatcher().glEnableVertexAttribArray(index);
-}
-
-GL_APICALL void GL_APIENTRY glFinish(void){
- GET_CTX();
- ctx->dispatcher().glFinish();
-}
-GL_APICALL void GL_APIENTRY glFlush(void){
- GET_CTX();
- ctx->dispatcher().glFlush();
-}
-
-
-GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target) &&
- GLESv2Validate::renderbufferTarget(renderbuffertarget) &&
- GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM);
- SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
-
- GLuint globalRenderbufferName = 0;
- ObjectDataPtr obj;
-
- // generate the renderbuffer object if not yet exist
- if(renderbuffer) {
- if (!ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)) {
- ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer);
- obj = ObjectDataPtr(new RenderbufferData());
- ctx->shareGroup()->setObjectData(RENDERBUFFER,
- renderbuffer, obj);
- }
- else {
- obj = ctx->shareGroup()->getObjectData(RENDERBUFFER, renderbuffer);
- }
-
- globalRenderbufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer);
- }
-
- // Update the the current framebuffer object attachment state
- GLuint fbName = ctx->getFramebufferBinding();
- ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
- if (fbObj.Ptr() != NULL) {
- FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
- fbData->setAttachment(attachment, renderbuffertarget, renderbuffer, obj);
- }
-
- if (renderbuffer && obj.Ptr() != NULL) {
- RenderbufferData *rbData = (RenderbufferData *)obj.Ptr();
- if (rbData->sourceEGLImage != 0) {
- //
- // This renderbuffer object is an eglImage target
- // attach the eglimage's texture instead the renderbuffer.
- //
- ctx->dispatcher().glFramebufferTexture2DEXT(target,
- attachment,
- GL_TEXTURE_2D,
- rbData->eglImageGlobalTexName,0);
- return;
- }
- }
-
- ctx->dispatcher().glFramebufferRenderbufferEXT(target,attachment,renderbuffertarget,globalRenderbufferName);
-}
-
-GL_APICALL void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target) &&
- GLESv2Validate::textureTargetEx(textarget) &&
- GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM);
- SET_ERROR_IF(level != 0, GL_INVALID_VALUE);
- SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION);
-
- GLuint globalTextureName = 0;
-
- if(texture) {
- if (!ctx->shareGroup()->isObject(TEXTURE,texture)) {
- ctx->shareGroup()->genName(TEXTURE,texture);
- }
- ObjectLocalName texname = TextureLocalName(textarget,texture);
- globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,texname);
- }
-
- ctx->dispatcher().glFramebufferTexture2DEXT(target,attachment,textarget,globalTextureName,level);
-
- // Update the the current framebuffer object attachment state
- GLuint fbName = ctx->getFramebufferBinding();
- ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
- if (fbObj.Ptr() != NULL) {
- FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
- fbData->setAttachment(attachment, textarget,
- texture, ObjectDataPtr(NULL));
- }
-}
-
-
-GL_APICALL void GL_APIENTRY glFrontFace(GLenum mode){
- GET_CTX();
- ctx->dispatcher().glFrontFace(mode);
-}
-
-GL_APICALL void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i<n ;i++) {
- buffers[i] = ctx->shareGroup()->genName(VERTEXBUFFER, 0, true);
- //generating vbo object related to this buffer name
- ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer()));
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glGenerateMipmap(GLenum target){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM);
- ctx->dispatcher().glGenerateMipmapEXT(target);
-}
-
-GL_APICALL void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i<n ;i++) {
- framebuffers[i] = ctx->shareGroup()->genName(FRAMEBUFFER, 0 ,true);
- ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffers[i],
- ObjectDataPtr(new FramebufferData(framebuffers[i])));
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i<n ;i++) {
- renderbuffers[i] = ctx->shareGroup()->genName(RENDERBUFFER, 0, true);
- ctx->shareGroup()->setObjectData(RENDERBUFFER,
- renderbuffers[i],
- ObjectDataPtr(new RenderbufferData()));
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures){
- GET_CTX();
- SET_ERROR_IF(n<0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()) {
- for(int i=0; i<n ;i++) {
- textures[i] = ctx->shareGroup()->genName(TEXTURE, 0, true);
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ctx->dispatcher().glGetActiveAttrib(globalProgramName,index,bufsize,length,size,type,name);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ctx->dispatcher().glGetActiveUniform(globalProgramName,index,bufsize,length,size,type,name);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ctx->dispatcher().glGetAttachedShaders(globalProgramName,maxcount,count,shaders);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- GLint numShaders=0;
- ctx->dispatcher().glGetProgramiv(globalProgramName,GL_ATTACHED_SHADERS,&numShaders);
- for(int i=0 ; i < maxcount && i<numShaders ;i++){
- shaders[i] = ctx->shareGroup()->getLocalName(SHADER,shaders[i]);
- }
- }
-}
-
-GL_APICALL int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name){
- GET_CTX_RET(-1);
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
- ProgramData* pData = (ProgramData *)objData.Ptr();
- RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1);
- return ctx->dispatcher().glGetAttribLocation(globalProgramName,name);
- }
- return -1;
-}
-
-GL_APICALL void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params){
- GET_CTX();
-
- if (ctx->glGetBooleanv(pname,params))
- {
- return;
- }
-
- switch(pname)
- {
- case GL_SHADER_COMPILER:
- case GL_SHADER_BINARY_FORMATS:
- case GL_NUM_SHADER_BINARY_FORMATS:
- case GL_MAX_VERTEX_UNIFORM_VECTORS:
- case GL_MAX_VARYING_VECTORS:
- case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
- if(ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY)
- ctx->dispatcher().glGetBooleanv(pname,params);
- else
- {
- GLint iparam;
- glGetIntegerv(pname,&iparam);
- *params = (iparam != 0);
- }
- break;
-
- default:
- ctx->dispatcher().glGetBooleanv(pname,params);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::bufferTarget(target) && GLESv2Validate::bufferParam(pname)),GL_INVALID_ENUM);
- SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION);
- switch(pname) {
- case GL_BUFFER_SIZE:
- ctx->getBufferSize(target,params);
- break;
- case GL_BUFFER_USAGE:
- ctx->getBufferUsage(target,params);
- break;
- }
-}
-
-
-GL_APICALL GLenum GL_APIENTRY glGetError(void){
- GET_CTX_RET(GL_NO_ERROR)
- GLenum err = ctx->getGLerror();
- if(err != GL_NO_ERROR) {
- ctx->setGLerror(GL_NO_ERROR);
- return err;
- }
- return ctx->dispatcher().glGetError();
-}
-
-GL_APICALL void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params){
- GET_CTX();
-
- if (ctx->glGetFloatv(pname,params)) {
- return;
- }
-
- GLint i;
-
- switch (pname) {
- case GL_CURRENT_PROGRAM:
- case GL_FRAMEBUFFER_BINDING:
- case GL_RENDERBUFFER_BINDING:
- glGetIntegerv(pname,&i);
- *params = (GLfloat)i;
- break;
- case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
- *params = (GLfloat)getCompressedFormats(NULL);
- break;
- case GL_COMPRESSED_TEXTURE_FORMATS:
- {
- int nparams = getCompressedFormats(NULL);
- if (nparams>0) {
- int * iparams = new int[nparams];
- getCompressedFormats(iparams);
- for (int i=0; i<nparams; i++) params[i] = (GLfloat)iparams[i];
- delete [] iparams;
- }
- }
- break;
-
- case GL_SHADER_COMPILER:
- case GL_SHADER_BINARY_FORMATS:
- case GL_NUM_SHADER_BINARY_FORMATS:
- case GL_MAX_VERTEX_UNIFORM_VECTORS:
- case GL_MAX_VARYING_VECTORS:
- case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
- if(ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY)
- ctx->dispatcher().glGetFloatv(pname,params);
- else
- {
- glGetIntegerv(pname,&i);
- *params = (GLfloat)i;
- }
- break;
-
- case GL_STENCIL_BACK_VALUE_MASK:
- case GL_STENCIL_BACK_WRITEMASK:
- case GL_STENCIL_VALUE_MASK:
- case GL_STENCIL_WRITEMASK:
- {
- GLint myint = 0;
- glGetIntegerv(pname, &myint);
- // Two casts are used: since mask is unsigned integer,
- // the first cast converts to unsigned integer;
- // the second cast converts to float.
- *params = (GLfloat)((GLuint)(myint));
- }
- break;
-
- default:
- ctx->dispatcher().glGetFloatv(pname,params);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params){
- int destroyCtx = 0;
- GET_CTX();
-
- if (!ctx) {
- ctx = createGLESContext();
- if (ctx)
- destroyCtx = 1;
- }
- if (ctx->glGetIntegerv(pname,params))
- {
- if (destroyCtx)
- deleteGLESContext(ctx);
- return;
- }
-
- bool es2 = ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY;
- GLint i;
-
- switch (pname) {
- case GL_CURRENT_PROGRAM:
- if (ctx->shareGroup().Ptr()) {
- ctx->dispatcher().glGetIntegerv(pname,&i);
- *params = ctx->shareGroup()->getLocalName(SHADER,i);
- }
- break;
- case GL_FRAMEBUFFER_BINDING:
- if (ctx->shareGroup().Ptr()) {
- ctx->dispatcher().glGetIntegerv(pname,&i);
- *params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i);
- }
- break;
- case GL_RENDERBUFFER_BINDING:
- if (ctx->shareGroup().Ptr()) {
- ctx->dispatcher().glGetIntegerv(pname,&i);
- *params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i);
- }
- break;
-
- case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
- *params = getCompressedFormats(NULL);
- break;
- case GL_COMPRESSED_TEXTURE_FORMATS:
- getCompressedFormats(params);
- break;
-
- case GL_SHADER_COMPILER:
- if(es2)
- ctx->dispatcher().glGetIntegerv(pname,params);
- else
- *params = 1;
- break;
-
- case GL_SHADER_BINARY_FORMATS:
- if(es2)
- ctx->dispatcher().glGetIntegerv(pname,params);
- break;
-
- case GL_NUM_SHADER_BINARY_FORMATS:
- if(es2)
- ctx->dispatcher().glGetIntegerv(pname,params);
- else
- *params = 0;
- break;
-
- case GL_MAX_VERTEX_UNIFORM_VECTORS:
- if(es2)
- ctx->dispatcher().glGetIntegerv(pname,params);
- else
- *params = 128;
- break;
-
- case GL_MAX_VARYING_VECTORS:
- if(es2)
- ctx->dispatcher().glGetIntegerv(pname,params);
- else
- *params = 8;
- break;
-
- case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
- if(es2)
- ctx->dispatcher().glGetIntegerv(pname,params);
- else
- *params = 16;
- break;
-
- case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
- ctx->dispatcher().glGetIntegerv(pname,params);
- if(*params > 16)
- {
- // GLES spec requires only 2, and the ATI driver erronously
- // returns 32 (although it supports only 16). This WAR is simple,
- // compliant and good enough for developers.
- *params = 16;
- }
- break;
- default:
- ctx->dispatcher().glGetIntegerv(pname,params);
- }
- if (destroyCtx)
- deleteGLESContext(ctx);
-}
-
-GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target) &&
- GLESv2Validate::framebufferAttachment(attachment) &&
- GLESv2Validate::framebufferAttachmentParams(pname)),GL_INVALID_ENUM);
-
- //
- // Take the attachment attribute from our state - if available
- //
- GLuint fbName = ctx->getFramebufferBinding();
- SET_ERROR_IF (!fbName, GL_INVALID_OPERATION);
- if (fbName) {
- ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName);
- if (fbObj.Ptr() != NULL) {
- FramebufferData *fbData = (FramebufferData *)fbObj.Ptr();
- GLenum target;
- GLuint name = fbData->getAttachment(attachment, &target, NULL);
- if (!name) {
- SET_ERROR_IF(pname != GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE &&
- pname != GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, GL_INVALID_ENUM);
- }
- if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) {
- if (target == GL_TEXTURE_2D) {
- *params = GL_TEXTURE;
- return;
- }
- else if (target == GL_RENDERBUFFER) {
- *params = GL_RENDERBUFFER;
- return;
- } else {
- *params = GL_NONE;
- }
- }
- else if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) {
- *params = name;
- return;
- }
- }
- }
-
- ctx->dispatcher().glGetFramebufferAttachmentParameterivEXT(target,attachment,pname,params);
-}
-
-GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::renderbufferTarget(target) && GLESv2Validate::renderbufferParams(pname)),GL_INVALID_ENUM);
-
- //
- // If this is a renderbuffer which is eglimage's target, we
- // should query the underlying eglimage's texture object instead.
- //
- GLuint rb = ctx->getRenderbufferBinding();
- if (rb) {
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
- RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
- if (rbData && rbData->sourceEGLImage != 0) {
- GLenum texPname;
- switch(pname) {
- case GL_RENDERBUFFER_WIDTH:
- texPname = GL_TEXTURE_WIDTH;
- break;
- case GL_RENDERBUFFER_HEIGHT:
- texPname = GL_TEXTURE_HEIGHT;
- break;
- case GL_RENDERBUFFER_INTERNAL_FORMAT:
- texPname = GL_TEXTURE_INTERNAL_FORMAT;
- break;
- case GL_RENDERBUFFER_RED_SIZE:
- texPname = GL_TEXTURE_RED_SIZE;
- break;
- case GL_RENDERBUFFER_GREEN_SIZE:
- texPname = GL_TEXTURE_GREEN_SIZE;
- break;
- case GL_RENDERBUFFER_BLUE_SIZE:
- texPname = GL_TEXTURE_BLUE_SIZE;
- break;
- case GL_RENDERBUFFER_ALPHA_SIZE:
- texPname = GL_TEXTURE_ALPHA_SIZE;
- break;
- case GL_RENDERBUFFER_DEPTH_SIZE:
- texPname = GL_TEXTURE_DEPTH_SIZE;
- break;
- case GL_RENDERBUFFER_STENCIL_SIZE:
- default:
- *params = 0; //XXX
- return;
- break;
- }
-
- GLint prevTex;
- ctx->dispatcher().glGetIntegerv(GL_TEXTURE_BINDING_2D, &prevTex);
- ctx->dispatcher().glBindTexture(GL_TEXTURE_2D,
- rbData->eglImageGlobalTexName);
- ctx->dispatcher().glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
- texPname,
- params);
- ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, prevTex);
- return;
- }
- }
-
- ctx->dispatcher().glGetRenderbufferParameterivEXT(target,pname,params);
-}
-
-
-GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::programParam(pname),GL_INVALID_ENUM);
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- switch(pname) {
- case GL_DELETE_STATUS:
- {
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
- params[0] = programData->getDeleteStatus() ? GL_TRUE : GL_FALSE;
- }
- break;
- case GL_LINK_STATUS:
- {
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
- params[0] = programData->getLinkStatus();
- }
- break;
- //validate status should not return GL_TRUE if link failed
- case GL_VALIDATE_STATUS:
- {
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
- if (programData->getLinkStatus()==GL_TRUE)
- ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
- else
- params[0] = GL_FALSE;
- }
- break;
- case GL_INFO_LOG_LENGTH:
- {
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
- GLint logLength = strlen(programData->getInfoLog());
- params[0] = (logLength>0) ? logLength+1 : 0;
- }
- break;
- default:
- ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params);
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
-
- if (bufsize==0) {
- if (length) {
- *length = 0;
- }
- return;
- }
-
- GLsizei logLength;
- logLength = strlen(programData->getInfoLog());
-
- GLsizei returnLength=0;
- if (infolog) {
- returnLength = bufsize-1 < logLength ? bufsize-1 : logLength;
- strncpy(infolog,programData->getInfoLog(),returnLength+1);
- infolog[returnLength] = '\0';
- }
- if (length) {
- *length = returnLength;
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- if (pname == GL_DELETE_STATUS) {
- SET_ERROR_IF(globalShaderName == 0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_VALUE);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_VALUE);
- ShaderParser* sp = (ShaderParser*)objData.Ptr();
- params[0] = (sp->getDeleteStatus()) ? GL_TRUE : GL_FALSE;
- return;
- }
- SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
- switch(pname) {
- case GL_INFO_LOG_LENGTH:
- {
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
- ShaderParser* sp = (ShaderParser*)objData.Ptr();
- GLint logLength = strlen(sp->getInfoLog());
- params[0] = (logLength>0) ? logLength+1 : 0;
- }
- break;
- default:
- ctx->dispatcher().glGetShaderiv(globalShaderName,pname,params);
- }
- }
-}
-
-
-GL_APICALL void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
- ShaderParser* sp = (ShaderParser*)objData.Ptr();
-
- if (bufsize==0) {
- if (length) {
- *length = 0;
- }
- return;
- }
-
- GLsizei logLength;
- logLength = strlen(sp->getInfoLog());
-
- GLsizei returnLength=0;
- if (infolog) {
- returnLength = bufsize-1 <logLength ? bufsize-1 : logLength;
- strncpy(infolog,sp->getInfoLog(),returnLength+1);
- infolog[returnLength] = '\0';
- }
- if (length) {
- *length = returnLength;
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision){
- GET_CTX_V2();
- SET_ERROR_IF(!(GLESv2Validate::shaderType(shadertype) && GLESv2Validate::precisionType(precisiontype)),GL_INVALID_ENUM);
-
- switch (precisiontype) {
- case GL_LOW_INT:
- case GL_MEDIUM_INT:
- case GL_HIGH_INT:
- range[0] = range[1] = 16;
- *precision = 0;
- break;
-
- case GL_LOW_FLOAT:
- case GL_MEDIUM_FLOAT:
- case GL_HIGH_FLOAT:
- if(ctx->dispatcher().glGetShaderPrecisionFormat != NULL) {
- ctx->dispatcher().glGetShaderPrecisionFormat(shadertype,precisiontype,range,precision);
- } else {
- range[0] = range[1] = 127;
- *precision = 24;
- }
- break;
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
- const char* src = ((ShaderParser*)objData.Ptr())->getOriginalSrc();
- int srcLength = 0;
- if (src) {
- srcLength = strlen(src);
- }
-
- int returnLength = bufsize<srcLength ? bufsize-1 : srcLength;
- if (returnLength) {
- strncpy(source,src, returnLength);
- source[returnLength] = '\0';
- }
-
- if (length)
- *length = returnLength;
- }
-}
-
-
-GL_APICALL const GLubyte* GL_APIENTRY glGetString(GLenum name){
- GET_CTX_RET(NULL)
- static const GLubyte SHADING[] = "OpenGL ES GLSL ES 1.0.17";
- switch(name) {
- case GL_VENDOR:
- return (const GLubyte*)ctx->getVendorString();
- case GL_RENDERER:
- return (const GLubyte*)ctx->getRendererString();
- case GL_VERSION:
- return (const GLubyte*)ctx->getVersionString();
- case GL_SHADING_LANGUAGE_VERSION:
- return SHADING;
- case GL_EXTENSIONS:
- return (const GLubyte*)ctx->getExtensionString();
- default:
- RET_AND_SET_ERROR_IF(true,GL_INVALID_ENUM,NULL);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM);
- ctx->dispatcher().glGetTexParameterfv(target,pname,params);
-
-}
-GL_APICALL void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM);
- ctx->dispatcher().glGetTexParameteriv(target,pname,params);
-}
-
-GL_APICALL void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params){
- GET_CTX();
- SET_ERROR_IF(location < 0,GL_INVALID_OPERATION);
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* pData = (ProgramData *)objData.Ptr();
- SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION);
- ctx->dispatcher().glGetUniformfv(globalProgramName,location,params);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params){
- GET_CTX();
- SET_ERROR_IF(location < 0,GL_INVALID_OPERATION);
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* pData = (ProgramData *)objData.Ptr();
- SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION);
- ctx->dispatcher().glGetUniformiv(globalProgramName,location,params);
- }
-}
-
-GL_APICALL int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name){
- GET_CTX_RET(-1);
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1);
- ProgramData* pData = (ProgramData *)objData.Ptr();
- RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1);
- return ctx->dispatcher().glGetUniformLocation(globalProgramName,name);
- }
- return -1;
-}
-
-static bool s_invalidVertexAttribIndex(GLuint index) {
- GLint param=0;
- glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &param);
- return (param < 0 || index >= (GLuint)param);
-}
-
-GL_APICALL void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params){
- GET_CTX_V2();
- SET_ERROR_IF(s_invalidVertexAttribIndex(index), GL_INVALID_VALUE);
- const GLESpointer* p = ctx->getPointer(index);
- if(p) {
- switch(pname){
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
- *params = 0;
- break;
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
- *params = p->isEnable();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_SIZE:
- *params = p->getSize();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
- *params = p->getStride();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_TYPE:
- *params = p->getType();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
- *params = p->isNormalize();
- break;
- case GL_CURRENT_VERTEX_ATTRIB:
- if(index == 0)
- {
- const float* att0 = ctx->getAtt0();
- for(int i=0; i<4; i++)
- params[i] = att0[i];
- }
- else
- ctx->dispatcher().glGetVertexAttribfv(index,pname,params);
- break;
- default:
- ctx->setGLerror(GL_INVALID_ENUM);
- }
- } else {
- ctx->setGLerror(GL_INVALID_VALUE);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params){
- GET_CTX_V2();
- SET_ERROR_IF(s_invalidVertexAttribIndex(index), GL_INVALID_VALUE);
- const GLESpointer* p = ctx->getPointer(index);
- if(p) {
- switch(pname){
- case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
- *params = 0;
- break;
- case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
- *params = p->isEnable();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_SIZE:
- *params = p->getSize();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
- *params = p->getStride();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_TYPE:
- *params = p->getType();
- break;
- case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
- *params = p->isNormalize();
- break;
- case GL_CURRENT_VERTEX_ATTRIB:
- if(index == 0)
- {
- const float* att0 = ctx->getAtt0();
- for(int i=0; i<4; i++)
- params[i] = (GLint)att0[i];
- }
- else
- ctx->dispatcher().glGetVertexAttribiv(index,pname,params);
- break;
- default:
- ctx->setGLerror(GL_INVALID_ENUM);
- }
- } else {
- ctx->setGLerror(GL_INVALID_VALUE);
- }
-}
-
-GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer){
- GET_CTX();
- SET_ERROR_IF(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER,GL_INVALID_ENUM);
- SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE);
-
- const GLESpointer* p = ctx->getPointer(index);
- if(p) {
- *pointer = const_cast<void *>( p->getBufferData());
- } else {
- ctx->setGLerror(GL_INVALID_VALUE);
- }
-}
-
-GL_APICALL void GL_APIENTRY glHint(GLenum target, GLenum mode){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::hintTargetMode(target,mode),GL_INVALID_ENUM);
- ctx->dispatcher().glHint(target,mode);
-}
-
-GL_APICALL GLboolean GL_APIENTRY glIsEnabled(GLenum cap){
- GET_CTX_RET(GL_FALSE);
- RET_AND_SET_ERROR_IF(!GLESv2Validate::capability(cap),GL_INVALID_ENUM,GL_FALSE);
- return ctx->dispatcher().glIsEnabled(cap);
-}
-
-GL_APICALL GLboolean GL_APIENTRY glIsBuffer(GLuint buffer){
- GET_CTX_RET(GL_FALSE)
- if(buffer && ctx->shareGroup().Ptr()) {
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer);
- return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE;
- }
- return GL_FALSE;
-}
-
-GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer){
- GET_CTX_RET(GL_FALSE)
- if(framebuffer && ctx->shareGroup().Ptr()){
- return (ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) &&
- ctx->getFramebufferBinding() == framebuffer) ? GL_TRUE :GL_FALSE;
- }
- return GL_FALSE;
-}
-
-GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer){
- GET_CTX_RET(GL_FALSE)
- if(renderbuffer && ctx->shareGroup().Ptr()){
- return (ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) &&
- ctx->getRenderbufferBinding() == renderbuffer) ? GL_TRUE :GL_FALSE;
- }
- return GL_FALSE;
-}
-
-GL_APICALL GLboolean GL_APIENTRY glIsTexture(GLuint texture){
- GET_CTX_RET(GL_FALSE)
- if (texture==0)
- return GL_FALSE;
- TextureData* tex = getTextureData(texture);
- return tex ? tex->wasBound : GL_FALSE;
-}
-
-GL_APICALL GLboolean GL_APIENTRY glIsProgram(GLuint program){
- GET_CTX_RET(GL_FALSE)
- if(program && ctx->shareGroup().Ptr() &&
- ctx->shareGroup()->isObject(SHADER,program)) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- return ctx->dispatcher().glIsProgram(globalProgramName);
- }
- return GL_FALSE;
-}
-
-GL_APICALL GLboolean GL_APIENTRY glIsShader(GLuint shader){
- GET_CTX_RET(GL_FALSE)
- if(shader && ctx->shareGroup().Ptr() &&
- ctx->shareGroup()->isObject(SHADER,shader)) {
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- return ctx->dispatcher().glIsShader(globalShaderName);
- }
- return GL_FALSE;
-}
-
-GL_APICALL void GL_APIENTRY glLineWidth(GLfloat width){
- GET_CTX();
- ctx->dispatcher().glLineWidth(width);
-}
-
-GL_APICALL void GL_APIENTRY glLinkProgram(GLuint program){
- GET_CTX();
- GLint linkStatus = GL_FALSE;
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
-
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(!objData.Ptr(), GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA, GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
- GLint fragmentShader = programData->getAttachedFragmentShader();
- GLint vertexShader = programData->getAttachedVertexShader();
- if (vertexShader != 0 && fragmentShader!=0) {
- /* validating that the fragment & vertex shaders were compiled successfuly*/
- GLint fCompileStatus = GL_FALSE;
- GLint vCompileStatus = GL_FALSE;
- GLuint fragmentShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,fragmentShader);
- GLuint vertexShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,vertexShader);
- ctx->dispatcher().glGetShaderiv(fragmentShaderGlobal,GL_COMPILE_STATUS,&fCompileStatus);
- ctx->dispatcher().glGetShaderiv(vertexShaderGlobal,GL_COMPILE_STATUS,&vCompileStatus);
-
- if(fCompileStatus != 0 && vCompileStatus != 0){
- ctx->dispatcher().glLinkProgram(globalProgramName);
- ctx->dispatcher().glGetProgramiv(globalProgramName,GL_LINK_STATUS,&linkStatus);
- }
- }
- programData->setLinkStatus(linkStatus);
-
- GLsizei infoLogLength=0;
- GLchar* infoLog;
- ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength);
- infoLog = new GLchar[infoLogLength+1];
- ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog);
- programData->setInfoLog(infoLog);
- }
-}
-
-GL_APICALL void GL_APIENTRY glPixelStorei(GLenum pname, GLint param){
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::pixelStoreParam(pname),GL_INVALID_ENUM);
- SET_ERROR_IF(!((param==1)||(param==2)||(param==4)||(param==8)), GL_INVALID_VALUE);
- ctx->setUnpackAlignment(param);
- ctx->dispatcher().glPixelStorei(pname,param);
-}
-
-GL_APICALL void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units){
- GET_CTX();
- ctx->dispatcher().glPolygonOffset(factor,units);
-}
-
-GL_APICALL void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::readPixelFrmt(format) && GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM);
- SET_ERROR_IF((width < 0 || height < 0),GL_INVALID_VALUE);
- SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type)),GL_INVALID_OPERATION);
- SET_ERROR_IF(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE, GL_INVALID_FRAMEBUFFER_OPERATION);
- ctx->dispatcher().glReadPixels(x,y,width,height,format,type,pixels);
-}
-
-
-GL_APICALL void GL_APIENTRY glReleaseShaderCompiler(void){
- GET_CTX();
-
- if(ctx->dispatcher().glReleaseShaderCompiler != NULL)
- {
- ctx->dispatcher().glReleaseShaderCompiler();
- }
-}
-
-GL_APICALL void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){
- GET_CTX();
- GLenum internal = internalformat;
- switch (internalformat) {
- case GL_RGB565:
- internal = GL_RGB;
- break;
- case GL_RGB5_A1:
- internal = GL_RGBA;
- break;
- default:
- internal = internalformat;
- break;
- }
-
- // Get current bounded renderbuffer
- // raise INVALID_OPERATIOn if no renderbuffer is bounded
- GLuint rb = ctx->getRenderbufferBinding();
- SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
- RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
- SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
-
- //
- // if the renderbuffer was an eglImage target, detach from
- // the eglImage.
- //
- if (rbData->sourceEGLImage != 0) {
- if (rbData->eglImageDetach) {
- (*rbData->eglImageDetach)(rbData->sourceEGLImage);
- }
- rbData->sourceEGLImage = 0;
- rbData->eglImageGlobalTexName = 0;
- }
-
- ctx->dispatcher().glRenderbufferStorageEXT(target,internal,width,height);
-}
-
-GL_APICALL void GL_APIENTRY glSampleCoverage(GLclampf value, GLboolean invert){
- GET_CTX();
- ctx->dispatcher().glSampleCoverage(value,invert);
-}
-
-GL_APICALL void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height){
- GET_CTX();
- ctx->dispatcher().glScissor(x,y,width,height);
-}
-
-GL_APICALL void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length){
- GET_CTX();
-
- SET_ERROR_IF( (ctx->dispatcher().glShaderBinary == NULL), GL_INVALID_OPERATION);
-
- if(ctx->shareGroup().Ptr()){
- for(int i=0; i < n ; i++){
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shaders[i]);
- SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
- ctx->dispatcher().glShaderBinary(1,&globalShaderName,binaryformat,binary,length);
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length){
- GET_CTX_V2();
- SET_ERROR_IF(count < 0,GL_INVALID_VALUE);
- if(ctx->shareGroup().Ptr()){
- const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader);
- SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader);
- SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION);
- ShaderParser* sp = (ShaderParser*)objData.Ptr();
- sp->setSrc(ctx->glslVersion(),count,string,length);
- ctx->dispatcher().glShaderSource(globalShaderName,1,sp->parsedLines(),NULL);
- }
-}
-
-GL_APICALL void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask){
- GET_CTX();
- ctx->dispatcher().glStencilFunc(func,ref,mask);
-}
-GL_APICALL void GL_APIENTRY glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask){
- GET_CTX();
- ctx->dispatcher().glStencilFuncSeparate(face,func,ref,mask);
-}
-GL_APICALL void GL_APIENTRY glStencilMask(GLuint mask){
- GET_CTX();
- ctx->dispatcher().glStencilMask(mask);
-}
-
-GL_APICALL void GL_APIENTRY glStencilMaskSeparate(GLenum face, GLuint mask){
- GET_CTX();
- ctx->dispatcher().glStencilMaskSeparate(face,mask);
-}
-
-GL_APICALL void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass){
- GET_CTX();
- ctx->dispatcher().glStencilOp(fail,zfail,zpass);
-}
-
-GL_APICALL void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass){
- GET_CTX();
- switch (face) {
- case GL_FRONT:
- case GL_BACK:
- case GL_FRONT_AND_BACK:
- break;
- default:
- SET_ERROR_IF(1, GL_INVALID_ENUM);
- }
- ctx->dispatcher().glStencilOp(fail,zfail,zpass);
-}
-
-GL_APICALL void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTargetEx(target) &&
- GLESv2Validate::pixelFrmt(ctx,format)&&
- GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM);
-
- SET_ERROR_IF(!GLESv2Validate::pixelFrmt(ctx,internalformat), GL_INVALID_VALUE);
- SET_ERROR_IF((format == GL_DEPTH_COMPONENT || internalformat == GL_DEPTH_COMPONENT) &&
- (type != GL_UNSIGNED_SHORT && type != GL_UNSIGNED_INT), GL_INVALID_OPERATION);
-
- SET_ERROR_IF((type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT) &&
- (format != GL_DEPTH_COMPONENT || internalformat != GL_DEPTH_COMPONENT), GL_INVALID_OPERATION);
-
- SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type) && internalformat == ((GLint)format)),GL_INVALID_OPERATION);
- SET_ERROR_IF(border != 0,GL_INVALID_VALUE);
-
- if (ctx->shareGroup().Ptr()){
- TextureData *texData = getTextureTargetData(target);
- if(texData) {
- texData->width = width;
- texData->height = height;
- texData->border = border;
- texData->internalFormat = internalformat;
- texData->target = target;
-
- if (texData->sourceEGLImage != 0) {
- //
- // This texture was a target of EGLImage,
- // but now it is re-defined so we need to detach
- // from the EGLImage and re-generate global texture name
- // for it.
- //
- if (texData->eglImageDetach) {
- (*texData->eglImageDetach)(texData->sourceEGLImage);
- }
- unsigned int tex = ctx->getBindedTexture(target);
- ctx->shareGroup()->replaceGlobalName(TEXTURE,
- tex,
- texData->oldGlobal);
- ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, texData->oldGlobal);
- texData->sourceEGLImage = 0;
- texData->oldGlobal = 0;
- }
- }
- }
-
- if (type==GL_HALF_FLOAT_OES)
- type = GL_HALF_FLOAT_NV;
- if (pixels==NULL && type==GL_UNSIGNED_SHORT_5_5_5_1)
- type = GL_UNSIGNED_SHORT;
- ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels);
-}
-
-
-GL_APICALL void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM);
- ctx->dispatcher().glTexParameterf(target,pname,param);
-}
-GL_APICALL void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM);
- ctx->dispatcher().glTexParameterfv(target,pname,params);
-}
-GL_APICALL void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM);
- ctx->dispatcher().glTexParameteri(target,pname,param);
-}
-GL_APICALL void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM);
- ctx->dispatcher().glTexParameteriv(target,pname,params);
-}
-
-GL_APICALL void GL_APIENTRY glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid* pixels){
- GET_CTX();
- SET_ERROR_IF(!(GLESv2Validate::textureTargetEx(target)), GL_INVALID_ENUM);
- SET_ERROR_IF(width < 0 || height < 0, GL_INVALID_VALUE);
- SET_ERROR_IF(!(GLESv2Validate::pixelFrmt(ctx,format)&&
- GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM);
- SET_ERROR_IF(!GLESv2Validate::pixelOp(format,type),GL_INVALID_OPERATION);
- if (type==GL_HALF_FLOAT_OES)
- type = GL_HALF_FLOAT_NV;
-
- ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
-
-}
-
-GL_APICALL void GL_APIENTRY glUniform1f(GLint location, GLfloat x){
- GET_CTX();
- ctx->dispatcher().glUniform1f(location,x);
-}
-GL_APICALL void GL_APIENTRY glUniform1fv(GLint location, GLsizei count, const GLfloat* v){
- GET_CTX();
- ctx->dispatcher().glUniform1fv(location,count,v);
-}
-
-GL_APICALL void GL_APIENTRY glUniform1i(GLint location, GLint x){
- GET_CTX();
- ctx->dispatcher().glUniform1i(location,x);
-}
-GL_APICALL void GL_APIENTRY glUniform1iv(GLint location, GLsizei count, const GLint* v){
- GET_CTX();
- ctx->dispatcher().glUniform1iv(location,count,v);
-}
-GL_APICALL void GL_APIENTRY glUniform2f(GLint location, GLfloat x, GLfloat y){
- GET_CTX();
- ctx->dispatcher().glUniform2f(location,x,y);
-}
-GL_APICALL void GL_APIENTRY glUniform2fv(GLint location, GLsizei count, const GLfloat* v){
- GET_CTX();
- ctx->dispatcher().glUniform2fv(location,count,v);
-}
-GL_APICALL void GL_APIENTRY glUniform2i(GLint location, GLint x, GLint y){
- GET_CTX();
- ctx->dispatcher().glUniform2i(location,x,y);
-}
-GL_APICALL void GL_APIENTRY glUniform2iv(GLint location, GLsizei count, const GLint* v){
- GET_CTX();
- ctx->dispatcher().glUniform2iv(location,count,v);
-}
-GL_APICALL void GL_APIENTRY glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z){
- GET_CTX();
- ctx->dispatcher().glUniform3f(location,x,y,z);
-}
-GL_APICALL void GL_APIENTRY glUniform3fv(GLint location, GLsizei count, const GLfloat* v){
- GET_CTX();
- ctx->dispatcher().glUniform3fv(location,count,v);
-}
-GL_APICALL void GL_APIENTRY glUniform3i(GLint location, GLint x, GLint y, GLint z){
- GET_CTX();
- ctx->dispatcher().glUniform3i(location,x,y,z);
-}
-
-GL_APICALL void GL_APIENTRY glUniform3iv(GLint location, GLsizei count, const GLint* v){
- GET_CTX();
- ctx->dispatcher().glUniform3iv(location,count,v);
-}
-
-GL_APICALL void GL_APIENTRY glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w){
- GET_CTX();
- ctx->dispatcher().glUniform4f(location,x,y,z,w);
-}
-
-GL_APICALL void GL_APIENTRY glUniform4fv(GLint location, GLsizei count, const GLfloat* v){
- GET_CTX();
- ctx->dispatcher().glUniform4fv(location,count,v);
-}
-
-GL_APICALL void GL_APIENTRY glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w){
- GET_CTX();
- ctx->dispatcher().glUniform4i(location,x,y,z,w);
-}
-
-GL_APICALL void GL_APIENTRY glUniform4iv(GLint location, GLsizei count, const GLint* v){
- GET_CTX();
- ctx->dispatcher().glUniform4iv(location,count,v);
-}
-
-GL_APICALL void GL_APIENTRY glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){
- GET_CTX();
- SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE);
- ctx->dispatcher().glUniformMatrix2fv(location,count,transpose,value);
-}
-
-GL_APICALL void GL_APIENTRY glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){
- GET_CTX();
- SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE);
- ctx->dispatcher().glUniformMatrix3fv(location,count,transpose,value);
-}
-
-GL_APICALL void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){
- GET_CTX();
- SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE);
- ctx->dispatcher().glUniformMatrix4fv(location,count,transpose,value);
-}
-
-static void s_unUseCurrentProgram() {
- GET_CTX();
- GLint localCurrentProgram = 0;
- glGetIntegerv(GL_CURRENT_PROGRAM, &localCurrentProgram);
- if (!localCurrentProgram) return;
-
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,localCurrentProgram);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
- programData->setInUse(false);
- if (programData->getDeleteStatus()) { glDeleteProgram(localCurrentProgram); }
-}
-
-GL_APICALL void GL_APIENTRY glUseProgram(GLuint program){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(program!=0 && globalProgramName==0,GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr() && (objData.Ptr()->getDataType()!=PROGRAM_DATA),GL_INVALID_OPERATION);
-
- s_unUseCurrentProgram();
-
- ProgramData* programData = (ProgramData*)objData.Ptr();
- if (programData) programData->setInUse(true);
-
- ctx->dispatcher().glUseProgram(globalProgramName);
- }
-}
-
-GL_APICALL void GL_APIENTRY glValidateProgram(GLuint program){
- GET_CTX();
- if(ctx->shareGroup().Ptr()) {
- const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program);
- SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program);
- SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION);
- ProgramData* programData = (ProgramData*)objData.Ptr();
- ctx->dispatcher().glValidateProgram(globalProgramName);
-
- GLsizei infoLogLength=0;
- GLchar* infoLog;
- ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength);
- infoLog = new GLchar[infoLogLength+1];
- ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog);
- programData->setInfoLog(infoLog);
- }
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib1f(GLuint indx, GLfloat x){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib1f(indx,x);
- if(indx == 0)
- ctx->setAttribute0value(x, 0.0, 0.0, 1.0);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib1fv(GLuint indx, const GLfloat* values){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib1fv(indx,values);
- if(indx == 0)
- ctx->setAttribute0value(values[0], 0.0, 0.0, 1.0);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib2f(indx,x,y);
- if(indx == 0)
- ctx->setAttribute0value(x, y, 0.0, 1.0);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib2fv(GLuint indx, const GLfloat* values){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib2fv(indx,values);
- if(indx == 0)
- ctx->setAttribute0value(values[0], values[1], 0.0, 1.0);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib3f(indx,x,y,z);
- if(indx == 0)
- ctx->setAttribute0value(x, y, z, 1.0);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib3fv(GLuint indx, const GLfloat* values){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib3fv(indx,values);
- if(indx == 0)
- ctx->setAttribute0value(values[0], values[1], values[2], 1.0);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib4f(indx,x,y,z,w);
- if(indx == 0)
- ctx->setAttribute0value(x, y, z, w);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttrib4fv(GLuint indx, const GLfloat* values){
- GET_CTX_V2();
- ctx->dispatcher().glVertexAttrib4fv(indx,values);
- if(indx == 0)
- ctx->setAttribute0value(values[0], values[1], values[2], values[3]);
-}
-
-GL_APICALL void GL_APIENTRY glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr){
- GET_CTX();
- SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,indx)),GL_INVALID_VALUE);
- if (type == GL_HALF_FLOAT_OES) type = GL_HALF_FLOAT;
- ctx->setPointer(indx,size,type,stride,ptr,normalized);
-}
-
-GL_APICALL void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height){
- GET_CTX();
- ctx->dispatcher().glViewport(x,y,width,height);
-}
-
-GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image)
-{
- GET_CTX();
- SET_ERROR_IF(!GLESv2Validate::textureTargetLimited(target),GL_INVALID_ENUM);
- unsigned int imagehndl = SafeUIntFromPointer(image);
- EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl);
- if (img) {
- // Create the texture object in the underlying EGL implementation,
- // flag to the OpenGL layer to skip the image creation and map the
- // current binded texture object to the existing global object.
- if (ctx->shareGroup().Ptr()) {
- ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
- unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex);
- // Delete old texture object but only if it is not a target of a EGLImage
- if (oldGlobal) {
- TextureData* oldTexData = getTextureData(tex);
- if (!oldTexData || oldTexData->sourceEGLImage == 0) {
- ctx->dispatcher().glDeleteTextures(1, &oldGlobal);
- }
- }
- // replace mapping and bind the new global object
- ctx->shareGroup()->replaceGlobalName(TEXTURE, tex,img->globalTexName);
- ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName);
- TextureData *texData = getTextureTargetData(target);
- SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
- texData->width = img->width;
- texData->height = img->height;
- texData->border = img->border;
- texData->internalFormat = img->internalFormat;
- texData->sourceEGLImage = imagehndl;
- texData->eglImageDetach = s_eglIface->eglDetachEGLImage;
- texData->oldGlobal = oldGlobal;
- }
- }
-}
-
-GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image)
-{
- GET_CTX();
- SET_ERROR_IF(target != GL_RENDERBUFFER_OES,GL_INVALID_ENUM);
- unsigned int imagehndl = SafeUIntFromPointer(image);
- EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl);
- SET_ERROR_IF(!img,GL_INVALID_VALUE);
- SET_ERROR_IF(!ctx->shareGroup().Ptr(),GL_INVALID_OPERATION);
-
- // Get current bounded renderbuffer
- // raise INVALID_OPERATIOn if no renderbuffer is bounded
- GLuint rb = ctx->getRenderbufferBinding();
- SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION);
- ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb);
- RenderbufferData *rbData = (RenderbufferData *)objData.Ptr();
- SET_ERROR_IF(!rbData,GL_INVALID_OPERATION);
-
- //
- // flag in the renderbufferData that it is an eglImage target
- //
- rbData->sourceEGLImage = imagehndl;
- rbData->eglImageDetach = s_eglIface->eglDetachEGLImage;
- rbData->eglImageGlobalTexName = img->globalTexName;
-
- //
- // if the renderbuffer is attached to a framebuffer
- // change the framebuffer attachment in the undelying OpenGL
- // to point to the eglImage texture object.
- //
- if (rbData->attachedFB) {
- // update the framebuffer attachment point to the
- // underlying texture of the img
- GLuint prevFB = ctx->getFramebufferBinding();
- if (prevFB != rbData->attachedFB) {
- ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
- rbData->attachedFB);
- }
- ctx->dispatcher().glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,
- rbData->attachedPoint,
- GL_TEXTURE_2D,
- img->globalTexName,0);
- if (prevFB != rbData->attachedFB) {
- ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
- prevFB);
- }
- }
-}