1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License") 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifdef _WIN32 18 #undef GL_APICALL 19 #define GL_API __declspec(dllexport) 20 #define GL_APICALL __declspec(dllexport) 21 #endif 22 23 #define GL_GLEXT_PROTOTYPES 24 #include <stdio.h> 25 #include <GLES2/gl2.h> 26 #include <GLES2/gl2ext.h> 27 #include <GLcommon/TranslatorIfaces.h> 28 #include <GLcommon/gldefs.h> 29 #include "GLESv2Context.h" 30 #include "GLESv2Validate.h" 31 #include "ShaderParser.h" 32 #include "ProgramData.h" 33 #include <GLcommon/TextureUtils.h> 34 #include <GLcommon/FramebufferData.h> 35 36 extern "C" { 37 38 //decleration 39 static void initContext(GLEScontext* ctx,ShareGroupPtr grp); 40 static void deleteGLESContext(GLEScontext* ctx); 41 static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp); 42 static GLEScontext* createGLESContext(); 43 static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName); 44 45 } 46 47 /************************************** GLES EXTENSIONS *********************************************************/ 48 //extentions descriptor 49 typedef std::map<std::string, __translatorMustCastToProperFunctionPointerType> ProcTableMap; 50 ProcTableMap *s_glesExtensions = NULL; 51 /****************************************************************************************************************/ 52 53 static EGLiface* s_eglIface = NULL; 54 static GLESiface s_glesIface = { 55 createGLESContext:createGLESContext, 56 initContext :initContext, 57 deleteGLESContext:deleteGLESContext, 58 flush :(FUNCPTR)glFlush, 59 finish :(FUNCPTR)glFinish, 60 setShareGroup :setShareGroup, 61 getProcAddress :getProcAddress 62 }; 63 64 #include <GLcommon/GLESmacros.h> 65 66 extern "C" { 67 68 static void initContext(GLEScontext* ctx,ShareGroupPtr grp) { 69 if (!ctx->isInitialized()) { 70 ctx->setShareGroup(grp); 71 ctx->init(); 72 glBindTexture(GL_TEXTURE_2D,0); 73 glBindTexture(GL_TEXTURE_CUBE_MAP,0); 74 } 75 } 76 static GLEScontext* createGLESContext() { 77 return new GLESv2Context(); 78 } 79 80 static void deleteGLESContext(GLEScontext* ctx) { 81 delete ctx; 82 } 83 84 static void setShareGroup(GLEScontext* ctx,ShareGroupPtr grp) { 85 if(ctx) { 86 ctx->setShareGroup(grp); 87 } 88 } 89 90 static __translatorMustCastToProperFunctionPointerType getProcAddress(const char* procName) { 91 GET_CTX_RET(NULL) 92 ctx->getGlobalLock(); 93 static bool proc_table_initialized = false; 94 if (!proc_table_initialized) { 95 proc_table_initialized = true; 96 if (!s_glesExtensions) 97 s_glesExtensions = new ProcTableMap(); 98 else 99 s_glesExtensions->clear(); 100 (*s_glesExtensions)["glEGLImageTargetTexture2DOES"] = (__translatorMustCastToProperFunctionPointerType)glEGLImageTargetTexture2DOES; 101 (*s_glesExtensions)["glEGLImageTargetRenderbufferStorageOES"]=(__translatorMustCastToProperFunctionPointerType)glEGLImageTargetRenderbufferStorageOES; 102 } 103 __translatorMustCastToProperFunctionPointerType ret=NULL; 104 ProcTableMap::iterator val = s_glesExtensions->find(procName); 105 if (val!=s_glesExtensions->end()) 106 ret = val->second; 107 ctx->releaseGlobalLock(); 108 109 return ret; 110 } 111 112 GL_APICALL GLESiface* __translator_getIfaces(EGLiface* eglIface){ 113 s_eglIface = eglIface; 114 return & s_glesIface; 115 } 116 117 } 118 119 static ObjectLocalName TextureLocalName(GLenum target,unsigned int tex) { 120 GET_CTX_RET(0); 121 return (tex!=0? tex : ctx->getDefaultTextureName(target)); 122 } 123 124 static TextureData* getTextureData(ObjectLocalName tex) { 125 GET_CTX_RET(NULL); 126 TextureData *texData = NULL; 127 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(TEXTURE,tex); 128 if(!objData.Ptr()){ 129 texData = new TextureData(); 130 ctx->shareGroup()->setObjectData(TEXTURE, tex, ObjectDataPtr(texData)); 131 } else { 132 texData = (TextureData*)objData.Ptr(); 133 } 134 return texData; 135 } 136 137 static TextureData* getTextureTargetData(GLenum target){ 138 GET_CTX_RET(NULL); 139 unsigned int tex = ctx->getBindedTexture(target); 140 return getTextureData(TextureLocalName(target,tex)); 141 } 142 143 GL_APICALL void GL_APIENTRY glActiveTexture(GLenum texture){ 144 GET_CTX_V2(); 145 SET_ERROR_IF (!GLESv2Validate::textureEnum(texture,ctx->getMaxTexUnits()),GL_INVALID_ENUM); 146 ctx->setActiveTexture(texture); 147 ctx->dispatcher().glActiveTexture(texture); 148 } 149 150 GL_APICALL void GL_APIENTRY glAttachShader(GLuint program, GLuint shader){ 151 GET_CTX(); 152 if(ctx->shareGroup().Ptr()) { 153 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 154 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 155 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 156 SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE); 157 158 ObjectDataPtr programData = ctx->shareGroup()->getObjectData(SHADER,program); 159 ObjectDataPtr shaderData = ctx->shareGroup()->getObjectData(SHADER,shader); 160 SET_ERROR_IF(!shaderData.Ptr() || !programData.Ptr() ,GL_INVALID_OPERATION); 161 SET_ERROR_IF(!(shaderData.Ptr()->getDataType() ==SHADER_DATA) || 162 !(programData.Ptr()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION); 163 164 GLenum shaderType = ((ShaderParser*)shaderData.Ptr())->getType(); 165 ProgramData* pData = (ProgramData*)programData.Ptr(); 166 SET_ERROR_IF((pData->getAttachedShader(shaderType)!=0), GL_INVALID_OPERATION); 167 pData->attachShader(shader,shaderType); 168 ctx->dispatcher().glAttachShader(globalProgramName,globalShaderName); 169 } 170 } 171 172 GL_APICALL void GL_APIENTRY glBindAttribLocation(GLuint program, GLuint index, const GLchar* name){ 173 GET_CTX(); 174 SET_ERROR_IF(!GLESv2Validate::attribName(name),GL_INVALID_OPERATION); 175 SET_ERROR_IF(!GLESv2Validate::attribIndex(index),GL_INVALID_VALUE); 176 if(ctx->shareGroup().Ptr()) { 177 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 178 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 179 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 180 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 181 182 ctx->dispatcher().glBindAttribLocation(globalProgramName,index,name); 183 } 184 } 185 186 GL_APICALL void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer){ 187 GET_CTX(); 188 SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM); 189 //if buffer wasn't generated before,generate one 190 if(buffer && ctx->shareGroup().Ptr() && !ctx->shareGroup()->isObject(VERTEXBUFFER,buffer)){ 191 ctx->shareGroup()->genName(VERTEXBUFFER,buffer); 192 ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffer,ObjectDataPtr(new GLESbuffer())); 193 } 194 ctx->bindBuffer(target,buffer); 195 if (buffer) { 196 GLESbuffer* vbo = (GLESbuffer*)ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer).Ptr(); 197 vbo->setBinded(); 198 } 199 } 200 201 GL_APICALL void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer){ 202 GET_CTX(); 203 SET_ERROR_IF(!GLESv2Validate::framebufferTarget(target),GL_INVALID_ENUM); 204 205 GLuint globalFrameBufferName = framebuffer; 206 if(framebuffer && ctx->shareGroup().Ptr()){ 207 globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer); 208 //if framebuffer wasn't generated before,generate one 209 if(!globalFrameBufferName){ 210 ctx->shareGroup()->genName(FRAMEBUFFER,framebuffer); 211 ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffer, 212 ObjectDataPtr(new FramebufferData(framebuffer))); 213 globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffer); 214 } 215 } 216 ctx->dispatcher().glBindFramebufferEXT(target,globalFrameBufferName); 217 218 // update framebuffer binding state 219 ctx->setFramebufferBinding(framebuffer); 220 } 221 222 GL_APICALL void GL_APIENTRY glBindRenderbuffer(GLenum target, GLuint renderbuffer){ 223 GET_CTX(); 224 SET_ERROR_IF(!GLESv2Validate::renderbufferTarget(target),GL_INVALID_ENUM); 225 226 GLuint globalRenderBufferName = renderbuffer; 227 if(renderbuffer && ctx->shareGroup().Ptr()){ 228 globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer); 229 //if renderbuffer wasn't generated before,generate one 230 if(!globalRenderBufferName){ 231 ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer); 232 ctx->shareGroup()->setObjectData(RENDERBUFFER, 233 renderbuffer, 234 ObjectDataPtr(new RenderbufferData())); 235 globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer); 236 } 237 } 238 ctx->dispatcher().glBindRenderbufferEXT(target,globalRenderBufferName); 239 240 // update renderbuffer binding state 241 ctx->setRenderbufferBinding(renderbuffer); 242 } 243 244 GL_APICALL void GL_APIENTRY glBindTexture(GLenum target, GLuint texture){ 245 GET_CTX(); 246 SET_ERROR_IF(!GLESv2Validate::textureTarget(target),GL_INVALID_ENUM) 247 248 //for handling default texture (0) 249 ObjectLocalName localTexName = TextureLocalName(target,texture); 250 251 GLuint globalTextureName = localTexName; 252 if(ctx->shareGroup().Ptr()){ 253 globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName); 254 //if texture wasn't generated before,generate one 255 if(!globalTextureName){ 256 ctx->shareGroup()->genName(TEXTURE,localTexName); 257 globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,localTexName); 258 } 259 260 TextureData* texData = getTextureData(localTexName); 261 if (texData->target==0) 262 texData->target = target; 263 //if texture was already bound to another target 264 SET_ERROR_IF(ctx->GLTextureTargetToLocal(texData->target) != ctx->GLTextureTargetToLocal(target), GL_INVALID_OPERATION); 265 texData->wasBound = true; 266 } 267 268 ctx->setBindedTexture(target,texture); 269 ctx->dispatcher().glBindTexture(target,globalTextureName); 270 } 271 272 GL_APICALL void GL_APIENTRY glBlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){ 273 GET_CTX(); 274 ctx->dispatcher().glBlendColor(red,green,blue,alpha); 275 } 276 277 GL_APICALL void GL_APIENTRY glBlendEquation( GLenum mode ){ 278 GET_CTX(); 279 SET_ERROR_IF(!GLESv2Validate::blendEquationMode(mode),GL_INVALID_ENUM) 280 ctx->dispatcher().glBlendEquation(mode); 281 } 282 283 GL_APICALL void GL_APIENTRY glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha){ 284 GET_CTX(); 285 SET_ERROR_IF(!(GLESv2Validate::blendEquationMode(modeRGB) && GLESv2Validate::blendEquationMode(modeAlpha)),GL_INVALID_ENUM); 286 ctx->dispatcher().glBlendEquationSeparate(modeRGB,modeAlpha); 287 } 288 289 GL_APICALL void GL_APIENTRY glBlendFunc(GLenum sfactor, GLenum dfactor){ 290 GET_CTX(); 291 SET_ERROR_IF(!GLESv2Validate::blendSrc(sfactor) || !GLESv2Validate::blendDst(dfactor),GL_INVALID_ENUM) 292 ctx->dispatcher().glBlendFunc(sfactor,dfactor); 293 } 294 295 GL_APICALL void GL_APIENTRY glBlendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha){ 296 GET_CTX(); 297 SET_ERROR_IF( 298 !(GLESv2Validate::blendSrc(srcRGB) && GLESv2Validate::blendDst(dstRGB) && GLESv2Validate::blendSrc(srcAlpha) && GLESv2Validate::blendDst(dstAlpha)),GL_INVALID_ENUM); 299 ctx->dispatcher().glBlendFuncSeparate(srcRGB,dstRGB,srcAlpha,dstAlpha); 300 } 301 302 GL_APICALL void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage){ 303 GET_CTX(); 304 SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM); 305 SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION); 306 ctx->setBufferData(target,size,data,usage); 307 } 308 309 GL_APICALL void GL_APIENTRY glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data){ 310 GET_CTX(); 311 SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION); 312 SET_ERROR_IF(!GLESv2Validate::bufferTarget(target),GL_INVALID_ENUM); 313 SET_ERROR_IF(!ctx->setBufferSubData(target,offset,size,data),GL_INVALID_VALUE); 314 } 315 316 317 GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus(GLenum target){ 318 GET_CTX_RET(GL_FRAMEBUFFER_COMPLETE); 319 RET_AND_SET_ERROR_IF(!GLESv2Validate::framebufferTarget(target),GL_INVALID_ENUM,GL_FRAMEBUFFER_COMPLETE); 320 ctx->drawValidate(); 321 return ctx->dispatcher().glCheckFramebufferStatusEXT(target); 322 } 323 324 GL_APICALL void GL_APIENTRY glClear(GLbitfield mask){ 325 GET_CTX(); 326 ctx->drawValidate(); 327 328 ctx->dispatcher().glClear(mask); 329 } 330 GL_APICALL void GL_APIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha){ 331 GET_CTX(); 332 ctx->dispatcher().glClearColor(red,green,blue,alpha); 333 } 334 GL_APICALL void GL_APIENTRY glClearDepthf(GLclampf depth){ 335 GET_CTX(); 336 ctx->dispatcher().glClearDepth(depth); 337 } 338 GL_APICALL void GL_APIENTRY glClearStencil(GLint s){ 339 GET_CTX(); 340 ctx->dispatcher().glClearStencil(s); 341 } 342 GL_APICALL void GL_APIENTRY glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha){ 343 GET_CTX(); 344 ctx->dispatcher().glColorMask(red,green,blue,alpha); 345 } 346 347 GL_APICALL void GL_APIENTRY glCompileShader(GLuint shader){ 348 GET_CTX(); 349 if(ctx->shareGroup().Ptr()) { 350 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 351 SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE); 352 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 353 SET_ERROR_IF(objData.Ptr()->getDataType()!= SHADER_DATA,GL_INVALID_OPERATION); 354 ShaderParser* sp = (ShaderParser*)objData.Ptr(); 355 ctx->dispatcher().glCompileShader(globalShaderName); 356 357 GLsizei infoLogLength=0; 358 GLchar* infoLog; 359 ctx->dispatcher().glGetShaderiv(globalShaderName,GL_INFO_LOG_LENGTH,&infoLogLength); 360 infoLog = new GLchar[infoLogLength+1]; 361 ctx->dispatcher().glGetShaderInfoLog(globalShaderName,infoLogLength,NULL,infoLog); 362 sp->setInfoLog(infoLog); 363 } 364 } 365 366 GL_APICALL void GL_APIENTRY glCompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data) 367 { 368 GET_CTX(); 369 SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM); 370 371 doCompressedTexImage2D(ctx, target, level, internalformat, 372 width, height, border, 373 imageSize, data, (void*)glTexImage2D); 374 } 375 376 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){ 377 GET_CTX(); 378 SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM); 379 ctx->dispatcher().glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,imageSize,data); 380 } 381 382 GL_APICALL void GL_APIENTRY glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border){ 383 GET_CTX(); 384 SET_ERROR_IF(!(GLESv2Validate::pixelFrmt(ctx,internalformat) && GLESv2Validate::textureTargetEx(target)),GL_INVALID_ENUM); 385 SET_ERROR_IF(border != 0,GL_INVALID_VALUE); 386 ctx->dispatcher().glCopyTexImage2D(target,level,internalformat,x,y,width,height,border); 387 } 388 389 GL_APICALL void GL_APIENTRY glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height){ 390 GET_CTX(); 391 SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM); 392 ctx->dispatcher().glCopyTexSubImage2D(target,level,xoffset,yoffset,x,y,width,height); 393 } 394 395 GL_APICALL GLuint GL_APIENTRY glCreateProgram(void){ 396 GET_CTX_RET(0); 397 const GLuint globalProgramName = ctx->dispatcher().glCreateProgram(); 398 if(ctx->shareGroup().Ptr() && globalProgramName) { 399 ProgramData* programInfo = new ProgramData(); 400 const GLuint localProgramName = ctx->shareGroup()->genName(SHADER, 0, true); 401 ctx->shareGroup()->replaceGlobalName(SHADER,localProgramName,globalProgramName); 402 ctx->shareGroup()->setObjectData(SHADER,localProgramName,ObjectDataPtr(programInfo)); 403 return localProgramName; 404 } 405 if(globalProgramName){ 406 ctx->dispatcher().glDeleteProgram(globalProgramName); 407 } 408 return 0; 409 } 410 411 GL_APICALL GLuint GL_APIENTRY glCreateShader(GLenum type){ 412 GET_CTX_V2_RET(0); 413 RET_AND_SET_ERROR_IF(!GLESv2Validate::shaderType(type),GL_INVALID_ENUM,0); 414 const GLuint globalShaderName = ctx->dispatcher().glCreateShader(type); 415 if(ctx->shareGroup().Ptr() && globalShaderName) { 416 const GLuint localShaderName = ctx->shareGroup()->genName(SHADER, 0, true); 417 ShaderParser* sp = new ShaderParser(type); 418 ctx->shareGroup()->replaceGlobalName(SHADER,localShaderName,globalShaderName); 419 ctx->shareGroup()->setObjectData(SHADER,localShaderName,ObjectDataPtr(sp)); 420 return localShaderName; 421 } 422 if(globalShaderName){ 423 ctx->dispatcher().glDeleteShader(globalShaderName); 424 } 425 return 0; 426 } 427 428 GL_APICALL void GL_APIENTRY glCullFace(GLenum mode){ 429 GET_CTX(); 430 ctx->dispatcher().glCullFace(mode); 431 } 432 433 GL_APICALL void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint* buffers){ 434 GET_CTX(); 435 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 436 if(ctx->shareGroup().Ptr()) { 437 for(int i=0; i < n; i++){ 438 ctx->shareGroup()->deleteName(VERTEXBUFFER,buffers[i]); 439 } 440 } 441 } 442 443 GL_APICALL void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint* framebuffers){ 444 GET_CTX(); 445 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 446 if(ctx->shareGroup().Ptr()) { 447 for(int i=0; i < n; i++){ 448 const GLuint globalFrameBufferName = ctx->shareGroup()->getGlobalName(FRAMEBUFFER,framebuffers[i]); 449 ctx->shareGroup()->deleteName(FRAMEBUFFER,framebuffers[i]); 450 ctx->dispatcher().glDeleteFramebuffersEXT(1,&globalFrameBufferName); 451 } 452 } 453 } 454 455 GL_APICALL void GL_APIENTRY glDeleteRenderbuffers(GLsizei n, const GLuint* renderbuffers){ 456 GET_CTX(); 457 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 458 if(ctx->shareGroup().Ptr()) { 459 for(int i=0; i < n; i++){ 460 const GLuint globalRenderBufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffers[i]); 461 ctx->shareGroup()->deleteName(RENDERBUFFER,renderbuffers[i]); 462 ctx->dispatcher().glDeleteRenderbuffersEXT(1,&globalRenderBufferName); 463 } 464 } 465 } 466 467 GL_APICALL void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures){ 468 GET_CTX(); 469 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 470 if(ctx->shareGroup().Ptr()) { 471 for(int i=0; i < n; i++){ 472 if (textures[i]!=0) { 473 TextureData* tData = getTextureData(textures[i]); 474 // delete the underlying OpenGL texture but only if this 475 // texture is not a target of EGLImage. 476 if (!tData || tData->sourceEGLImage == 0) { 477 const GLuint globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,textures[i]); 478 ctx->dispatcher().glDeleteTextures(1,&globalTextureName); 479 } 480 ctx->shareGroup()->deleteName(TEXTURE,textures[i]); 481 482 if (ctx->getBindedTexture(GL_TEXTURE_2D) == textures[i]) 483 ctx->setBindedTexture(GL_TEXTURE_2D,0); 484 if (ctx->getBindedTexture(GL_TEXTURE_CUBE_MAP) == textures[i]) 485 ctx->setBindedTexture(GL_TEXTURE_CUBE_MAP,0); 486 } 487 } 488 } 489 } 490 491 GL_APICALL void GL_APIENTRY glDeleteProgram(GLuint program){ 492 GET_CTX(); 493 if(program && ctx->shareGroup().Ptr()) { 494 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 495 SET_ERROR_IF(!globalProgramName, GL_INVALID_VALUE); 496 ctx->shareGroup()->deleteName(SHADER,program); 497 ctx->dispatcher().glDeleteProgram(globalProgramName); 498 } 499 } 500 501 GL_APICALL void GL_APIENTRY glDeleteShader(GLuint shader){ 502 GET_CTX(); 503 if(shader && ctx->shareGroup().Ptr()) { 504 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 505 SET_ERROR_IF(!globalShaderName, GL_INVALID_VALUE); 506 ctx->shareGroup()->deleteName(SHADER,shader); 507 ctx->dispatcher().glDeleteShader(globalShaderName); 508 } 509 510 } 511 512 GL_APICALL void GL_APIENTRY glDepthFunc(GLenum func){ 513 GET_CTX(); 514 ctx->dispatcher().glDepthFunc(func); 515 } 516 GL_APICALL void GL_APIENTRY glDepthMask(GLboolean flag){ 517 GET_CTX(); 518 ctx->dispatcher().glDepthMask(flag); 519 } 520 GL_APICALL void GL_APIENTRY glDepthRangef(GLclampf zNear, GLclampf zFar){ 521 GET_CTX(); 522 ctx->dispatcher().glDepthRange(zNear,zFar); 523 } 524 525 GL_APICALL void GL_APIENTRY glDetachShader(GLuint program, GLuint shader){ 526 GET_CTX(); 527 if(ctx->shareGroup().Ptr()) { 528 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 529 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 530 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 531 SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE); 532 533 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 534 SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION); 535 SET_ERROR_IF(!(objData.Ptr()->getDataType()==PROGRAM_DATA) ,GL_INVALID_OPERATION); 536 537 ProgramData* programData = (ProgramData*)objData.Ptr(); 538 SET_ERROR_IF(!programData->isAttached(shader),GL_INVALID_OPERATION); 539 programData->detachShader(shader); 540 541 ctx->dispatcher().glDetachShader(globalProgramName,globalShaderName); 542 } 543 } 544 545 GL_APICALL void GL_APIENTRY glDisable(GLenum cap){ 546 GET_CTX(); 547 ctx->dispatcher().glDisable(cap); 548 } 549 550 GL_APICALL void GL_APIENTRY glDisableVertexAttribArray(GLuint index){ 551 GET_CTX(); 552 SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE); 553 ctx->enableArr(index,false); 554 ctx->dispatcher().glDisableVertexAttribArray(index); 555 } 556 557 GL_APICALL void GL_APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count){ 558 GET_CTX_V2(); 559 SET_ERROR_IF(count < 0,GL_INVALID_VALUE) 560 SET_ERROR_IF(!GLESv2Validate::drawMode(mode),GL_INVALID_ENUM); 561 562 ctx->drawValidate(); 563 564 GLESConversionArrays tmpArrs; 565 ctx->setupArraysPointers(tmpArrs,first,count,0,NULL,true); 566 567 ctx->validateAtt0PreDraw(count); 568 569 //Enable texture generation for GL_POINTS and gl_PointSize shader variable 570 //GLES2 assumes this is enabled by default, we need to set this state for GL 571 if (mode==GL_POINTS) { 572 ctx->dispatcher().glEnable(GL_POINT_SPRITE); 573 ctx->dispatcher().glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 574 } 575 576 ctx->dispatcher().glDrawArrays(mode,first,count); 577 578 if (mode==GL_POINTS) { 579 ctx->dispatcher().glDisable(GL_VERTEX_PROGRAM_POINT_SIZE); 580 ctx->dispatcher().glDisable(GL_POINT_SPRITE); 581 } 582 583 ctx->validateAtt0PostDraw(); 584 } 585 586 GL_APICALL void GL_APIENTRY glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid* elementsIndices){ 587 GET_CTX_V2(); 588 SET_ERROR_IF(count < 0,GL_INVALID_VALUE) 589 SET_ERROR_IF(!(GLESv2Validate::drawMode(mode) && GLESv2Validate::drawType(type)),GL_INVALID_ENUM); 590 591 ctx->drawValidate(); 592 593 const GLvoid* indices = elementsIndices; 594 if(ctx->isBindedBuffer(GL_ELEMENT_ARRAY_BUFFER)) { // if vbo is binded take the indices from the vbo 595 const unsigned char* buf = static_cast<unsigned char *>(ctx->getBindedBuffer(GL_ELEMENT_ARRAY_BUFFER)); 596 indices = buf+reinterpret_cast<uintptr_t>(elementsIndices); 597 } 598 599 GLESConversionArrays tmpArrs; 600 ctx->setupArraysPointers(tmpArrs,0,count,type,indices,false); 601 602 int maxIndex = ctx->findMaxIndex(count, type, indices); 603 ctx->validateAtt0PreDraw(maxIndex); 604 605 //See glDrawArrays 606 if (mode==GL_POINTS) { 607 ctx->dispatcher().glEnable(GL_POINT_SPRITE); 608 ctx->dispatcher().glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 609 } 610 611 ctx->dispatcher().glDrawElements(mode,count,type,indices); 612 613 if (mode==GL_POINTS) { 614 ctx->dispatcher().glDisable(GL_VERTEX_PROGRAM_POINT_SIZE); 615 ctx->dispatcher().glDisable(GL_POINT_SPRITE); 616 } 617 618 ctx->validateAtt0PostDraw(); 619 } 620 621 GL_APICALL void GL_APIENTRY glEnable(GLenum cap){ 622 GET_CTX(); 623 ctx->dispatcher().glEnable(cap); 624 } 625 626 GL_APICALL void GL_APIENTRY glEnableVertexAttribArray(GLuint index){ 627 GET_CTX(); 628 SET_ERROR_IF(!(GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE); 629 ctx->enableArr(index,true); 630 ctx->dispatcher().glEnableVertexAttribArray(index); 631 } 632 633 GL_APICALL void GL_APIENTRY glFinish(void){ 634 GET_CTX(); 635 ctx->dispatcher().glFinish(); 636 } 637 GL_APICALL void GL_APIENTRY glFlush(void){ 638 GET_CTX(); 639 ctx->dispatcher().glFlush(); 640 } 641 642 643 GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer){ 644 GET_CTX(); 645 SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target) && 646 GLESv2Validate::renderbufferTarget(renderbuffertarget) && 647 GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM); 648 SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION); 649 650 GLuint globalRenderbufferName = 0; 651 ObjectDataPtr obj; 652 653 // generate the renderbuffer object if not yet exist 654 if(renderbuffer) { 655 if (!ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer)) { 656 ctx->shareGroup()->genName(RENDERBUFFER,renderbuffer); 657 obj = ObjectDataPtr(new RenderbufferData()); 658 ctx->shareGroup()->setObjectData(RENDERBUFFER, 659 renderbuffer, obj); 660 } 661 else { 662 obj = ctx->shareGroup()->getObjectData(RENDERBUFFER, renderbuffer); 663 } 664 665 globalRenderbufferName = ctx->shareGroup()->getGlobalName(RENDERBUFFER,renderbuffer); 666 } 667 668 // Update the the current framebuffer object attachment state 669 GLuint fbName = ctx->getFramebufferBinding(); 670 ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName); 671 if (fbObj.Ptr() != NULL) { 672 FramebufferData *fbData = (FramebufferData *)fbObj.Ptr(); 673 fbData->setAttachment(attachment, renderbuffertarget, renderbuffer, obj); 674 } 675 676 if (renderbuffer && obj.Ptr() != NULL) { 677 RenderbufferData *rbData = (RenderbufferData *)obj.Ptr(); 678 if (rbData->sourceEGLImage != 0) { 679 // 680 // This renderbuffer object is an eglImage target 681 // attach the eglimage's texture instead the renderbuffer. 682 // 683 ctx->dispatcher().glFramebufferTexture2DEXT(target, 684 attachment, 685 GL_TEXTURE_2D, 686 rbData->eglImageGlobalTexName,0); 687 return; 688 } 689 } 690 691 ctx->dispatcher().glFramebufferRenderbufferEXT(target,attachment,renderbuffertarget,globalRenderbufferName); 692 } 693 694 GL_APICALL void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level){ 695 GET_CTX(); 696 SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target) && 697 GLESv2Validate::textureTargetEx(textarget) && 698 GLESv2Validate::framebufferAttachment(attachment)),GL_INVALID_ENUM); 699 SET_ERROR_IF(level != 0, GL_INVALID_VALUE); 700 SET_ERROR_IF(!ctx->shareGroup().Ptr(), GL_INVALID_OPERATION); 701 702 GLuint globalTextureName = 0; 703 704 if(texture) { 705 if (!ctx->shareGroup()->isObject(TEXTURE,texture)) { 706 ctx->shareGroup()->genName(TEXTURE,texture); 707 } 708 ObjectLocalName texname = TextureLocalName(textarget,texture); 709 globalTextureName = ctx->shareGroup()->getGlobalName(TEXTURE,texname); 710 } 711 712 ctx->dispatcher().glFramebufferTexture2DEXT(target,attachment,textarget,globalTextureName,level); 713 714 // Update the the current framebuffer object attachment state 715 GLuint fbName = ctx->getFramebufferBinding(); 716 ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName); 717 if (fbObj.Ptr() != NULL) { 718 FramebufferData *fbData = (FramebufferData *)fbObj.Ptr(); 719 fbData->setAttachment(attachment, textarget, 720 texture, ObjectDataPtr(NULL)); 721 } 722 } 723 724 725 GL_APICALL void GL_APIENTRY glFrontFace(GLenum mode){ 726 GET_CTX(); 727 ctx->dispatcher().glFrontFace(mode); 728 } 729 730 GL_APICALL void GL_APIENTRY glGenBuffers(GLsizei n, GLuint* buffers){ 731 GET_CTX(); 732 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 733 if(ctx->shareGroup().Ptr()) { 734 for(int i=0; i<n ;i++) { 735 buffers[i] = ctx->shareGroup()->genName(VERTEXBUFFER, 0, true); 736 //generating vbo object related to this buffer name 737 ctx->shareGroup()->setObjectData(VERTEXBUFFER,buffers[i],ObjectDataPtr(new GLESbuffer())); 738 } 739 } 740 } 741 742 GL_APICALL void GL_APIENTRY glGenerateMipmap(GLenum target){ 743 GET_CTX(); 744 SET_ERROR_IF(!GLESv2Validate::textureTargetEx(target),GL_INVALID_ENUM); 745 ctx->dispatcher().glGenerateMipmapEXT(target); 746 } 747 748 GL_APICALL void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint* framebuffers){ 749 GET_CTX(); 750 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 751 if(ctx->shareGroup().Ptr()) { 752 for(int i=0; i<n ;i++) { 753 framebuffers[i] = ctx->shareGroup()->genName(FRAMEBUFFER, 0 ,true); 754 ctx->shareGroup()->setObjectData(FRAMEBUFFER, framebuffers[i], 755 ObjectDataPtr(new FramebufferData(framebuffers[i]))); 756 } 757 } 758 } 759 760 GL_APICALL void GL_APIENTRY glGenRenderbuffers(GLsizei n, GLuint* renderbuffers){ 761 GET_CTX(); 762 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 763 if(ctx->shareGroup().Ptr()) { 764 for(int i=0; i<n ;i++) { 765 renderbuffers[i] = ctx->shareGroup()->genName(RENDERBUFFER, 0, true); 766 ctx->shareGroup()->setObjectData(RENDERBUFFER, 767 renderbuffers[i], 768 ObjectDataPtr(new RenderbufferData())); 769 } 770 } 771 } 772 773 GL_APICALL void GL_APIENTRY glGenTextures(GLsizei n, GLuint* textures){ 774 GET_CTX(); 775 SET_ERROR_IF(n<0,GL_INVALID_VALUE); 776 if(ctx->shareGroup().Ptr()) { 777 for(int i=0; i<n ;i++) { 778 textures[i] = ctx->shareGroup()->genName(TEXTURE, 0, true); 779 } 780 } 781 } 782 783 GL_APICALL void GL_APIENTRY glGetActiveAttrib(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){ 784 GET_CTX(); 785 if(ctx->shareGroup().Ptr()) { 786 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 787 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 788 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 789 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 790 ctx->dispatcher().glGetActiveAttrib(globalProgramName,index,bufsize,length,size,type,name); 791 } 792 } 793 794 GL_APICALL void GL_APIENTRY glGetActiveUniform(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name){ 795 GET_CTX(); 796 if(ctx->shareGroup().Ptr()) { 797 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 798 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 799 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 800 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 801 ctx->dispatcher().glGetActiveUniform(globalProgramName,index,bufsize,length,size,type,name); 802 } 803 } 804 805 GL_APICALL void GL_APIENTRY glGetAttachedShaders(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders){ 806 GET_CTX(); 807 if(ctx->shareGroup().Ptr()) { 808 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 809 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 810 ctx->dispatcher().glGetAttachedShaders(globalProgramName,maxcount,count,shaders); 811 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 812 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 813 GLint numShaders=0; 814 ctx->dispatcher().glGetProgramiv(globalProgramName,GL_ATTACHED_SHADERS,&numShaders); 815 for(int i=0 ; i < maxcount && i<numShaders ;i++){ 816 shaders[i] = ctx->shareGroup()->getLocalName(SHADER,shaders[i]); 817 } 818 } 819 } 820 821 GL_APICALL int GL_APIENTRY glGetAttribLocation(GLuint program, const GLchar* name){ 822 GET_CTX_RET(-1); 823 if(ctx->shareGroup().Ptr()) { 824 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 825 RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1); 826 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 827 RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1); 828 ProgramData* pData = (ProgramData *)objData.Ptr(); 829 RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1); 830 return ctx->dispatcher().glGetAttribLocation(globalProgramName,name); 831 } 832 return -1; 833 } 834 835 GL_APICALL void GL_APIENTRY glGetBooleanv(GLenum pname, GLboolean* params){ 836 GET_CTX(); 837 838 if (ctx->glGetBooleanv(pname,params)) 839 { 840 return; 841 } 842 843 switch(pname) 844 { 845 case GL_SHADER_COMPILER: 846 case GL_SHADER_BINARY_FORMATS: 847 case GL_NUM_SHADER_BINARY_FORMATS: 848 case GL_MAX_VERTEX_UNIFORM_VECTORS: 849 case GL_MAX_VARYING_VECTORS: 850 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 851 if(ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY) 852 ctx->dispatcher().glGetBooleanv(pname,params); 853 else 854 { 855 GLint iparam; 856 glGetIntegerv(pname,&iparam); 857 *params = (iparam != 0); 858 } 859 break; 860 861 default: 862 ctx->dispatcher().glGetBooleanv(pname,params); 863 } 864 } 865 866 GL_APICALL void GL_APIENTRY glGetBufferParameteriv(GLenum target, GLenum pname, GLint* params){ 867 GET_CTX(); 868 SET_ERROR_IF(!(GLESv2Validate::bufferTarget(target) && GLESv2Validate::bufferParam(pname)),GL_INVALID_ENUM); 869 SET_ERROR_IF(!ctx->isBindedBuffer(target),GL_INVALID_OPERATION); 870 bool ret = true; 871 switch(pname) { 872 case GL_BUFFER_SIZE: 873 ctx->getBufferSize(target,params); 874 break; 875 case GL_BUFFER_USAGE: 876 ctx->getBufferUsage(target,params); 877 break; 878 } 879 } 880 881 882 GL_APICALL GLenum GL_APIENTRY glGetError(void){ 883 GET_CTX_RET(GL_NO_ERROR) 884 GLenum err = ctx->getGLerror(); 885 if(err != GL_NO_ERROR) { 886 ctx->setGLerror(GL_NO_ERROR); 887 return err; 888 } 889 return ctx->dispatcher().glGetError(); 890 } 891 892 GL_APICALL void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params){ 893 GET_CTX(); 894 895 if (ctx->glGetFloatv(pname,params)) { 896 return; 897 } 898 899 GLint i; 900 901 switch (pname) { 902 case GL_CURRENT_PROGRAM: 903 case GL_FRAMEBUFFER_BINDING: 904 case GL_RENDERBUFFER_BINDING: 905 glGetIntegerv(pname,&i); 906 *params = (GLfloat)i; 907 break; 908 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 909 *params = (GLfloat)getCompressedFormats(NULL); 910 break; 911 case GL_COMPRESSED_TEXTURE_FORMATS: 912 { 913 int nparams = getCompressedFormats(NULL); 914 if (nparams>0) { 915 int * iparams = new int[nparams]; 916 getCompressedFormats(iparams); 917 for (int i=0; i<nparams; i++) params[i] = (GLfloat)iparams[i]; 918 delete [] iparams; 919 } 920 } 921 break; 922 923 case GL_SHADER_COMPILER: 924 case GL_SHADER_BINARY_FORMATS: 925 case GL_NUM_SHADER_BINARY_FORMATS: 926 case GL_MAX_VERTEX_UNIFORM_VECTORS: 927 case GL_MAX_VARYING_VECTORS: 928 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 929 if(ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY) 930 ctx->dispatcher().glGetFloatv(pname,params); 931 else 932 { 933 glGetIntegerv(pname,&i); 934 *params = (GLfloat)i; 935 } 936 break; 937 938 default: 939 ctx->dispatcher().glGetFloatv(pname,params); 940 } 941 } 942 943 GL_APICALL void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params){ 944 GET_CTX(); 945 946 if (ctx->glGetIntegerv(pname,params)) 947 { 948 return; 949 } 950 951 bool es2 = ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY; 952 GLint i; 953 954 switch (pname) { 955 case GL_CURRENT_PROGRAM: 956 if (ctx->shareGroup().Ptr()) { 957 ctx->dispatcher().glGetIntegerv(pname,&i); 958 *params = ctx->shareGroup()->getLocalName(SHADER,i); 959 } 960 break; 961 case GL_FRAMEBUFFER_BINDING: 962 if (ctx->shareGroup().Ptr()) { 963 ctx->dispatcher().glGetIntegerv(pname,&i); 964 *params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i); 965 } 966 break; 967 case GL_RENDERBUFFER_BINDING: 968 if (ctx->shareGroup().Ptr()) { 969 ctx->dispatcher().glGetIntegerv(pname,&i); 970 *params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i); 971 } 972 break; 973 974 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 975 *params = getCompressedFormats(NULL); 976 break; 977 case GL_COMPRESSED_TEXTURE_FORMATS: 978 getCompressedFormats(params); 979 break; 980 981 case GL_SHADER_COMPILER: 982 if(es2) 983 ctx->dispatcher().glGetIntegerv(pname,params); 984 else 985 *params = 1; 986 break; 987 988 case GL_SHADER_BINARY_FORMATS: 989 if(es2) 990 ctx->dispatcher().glGetIntegerv(pname,params); 991 break; 992 993 case GL_NUM_SHADER_BINARY_FORMATS: 994 if(es2) 995 ctx->dispatcher().glGetIntegerv(pname,params); 996 else 997 *params = 0; 998 break; 999 1000 case GL_MAX_VERTEX_UNIFORM_VECTORS: 1001 if(es2) 1002 ctx->dispatcher().glGetIntegerv(pname,params); 1003 else 1004 *params = 128; 1005 break; 1006 1007 case GL_MAX_VARYING_VECTORS: 1008 if(es2) 1009 ctx->dispatcher().glGetIntegerv(pname,params); 1010 else 1011 *params = 8; 1012 break; 1013 1014 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 1015 if(es2) 1016 ctx->dispatcher().glGetIntegerv(pname,params); 1017 else 1018 *params = 16; 1019 break; 1020 1021 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 1022 ctx->dispatcher().glGetIntegerv(pname,params); 1023 if(*params > 16) 1024 { 1025 // GLES spec requires only 2, and the ATI driver erronously 1026 // returns 32 (although it supports only 16). This WAR is simple, 1027 // compliant and good enough for developers. 1028 *params = 16; 1029 } 1030 break; 1031 default: 1032 ctx->dispatcher().glGetIntegerv(pname,params); 1033 } 1034 } 1035 1036 GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params){ 1037 GET_CTX(); 1038 SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target) && 1039 GLESv2Validate::framebufferAttachment(attachment) && 1040 GLESv2Validate::framebufferAttachmentParams(pname)),GL_INVALID_ENUM); 1041 1042 // 1043 // Take the attachment attribute from our state - if available 1044 // 1045 GLuint fbName = ctx->getFramebufferBinding(); 1046 if (fbName) { 1047 ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName); 1048 if (fbObj.Ptr() != NULL) { 1049 FramebufferData *fbData = (FramebufferData *)fbObj.Ptr(); 1050 GLenum target; 1051 GLuint name = fbData->getAttachment(attachment, &target, NULL); 1052 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) { 1053 if (target == GL_TEXTURE_2D) { 1054 *params = GL_TEXTURE; 1055 return; 1056 } 1057 else if (target == GL_RENDERBUFFER) { 1058 *params = GL_RENDERBUFFER; 1059 return; 1060 } 1061 } 1062 else if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { 1063 *params = name; 1064 return; 1065 } 1066 } 1067 } 1068 1069 ctx->dispatcher().glGetFramebufferAttachmentParameterivEXT(target,attachment,pname,params); 1070 } 1071 1072 GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params){ 1073 GET_CTX(); 1074 SET_ERROR_IF(!(GLESv2Validate::renderbufferTarget(target) && GLESv2Validate::renderbufferParams(pname)),GL_INVALID_ENUM); 1075 1076 // 1077 // If this is a renderbuffer which is eglimage's target, we 1078 // should query the underlying eglimage's texture object instead. 1079 // 1080 GLuint rb = ctx->getRenderbufferBinding(); 1081 if (rb) { 1082 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb); 1083 RenderbufferData *rbData = (RenderbufferData *)objData.Ptr(); 1084 if (rbData && rbData->sourceEGLImage != 0) { 1085 GLenum texPname; 1086 switch(pname) { 1087 case GL_RENDERBUFFER_WIDTH: 1088 texPname = GL_TEXTURE_WIDTH; 1089 break; 1090 case GL_RENDERBUFFER_HEIGHT: 1091 texPname = GL_TEXTURE_HEIGHT; 1092 break; 1093 case GL_RENDERBUFFER_INTERNAL_FORMAT: 1094 texPname = GL_TEXTURE_INTERNAL_FORMAT; 1095 break; 1096 case GL_RENDERBUFFER_RED_SIZE: 1097 texPname = GL_TEXTURE_RED_SIZE; 1098 break; 1099 case GL_RENDERBUFFER_GREEN_SIZE: 1100 texPname = GL_TEXTURE_GREEN_SIZE; 1101 break; 1102 case GL_RENDERBUFFER_BLUE_SIZE: 1103 texPname = GL_TEXTURE_BLUE_SIZE; 1104 break; 1105 case GL_RENDERBUFFER_ALPHA_SIZE: 1106 texPname = GL_TEXTURE_ALPHA_SIZE; 1107 break; 1108 case GL_RENDERBUFFER_DEPTH_SIZE: 1109 texPname = GL_TEXTURE_DEPTH_SIZE; 1110 break; 1111 case GL_RENDERBUFFER_STENCIL_SIZE: 1112 default: 1113 *params = 0; //XXX 1114 return; 1115 break; 1116 } 1117 1118 GLint prevTex; 1119 ctx->dispatcher().glGetIntegerv(GL_TEXTURE_BINDING_2D, &prevTex); 1120 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, 1121 rbData->eglImageGlobalTexName); 1122 ctx->dispatcher().glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, 1123 texPname, 1124 params); 1125 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, prevTex); 1126 return; 1127 } 1128 } 1129 1130 ctx->dispatcher().glGetRenderbufferParameterivEXT(target,pname,params); 1131 } 1132 1133 1134 GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params){ 1135 GET_CTX(); 1136 SET_ERROR_IF(!GLESv2Validate::programParam(pname),GL_INVALID_ENUM); 1137 if(ctx->shareGroup().Ptr()) { 1138 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1139 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1140 switch(pname) { 1141 case GL_LINK_STATUS: 1142 { 1143 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1144 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1145 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1146 ProgramData* programData = (ProgramData*)objData.Ptr(); 1147 params[0] = programData->getLinkStatus(); 1148 } 1149 break; 1150 //validate status should not return GL_TRUE if link failed 1151 case GL_VALIDATE_STATUS: 1152 { 1153 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1154 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1155 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1156 ProgramData* programData = (ProgramData*)objData.Ptr(); 1157 if (programData->getLinkStatus()==GL_TRUE) 1158 ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params); 1159 else 1160 params[0] = GL_FALSE; 1161 } 1162 break; 1163 case GL_INFO_LOG_LENGTH: 1164 { 1165 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1166 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1167 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1168 ProgramData* programData = (ProgramData*)objData.Ptr(); 1169 GLint logLength = strlen(programData->getInfoLog()); 1170 params[0] = (logLength>0) ? logLength+1 : 0; 1171 } 1172 break; 1173 default: 1174 ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params); 1175 } 1176 } 1177 } 1178 1179 GL_APICALL void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog){ 1180 GET_CTX(); 1181 if(ctx->shareGroup().Ptr()) { 1182 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1183 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1184 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1185 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1186 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1187 ProgramData* programData = (ProgramData*)objData.Ptr(); 1188 1189 if (bufsize==0) { 1190 if (length) { 1191 *length = 0; 1192 } 1193 return; 1194 } 1195 1196 GLsizei logLength; 1197 logLength = strlen(programData->getInfoLog()); 1198 1199 GLsizei returnLength=0; 1200 if (infolog) { 1201 returnLength = bufsize-1 < logLength ? bufsize-1 : logLength; 1202 strncpy(infolog,programData->getInfoLog(),returnLength+1); 1203 infolog[returnLength] = '\0'; 1204 } 1205 if (length) { 1206 *length = returnLength; 1207 } 1208 } 1209 } 1210 1211 GL_APICALL void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params){ 1212 GET_CTX(); 1213 if(ctx->shareGroup().Ptr()) { 1214 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1215 SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE); 1216 switch(pname) { 1217 case GL_INFO_LOG_LENGTH: 1218 { 1219 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1220 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1221 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1222 ShaderParser* sp = (ShaderParser*)objData.Ptr(); 1223 GLint logLength = strlen(sp->getInfoLog()); 1224 params[0] = (logLength>0) ? logLength+1 : 0; 1225 } 1226 break; 1227 default: 1228 ctx->dispatcher().glGetShaderiv(globalShaderName,pname,params); 1229 } 1230 } 1231 } 1232 1233 1234 GL_APICALL void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){ 1235 GET_CTX(); 1236 if(ctx->shareGroup().Ptr()) { 1237 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1238 SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE); 1239 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1240 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1241 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1242 ShaderParser* sp = (ShaderParser*)objData.Ptr(); 1243 1244 if (bufsize==0) { 1245 if (length) { 1246 *length = 0; 1247 } 1248 return; 1249 } 1250 1251 GLsizei logLength; 1252 logLength = strlen(sp->getInfoLog()); 1253 1254 GLsizei returnLength=0; 1255 if (infolog) { 1256 returnLength = bufsize-1 <logLength ? bufsize-1 : logLength; 1257 strncpy(infolog,sp->getInfoLog(),returnLength+1); 1258 infolog[returnLength] = '\0'; 1259 } 1260 if (length) { 1261 *length = returnLength; 1262 } 1263 } 1264 } 1265 1266 GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision){ 1267 GET_CTX_V2(); 1268 SET_ERROR_IF(!(GLESv2Validate::shaderType(shadertype) && GLESv2Validate::precisionType(precisiontype)),GL_INVALID_ENUM); 1269 1270 switch (precisiontype) { 1271 case GL_LOW_INT: 1272 case GL_MEDIUM_INT: 1273 case GL_HIGH_INT: 1274 range[0] = range[1] = 16; 1275 *precision = 0; 1276 break; 1277 1278 case GL_LOW_FLOAT: 1279 case GL_MEDIUM_FLOAT: 1280 case GL_HIGH_FLOAT: 1281 if(ctx->dispatcher().glGetShaderPrecisionFormat != NULL) { 1282 ctx->dispatcher().glGetShaderPrecisionFormat(shadertype,precisiontype,range,precision); 1283 } else { 1284 range[0] = range[1] = 127; 1285 *precision = 24; 1286 } 1287 break; 1288 } 1289 } 1290 1291 GL_APICALL void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source){ 1292 GET_CTX(); 1293 if(ctx->shareGroup().Ptr()) { 1294 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1295 SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE); 1296 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1297 SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION); 1298 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1299 const char* src = ((ShaderParser*)objData.Ptr())->getOriginalSrc(); 1300 int srcLength = 0; 1301 if (src) { 1302 srcLength = strlen(src); 1303 } 1304 1305 int returnLength = bufsize<srcLength ? bufsize-1 : srcLength; 1306 if (returnLength) { 1307 strncpy(source,src, returnLength); 1308 source[returnLength] = '\0'; 1309 } 1310 1311 if (length) 1312 *length = returnLength; 1313 } 1314 } 1315 1316 1317 GL_APICALL const GLubyte* GL_APIENTRY glGetString(GLenum name){ 1318 GET_CTX_RET(NULL) 1319 static const GLubyte SHADING[] = "OpenGL ES GLSL ES 1.0.17"; 1320 switch(name) { 1321 case GL_VENDOR: 1322 return (const GLubyte*)ctx->getVendorString(); 1323 case GL_RENDERER: 1324 return (const GLubyte*)ctx->getRendererString(); 1325 case GL_VERSION: 1326 return (const GLubyte*)ctx->getVersionString(); 1327 case GL_SHADING_LANGUAGE_VERSION: 1328 return SHADING; 1329 case GL_EXTENSIONS: 1330 return (const GLubyte*)ctx->getExtensionString(); 1331 default: 1332 RET_AND_SET_ERROR_IF(true,GL_INVALID_ENUM,NULL); 1333 } 1334 } 1335 1336 GL_APICALL void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params){ 1337 GET_CTX(); 1338 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1339 ctx->dispatcher().glGetTexParameterfv(target,pname,params); 1340 1341 } 1342 GL_APICALL void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params){ 1343 GET_CTX(); 1344 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1345 ctx->dispatcher().glGetTexParameteriv(target,pname,params); 1346 } 1347 1348 GL_APICALL void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params){ 1349 GET_CTX(); 1350 SET_ERROR_IF(location < 0,GL_INVALID_OPERATION); 1351 if(ctx->shareGroup().Ptr()) { 1352 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1353 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1354 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1355 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1356 ProgramData* pData = (ProgramData *)objData.Ptr(); 1357 SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION); 1358 ctx->dispatcher().glGetUniformfv(globalProgramName,location,params); 1359 } 1360 } 1361 1362 GL_APICALL void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params){ 1363 GET_CTX(); 1364 SET_ERROR_IF(location < 0,GL_INVALID_OPERATION); 1365 if(ctx->shareGroup().Ptr()) { 1366 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1367 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1368 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1369 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1370 ProgramData* pData = (ProgramData *)objData.Ptr(); 1371 SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION); 1372 ctx->dispatcher().glGetUniformiv(globalProgramName,location,params); 1373 } 1374 } 1375 1376 GL_APICALL int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name){ 1377 GET_CTX_RET(-1); 1378 if(ctx->shareGroup().Ptr()) { 1379 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1380 RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1); 1381 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1382 RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1); 1383 ProgramData* pData = (ProgramData *)objData.Ptr(); 1384 RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1); 1385 return ctx->dispatcher().glGetUniformLocation(globalProgramName,name); 1386 } 1387 return -1; 1388 } 1389 1390 1391 1392 GL_APICALL void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params){ 1393 GET_CTX_V2(); 1394 const GLESpointer* p = ctx->getPointer(index); 1395 if(p) { 1396 switch(pname){ 1397 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 1398 *params = 0; 1399 break; 1400 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: 1401 *params = p->isEnable(); 1402 break; 1403 case GL_VERTEX_ATTRIB_ARRAY_SIZE: 1404 *params = p->getSize(); 1405 break; 1406 case GL_VERTEX_ATTRIB_ARRAY_STRIDE: 1407 *params = p->getStride(); 1408 break; 1409 case GL_VERTEX_ATTRIB_ARRAY_TYPE: 1410 *params = p->getType(); 1411 break; 1412 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: 1413 *params = p->isNormalize(); 1414 break; 1415 case GL_CURRENT_VERTEX_ATTRIB: 1416 if(index == 0) 1417 { 1418 const float* att0 = ctx->getAtt0(); 1419 for(int i=0; i<4; i++) 1420 params[i] = att0[i]; 1421 } 1422 else 1423 ctx->dispatcher().glGetVertexAttribfv(index,pname,params); 1424 break; 1425 default: 1426 ctx->setGLerror(GL_INVALID_ENUM); 1427 } 1428 } else { 1429 ctx->setGLerror(GL_INVALID_VALUE); 1430 } 1431 } 1432 1433 GL_APICALL void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params){ 1434 GET_CTX_V2(); 1435 const GLESpointer* p = ctx->getPointer(index); 1436 if(p) { 1437 switch(pname){ 1438 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 1439 *params = 0; 1440 break; 1441 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: 1442 *params = p->isEnable(); 1443 break; 1444 case GL_VERTEX_ATTRIB_ARRAY_SIZE: 1445 *params = p->getSize(); 1446 break; 1447 case GL_VERTEX_ATTRIB_ARRAY_STRIDE: 1448 *params = p->getStride(); 1449 break; 1450 case GL_VERTEX_ATTRIB_ARRAY_TYPE: 1451 *params = p->getType(); 1452 break; 1453 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: 1454 *params = p->isNormalize(); 1455 break; 1456 case GL_CURRENT_VERTEX_ATTRIB: 1457 if(index == 0) 1458 { 1459 const float* att0 = ctx->getAtt0(); 1460 for(int i=0; i<4; i++) 1461 params[i] = (GLint)att0[i]; 1462 } 1463 else 1464 ctx->dispatcher().glGetVertexAttribiv(index,pname,params); 1465 break; 1466 default: 1467 ctx->setGLerror(GL_INVALID_ENUM); 1468 } 1469 } else { 1470 ctx->setGLerror(GL_INVALID_VALUE); 1471 } 1472 } 1473 1474 GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer){ 1475 GET_CTX(); 1476 SET_ERROR_IF(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER,GL_INVALID_ENUM); 1477 SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE); 1478 1479 const GLESpointer* p = ctx->getPointer(index); 1480 if(p) { 1481 *pointer = const_cast<void *>( p->getBufferData()); 1482 } else { 1483 ctx->setGLerror(GL_INVALID_VALUE); 1484 } 1485 } 1486 1487 GL_APICALL void GL_APIENTRY glHint(GLenum target, GLenum mode){ 1488 GET_CTX(); 1489 SET_ERROR_IF(!GLESv2Validate::hintTargetMode(target,mode),GL_INVALID_ENUM); 1490 ctx->dispatcher().glHint(target,mode); 1491 } 1492 1493 GL_APICALL GLboolean GL_APIENTRY glIsEnabled(GLenum cap){ 1494 GET_CTX_RET(GL_FALSE); 1495 RET_AND_SET_ERROR_IF(!GLESv2Validate::capability(cap),GL_INVALID_ENUM,GL_FALSE); 1496 return ctx->dispatcher().glIsEnabled(cap); 1497 } 1498 1499 GL_APICALL GLboolean GL_APIENTRY glIsBuffer(GLuint buffer){ 1500 GET_CTX_RET(GL_FALSE) 1501 if(buffer && ctx->shareGroup().Ptr()) { 1502 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer); 1503 return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE; 1504 } 1505 return GL_FALSE; 1506 } 1507 1508 GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer){ 1509 GET_CTX_RET(GL_FALSE) 1510 if(framebuffer && ctx->shareGroup().Ptr()){ 1511 return ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE :GL_FALSE; 1512 } 1513 return GL_FALSE; 1514 } 1515 1516 GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer){ 1517 GET_CTX_RET(GL_FALSE) 1518 if(renderbuffer && ctx->shareGroup().Ptr()){ 1519 return ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE; 1520 } 1521 return GL_FALSE; 1522 } 1523 1524 GL_APICALL GLboolean GL_APIENTRY glIsTexture(GLuint texture){ 1525 GET_CTX_RET(GL_FALSE) 1526 if (texture==0) 1527 return GL_FALSE; 1528 TextureData* tex = getTextureData(texture); 1529 return tex ? tex->wasBound : GL_FALSE; 1530 } 1531 1532 GL_APICALL GLboolean GL_APIENTRY glIsProgram(GLuint program){ 1533 GET_CTX_RET(GL_FALSE) 1534 if(program && ctx->shareGroup().Ptr() && 1535 ctx->shareGroup()->isObject(SHADER,program)) { 1536 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1537 return ctx->dispatcher().glIsProgram(globalProgramName); 1538 } 1539 return GL_FALSE; 1540 } 1541 1542 GL_APICALL GLboolean GL_APIENTRY glIsShader(GLuint shader){ 1543 GET_CTX_RET(GL_FALSE) 1544 if(shader && ctx->shareGroup().Ptr() && 1545 ctx->shareGroup()->isObject(SHADER,shader)) { 1546 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1547 return ctx->dispatcher().glIsShader(globalShaderName); 1548 } 1549 return GL_FALSE; 1550 } 1551 1552 GL_APICALL void GL_APIENTRY glLineWidth(GLfloat width){ 1553 GET_CTX(); 1554 ctx->dispatcher().glLineWidth(width); 1555 } 1556 1557 GL_APICALL void GL_APIENTRY glLinkProgram(GLuint program){ 1558 GET_CTX(); 1559 GLint linkStatus = GL_FALSE; 1560 if(ctx->shareGroup().Ptr()) { 1561 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1562 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1563 1564 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1565 SET_ERROR_IF(!objData.Ptr(), GL_INVALID_OPERATION); 1566 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA, GL_INVALID_OPERATION); 1567 ProgramData* programData = (ProgramData*)objData.Ptr(); 1568 GLint fragmentShader = programData->getAttachedFragmentShader(); 1569 GLint vertexShader = programData->getAttachedVertexShader(); 1570 if (vertexShader != 0 && fragmentShader!=0) { 1571 /* validating that the fragment & vertex shaders were compiled successfuly*/ 1572 GLint fCompileStatus = GL_FALSE; 1573 GLint vCompileStatus = GL_FALSE; 1574 GLuint fragmentShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,fragmentShader); 1575 GLuint vertexShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,vertexShader); 1576 ctx->dispatcher().glGetShaderiv(fragmentShaderGlobal,GL_COMPILE_STATUS,&fCompileStatus); 1577 ctx->dispatcher().glGetShaderiv(vertexShaderGlobal,GL_COMPILE_STATUS,&vCompileStatus); 1578 1579 if(fCompileStatus != 0 && vCompileStatus != 0){ 1580 ctx->dispatcher().glLinkProgram(globalProgramName); 1581 ctx->dispatcher().glGetProgramiv(globalProgramName,GL_LINK_STATUS,&linkStatus); 1582 } 1583 } 1584 programData->setLinkStatus(linkStatus); 1585 1586 GLsizei infoLogLength=0; 1587 GLchar* infoLog; 1588 ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength); 1589 infoLog = new GLchar[infoLogLength+1]; 1590 ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog); 1591 programData->setInfoLog(infoLog); 1592 } 1593 } 1594 1595 GL_APICALL void GL_APIENTRY glPixelStorei(GLenum pname, GLint param){ 1596 GET_CTX(); 1597 SET_ERROR_IF(!GLESv2Validate::pixelStoreParam(pname),GL_INVALID_ENUM); 1598 SET_ERROR_IF(!((param==1)||(param==2)||(param==4)||(param==8)), GL_INVALID_VALUE); 1599 ctx->setUnpackAlignment(param); 1600 ctx->dispatcher().glPixelStorei(pname,param); 1601 } 1602 1603 GL_APICALL void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units){ 1604 GET_CTX(); 1605 ctx->dispatcher().glPolygonOffset(factor,units); 1606 } 1607 1608 GL_APICALL void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels){ 1609 GET_CTX(); 1610 SET_ERROR_IF(!(GLESv2Validate::readPixelFrmt(format) && GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM); 1611 SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type)),GL_INVALID_OPERATION); 1612 ctx->dispatcher().glReadPixels(x,y,width,height,format,type,pixels); 1613 } 1614 1615 1616 GL_APICALL void GL_APIENTRY glReleaseShaderCompiler(void){ 1617 GET_CTX(); 1618 1619 if(ctx->dispatcher().glReleaseShaderCompiler != NULL) 1620 { 1621 ctx->dispatcher().glReleaseShaderCompiler(); 1622 } 1623 } 1624 1625 GL_APICALL void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){ 1626 GET_CTX(); 1627 GLenum internal = internalformat; 1628 switch (internalformat) { 1629 case GL_RGB565: 1630 internal = GL_RGB; 1631 break; 1632 case GL_RGB5_A1: 1633 internal = GL_RGBA; 1634 break; 1635 default: 1636 internal = internalformat; 1637 break; 1638 } 1639 1640 // Get current bounded renderbuffer 1641 // raise INVALID_OPERATIOn if no renderbuffer is bounded 1642 GLuint rb = ctx->getRenderbufferBinding(); 1643 SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION); 1644 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb); 1645 RenderbufferData *rbData = (RenderbufferData *)objData.Ptr(); 1646 SET_ERROR_IF(!rbData,GL_INVALID_OPERATION); 1647 1648 // 1649 // if the renderbuffer was an eglImage target, detach from 1650 // the eglImage. 1651 // 1652 if (rbData->sourceEGLImage != 0) { 1653 if (rbData->eglImageDetach) { 1654 (*rbData->eglImageDetach)(rbData->sourceEGLImage); 1655 } 1656 rbData->sourceEGLImage = 0; 1657 rbData->eglImageGlobalTexName = 0; 1658 } 1659 1660 ctx->dispatcher().glRenderbufferStorageEXT(target,internal,width,height); 1661 } 1662 1663 GL_APICALL void GL_APIENTRY glSampleCoverage(GLclampf value, GLboolean invert){ 1664 GET_CTX(); 1665 ctx->dispatcher().glSampleCoverage(value,invert); 1666 } 1667 1668 GL_APICALL void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height){ 1669 GET_CTX(); 1670 ctx->dispatcher().glScissor(x,y,width,height); 1671 } 1672 1673 GL_APICALL void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length){ 1674 GET_CTX(); 1675 1676 SET_ERROR_IF( (ctx->dispatcher().glShaderBinary == NULL), GL_INVALID_OPERATION); 1677 1678 if(ctx->shareGroup().Ptr()){ 1679 for(int i=0; i < n ; i++){ 1680 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shaders[i]); 1681 SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE); 1682 ctx->dispatcher().glShaderBinary(1,&globalShaderName,binaryformat,binary,length); 1683 } 1684 } 1685 } 1686 1687 GL_APICALL void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length){ 1688 GET_CTX_V2(); 1689 SET_ERROR_IF(count < 0,GL_INVALID_VALUE); 1690 if(ctx->shareGroup().Ptr()){ 1691 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1692 SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE); 1693 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1694 SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION); 1695 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1696 ShaderParser* sp = (ShaderParser*)objData.Ptr(); 1697 sp->setSrc(ctx->glslVersion(),count,string,length); 1698 ctx->dispatcher().glShaderSource(globalShaderName,1,sp->parsedLines(),NULL); 1699 } 1700 } 1701 1702 GL_APICALL void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask){ 1703 GET_CTX(); 1704 ctx->dispatcher().glStencilFunc(func,ref,mask); 1705 } 1706 GL_APICALL void GL_APIENTRY glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask){ 1707 GET_CTX(); 1708 ctx->dispatcher().glStencilFuncSeparate(face,func,ref,mask); 1709 } 1710 GL_APICALL void GL_APIENTRY glStencilMask(GLuint mask){ 1711 GET_CTX(); 1712 ctx->dispatcher().glStencilMask(mask); 1713 } 1714 1715 GL_APICALL void GL_APIENTRY glStencilMaskSeparate(GLenum face, GLuint mask){ 1716 GET_CTX(); 1717 ctx->dispatcher().glStencilMaskSeparate(face,mask); 1718 } 1719 1720 GL_APICALL void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass){ 1721 GET_CTX(); 1722 ctx->dispatcher().glStencilOp(fail,zfail,zpass); 1723 } 1724 1725 GL_APICALL void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass){ 1726 GET_CTX(); 1727 ctx->dispatcher().glStencilOp(fail,zfail,zpass); 1728 } 1729 1730 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){ 1731 GET_CTX(); 1732 SET_ERROR_IF(!(GLESv2Validate::textureTargetEx(target) && 1733 GLESv2Validate::pixelFrmt(ctx,internalformat) && 1734 GLESv2Validate::pixelFrmt(ctx,format)&& 1735 GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM); 1736 1737 SET_ERROR_IF((format == GL_DEPTH_COMPONENT || internalformat == GL_DEPTH_COMPONENT) && 1738 (type != GL_UNSIGNED_SHORT && type != GL_UNSIGNED_INT), GL_INVALID_OPERATION); 1739 1740 SET_ERROR_IF((type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT) && 1741 (format != GL_DEPTH_COMPONENT || internalformat != GL_DEPTH_COMPONENT), GL_INVALID_OPERATION); 1742 1743 SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type) && internalformat == ((GLint)format)),GL_INVALID_OPERATION); 1744 SET_ERROR_IF(border != 0,GL_INVALID_VALUE); 1745 1746 if (ctx->shareGroup().Ptr()){ 1747 TextureData *texData = getTextureTargetData(target); 1748 if(texData) { 1749 texData->width = width; 1750 texData->height = height; 1751 texData->border = border; 1752 texData->internalFormat = internalformat; 1753 texData->target = target; 1754 1755 if (texData->sourceEGLImage != 0) { 1756 // 1757 // This texture was a target of EGLImage, 1758 // but now it is re-defined so we need to detach 1759 // from the EGLImage and re-generate global texture name 1760 // for it. 1761 // 1762 if (texData->eglImageDetach) { 1763 (*texData->eglImageDetach)(texData->sourceEGLImage); 1764 } 1765 unsigned int tex = ctx->getBindedTexture(target); 1766 ctx->shareGroup()->replaceGlobalName(TEXTURE, 1767 tex, 1768 texData->oldGlobal); 1769 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, texData->oldGlobal); 1770 texData->sourceEGLImage = 0; 1771 texData->oldGlobal = 0; 1772 } 1773 } 1774 } 1775 1776 if (type==GL_HALF_FLOAT_OES) 1777 type = GL_HALF_FLOAT_NV; 1778 if (pixels==NULL && type==GL_UNSIGNED_SHORT_5_5_5_1) 1779 type = GL_UNSIGNED_SHORT; 1780 ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels); 1781 } 1782 1783 1784 GL_APICALL void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param){ 1785 GET_CTX(); 1786 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1787 ctx->dispatcher().glTexParameterf(target,pname,param); 1788 } 1789 GL_APICALL void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params){ 1790 GET_CTX(); 1791 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1792 ctx->dispatcher().glTexParameterfv(target,pname,params); 1793 } 1794 GL_APICALL void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param){ 1795 GET_CTX(); 1796 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1797 ctx->dispatcher().glTexParameteri(target,pname,param); 1798 } 1799 GL_APICALL void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params){ 1800 GET_CTX(); 1801 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1802 ctx->dispatcher().glTexParameteriv(target,pname,params); 1803 } 1804 1805 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){ 1806 GET_CTX(); 1807 SET_ERROR_IF(!(GLESv2Validate::textureTargetEx(target) && 1808 GLESv2Validate::pixelFrmt(ctx,format)&& 1809 GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM); 1810 SET_ERROR_IF(!GLESv2Validate::pixelOp(format,type),GL_INVALID_OPERATION); 1811 if (type==GL_HALF_FLOAT_OES) 1812 type = GL_HALF_FLOAT_NV; 1813 1814 ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels); 1815 1816 } 1817 1818 GL_APICALL void GL_APIENTRY glUniform1f(GLint location, GLfloat x){ 1819 GET_CTX(); 1820 ctx->dispatcher().glUniform1f(location,x); 1821 } 1822 GL_APICALL void GL_APIENTRY glUniform1fv(GLint location, GLsizei count, const GLfloat* v){ 1823 GET_CTX(); 1824 ctx->dispatcher().glUniform1fv(location,count,v); 1825 } 1826 1827 GL_APICALL void GL_APIENTRY glUniform1i(GLint location, GLint x){ 1828 GET_CTX(); 1829 ctx->dispatcher().glUniform1i(location,x); 1830 } 1831 GL_APICALL void GL_APIENTRY glUniform1iv(GLint location, GLsizei count, const GLint* v){ 1832 GET_CTX(); 1833 ctx->dispatcher().glUniform1iv(location,count,v); 1834 } 1835 GL_APICALL void GL_APIENTRY glUniform2f(GLint location, GLfloat x, GLfloat y){ 1836 GET_CTX(); 1837 ctx->dispatcher().glUniform2f(location,x,y); 1838 } 1839 GL_APICALL void GL_APIENTRY glUniform2fv(GLint location, GLsizei count, const GLfloat* v){ 1840 GET_CTX(); 1841 ctx->dispatcher().glUniform2fv(location,count,v); 1842 } 1843 GL_APICALL void GL_APIENTRY glUniform2i(GLint location, GLint x, GLint y){ 1844 GET_CTX(); 1845 ctx->dispatcher().glUniform2i(location,x,y); 1846 } 1847 GL_APICALL void GL_APIENTRY glUniform2iv(GLint location, GLsizei count, const GLint* v){ 1848 GET_CTX(); 1849 ctx->dispatcher().glUniform2iv(location,count,v); 1850 } 1851 GL_APICALL void GL_APIENTRY glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z){ 1852 GET_CTX(); 1853 ctx->dispatcher().glUniform3f(location,x,y,z); 1854 } 1855 GL_APICALL void GL_APIENTRY glUniform3fv(GLint location, GLsizei count, const GLfloat* v){ 1856 GET_CTX(); 1857 ctx->dispatcher().glUniform3fv(location,count,v); 1858 } 1859 GL_APICALL void GL_APIENTRY glUniform3i(GLint location, GLint x, GLint y, GLint z){ 1860 GET_CTX(); 1861 ctx->dispatcher().glUniform3i(location,x,y,z); 1862 } 1863 1864 GL_APICALL void GL_APIENTRY glUniform3iv(GLint location, GLsizei count, const GLint* v){ 1865 GET_CTX(); 1866 ctx->dispatcher().glUniform3iv(location,count,v); 1867 } 1868 1869 GL_APICALL void GL_APIENTRY glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w){ 1870 GET_CTX(); 1871 ctx->dispatcher().glUniform4f(location,x,y,z,w); 1872 } 1873 1874 GL_APICALL void GL_APIENTRY glUniform4fv(GLint location, GLsizei count, const GLfloat* v){ 1875 GET_CTX(); 1876 ctx->dispatcher().glUniform4fv(location,count,v); 1877 } 1878 1879 GL_APICALL void GL_APIENTRY glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w){ 1880 GET_CTX(); 1881 ctx->dispatcher().glUniform4i(location,x,y,z,w); 1882 } 1883 1884 GL_APICALL void GL_APIENTRY glUniform4iv(GLint location, GLsizei count, const GLint* v){ 1885 GET_CTX(); 1886 ctx->dispatcher().glUniform4iv(location,count,v); 1887 } 1888 1889 GL_APICALL void GL_APIENTRY glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){ 1890 GET_CTX(); 1891 SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE); 1892 ctx->dispatcher().glUniformMatrix2fv(location,count,transpose,value); 1893 } 1894 1895 GL_APICALL void GL_APIENTRY glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){ 1896 GET_CTX(); 1897 SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE); 1898 ctx->dispatcher().glUniformMatrix3fv(location,count,transpose,value); 1899 } 1900 1901 GL_APICALL void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){ 1902 GET_CTX(); 1903 SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE); 1904 ctx->dispatcher().glUniformMatrix4fv(location,count,transpose,value); 1905 } 1906 1907 GL_APICALL void GL_APIENTRY glUseProgram(GLuint program){ 1908 GET_CTX(); 1909 if(ctx->shareGroup().Ptr()) { 1910 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1911 SET_ERROR_IF(program!=0 && globalProgramName==0,GL_INVALID_VALUE); 1912 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1913 SET_ERROR_IF(objData.Ptr() && (objData.Ptr()->getDataType()!=PROGRAM_DATA),GL_INVALID_OPERATION); 1914 ctx->dispatcher().glUseProgram(globalProgramName); 1915 } 1916 } 1917 1918 GL_APICALL void GL_APIENTRY glValidateProgram(GLuint program){ 1919 GET_CTX(); 1920 if(ctx->shareGroup().Ptr()) { 1921 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1922 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1923 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1924 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1925 ProgramData* programData = (ProgramData*)objData.Ptr(); 1926 ctx->dispatcher().glValidateProgram(globalProgramName); 1927 1928 GLsizei infoLogLength=0; 1929 GLchar* infoLog; 1930 ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength); 1931 infoLog = new GLchar[infoLogLength+1]; 1932 ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog); 1933 programData->setInfoLog(infoLog); 1934 } 1935 } 1936 1937 GL_APICALL void GL_APIENTRY glVertexAttrib1f(GLuint indx, GLfloat x){ 1938 GET_CTX_V2(); 1939 ctx->dispatcher().glVertexAttrib1f(indx,x); 1940 if(indx == 0) 1941 ctx->setAttribute0value(x, 0.0, 0.0, 1.0); 1942 } 1943 1944 GL_APICALL void GL_APIENTRY glVertexAttrib1fv(GLuint indx, const GLfloat* values){ 1945 GET_CTX_V2(); 1946 ctx->dispatcher().glVertexAttrib1fv(indx,values); 1947 if(indx == 0) 1948 ctx->setAttribute0value(values[0], 0.0, 0.0, 1.0); 1949 } 1950 1951 GL_APICALL void GL_APIENTRY glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y){ 1952 GET_CTX_V2(); 1953 ctx->dispatcher().glVertexAttrib2f(indx,x,y); 1954 if(indx == 0) 1955 ctx->setAttribute0value(x, y, 0.0, 1.0); 1956 } 1957 1958 GL_APICALL void GL_APIENTRY glVertexAttrib2fv(GLuint indx, const GLfloat* values){ 1959 GET_CTX_V2(); 1960 ctx->dispatcher().glVertexAttrib2fv(indx,values); 1961 if(indx == 0) 1962 ctx->setAttribute0value(values[0], values[1], 0.0, 1.0); 1963 } 1964 1965 GL_APICALL void GL_APIENTRY glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z){ 1966 GET_CTX_V2(); 1967 ctx->dispatcher().glVertexAttrib3f(indx,x,y,z); 1968 if(indx == 0) 1969 ctx->setAttribute0value(x, y, z, 1.0); 1970 } 1971 1972 GL_APICALL void GL_APIENTRY glVertexAttrib3fv(GLuint indx, const GLfloat* values){ 1973 GET_CTX_V2(); 1974 ctx->dispatcher().glVertexAttrib3fv(indx,values); 1975 if(indx == 0) 1976 ctx->setAttribute0value(values[0], values[1], values[2], 1.0); 1977 } 1978 1979 GL_APICALL void GL_APIENTRY glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w){ 1980 GET_CTX_V2(); 1981 ctx->dispatcher().glVertexAttrib4f(indx,x,y,z,w); 1982 if(indx == 0) 1983 ctx->setAttribute0value(x, y, z, w); 1984 } 1985 1986 GL_APICALL void GL_APIENTRY glVertexAttrib4fv(GLuint indx, const GLfloat* values){ 1987 GET_CTX_V2(); 1988 ctx->dispatcher().glVertexAttrib4fv(indx,values); 1989 if(indx == 0) 1990 ctx->setAttribute0value(values[0], values[1], values[2], values[3]); 1991 } 1992 1993 GL_APICALL void GL_APIENTRY glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr){ 1994 GET_CTX(); 1995 SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,indx)),GL_INVALID_VALUE); 1996 if (type == GL_HALF_FLOAT_OES) type = GL_HALF_FLOAT; 1997 ctx->setPointer(indx,size,type,stride,ptr,normalized); 1998 } 1999 2000 GL_APICALL void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height){ 2001 GET_CTX(); 2002 ctx->dispatcher().glViewport(x,y,width,height); 2003 } 2004 2005 GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) 2006 { 2007 GET_CTX(); 2008 SET_ERROR_IF(!GLESv2Validate::textureTargetLimited(target),GL_INVALID_ENUM); 2009 unsigned int imagehndl = ToTargetCompatibleHandle((uintptr_t)image); 2010 EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl); 2011 if (img) { 2012 // Create the texture object in the underlying EGL implementation, 2013 // flag to the OpenGL layer to skip the image creation and map the 2014 // current binded texture object to the existing global object. 2015 if (ctx->shareGroup().Ptr()) { 2016 ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target)); 2017 unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex); 2018 // Delete old texture object but only if it is not a target of a EGLImage 2019 if (oldGlobal) { 2020 TextureData* oldTexData = getTextureData(tex); 2021 if (!oldTexData || oldTexData->sourceEGLImage == 0) { 2022 ctx->dispatcher().glDeleteTextures(1, &oldGlobal); 2023 } 2024 } 2025 // replace mapping and bind the new global object 2026 ctx->shareGroup()->replaceGlobalName(TEXTURE, tex,img->globalTexName); 2027 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName); 2028 TextureData *texData = getTextureTargetData(target); 2029 SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION); 2030 texData->width = img->width; 2031 texData->height = img->height; 2032 texData->border = img->border; 2033 texData->internalFormat = img->internalFormat; 2034 texData->sourceEGLImage = imagehndl; 2035 texData->eglImageDetach = s_eglIface->eglDetachEGLImage; 2036 texData->oldGlobal = oldGlobal; 2037 } 2038 } 2039 } 2040 2041 GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) 2042 { 2043 GET_CTX(); 2044 SET_ERROR_IF(target != GL_RENDERBUFFER_OES,GL_INVALID_ENUM); 2045 unsigned int imagehndl = ToTargetCompatibleHandle((uintptr_t)image); 2046 EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl); 2047 SET_ERROR_IF(!img,GL_INVALID_VALUE); 2048 SET_ERROR_IF(!ctx->shareGroup().Ptr(),GL_INVALID_OPERATION); 2049 2050 // Get current bounded renderbuffer 2051 // raise INVALID_OPERATIOn if no renderbuffer is bounded 2052 GLuint rb = ctx->getRenderbufferBinding(); 2053 SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION); 2054 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb); 2055 RenderbufferData *rbData = (RenderbufferData *)objData.Ptr(); 2056 SET_ERROR_IF(!rbData,GL_INVALID_OPERATION); 2057 2058 // 2059 // flag in the renderbufferData that it is an eglImage target 2060 // 2061 rbData->sourceEGLImage = imagehndl; 2062 rbData->eglImageDetach = s_eglIface->eglDetachEGLImage; 2063 rbData->eglImageGlobalTexName = img->globalTexName; 2064 2065 // 2066 // if the renderbuffer is attached to a framebuffer 2067 // change the framebuffer attachment in the undelying OpenGL 2068 // to point to the eglImage texture object. 2069 // 2070 if (rbData->attachedFB) { 2071 // update the framebuffer attachment point to the 2072 // underlying texture of the img 2073 GLuint prevFB = ctx->getFramebufferBinding(); 2074 if (prevFB != rbData->attachedFB) { 2075 ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 2076 rbData->attachedFB); 2077 } 2078 ctx->dispatcher().glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, 2079 rbData->attachedPoint, 2080 GL_TEXTURE_2D, 2081 img->globalTexName,0); 2082 if (prevFB != rbData->attachedFB) { 2083 ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 2084 prevFB); 2085 } 2086 } 2087 } 2088