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 + SafeUIntFromPointer(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 switch(pname) { 871 case GL_BUFFER_SIZE: 872 ctx->getBufferSize(target,params); 873 break; 874 case GL_BUFFER_USAGE: 875 ctx->getBufferUsage(target,params); 876 break; 877 } 878 } 879 880 881 GL_APICALL GLenum GL_APIENTRY glGetError(void){ 882 GET_CTX_RET(GL_NO_ERROR) 883 GLenum err = ctx->getGLerror(); 884 if(err != GL_NO_ERROR) { 885 ctx->setGLerror(GL_NO_ERROR); 886 return err; 887 } 888 return ctx->dispatcher().glGetError(); 889 } 890 891 GL_APICALL void GL_APIENTRY glGetFloatv(GLenum pname, GLfloat* params){ 892 GET_CTX(); 893 894 if (ctx->glGetFloatv(pname,params)) { 895 return; 896 } 897 898 GLint i; 899 900 switch (pname) { 901 case GL_CURRENT_PROGRAM: 902 case GL_FRAMEBUFFER_BINDING: 903 case GL_RENDERBUFFER_BINDING: 904 glGetIntegerv(pname,&i); 905 *params = (GLfloat)i; 906 break; 907 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 908 *params = (GLfloat)getCompressedFormats(NULL); 909 break; 910 case GL_COMPRESSED_TEXTURE_FORMATS: 911 { 912 int nparams = getCompressedFormats(NULL); 913 if (nparams>0) { 914 int * iparams = new int[nparams]; 915 getCompressedFormats(iparams); 916 for (int i=0; i<nparams; i++) params[i] = (GLfloat)iparams[i]; 917 delete [] iparams; 918 } 919 } 920 break; 921 922 case GL_SHADER_COMPILER: 923 case GL_SHADER_BINARY_FORMATS: 924 case GL_NUM_SHADER_BINARY_FORMATS: 925 case GL_MAX_VERTEX_UNIFORM_VECTORS: 926 case GL_MAX_VARYING_VECTORS: 927 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 928 if(ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY) 929 ctx->dispatcher().glGetFloatv(pname,params); 930 else 931 { 932 glGetIntegerv(pname,&i); 933 *params = (GLfloat)i; 934 } 935 break; 936 937 default: 938 ctx->dispatcher().glGetFloatv(pname,params); 939 } 940 } 941 942 GL_APICALL void GL_APIENTRY glGetIntegerv(GLenum pname, GLint* params){ 943 int destroyCtx = 0; 944 GET_CTX(); 945 946 if (!ctx) { 947 ctx = createGLESContext(); 948 if (ctx) 949 destroyCtx = 1; 950 } 951 if (ctx->glGetIntegerv(pname,params)) 952 { 953 if (destroyCtx) 954 deleteGLESContext(ctx); 955 return; 956 } 957 958 bool es2 = ctx->getCaps()->GL_ARB_ES2_COMPATIBILITY; 959 GLint i; 960 961 switch (pname) { 962 case GL_CURRENT_PROGRAM: 963 if (ctx->shareGroup().Ptr()) { 964 ctx->dispatcher().glGetIntegerv(pname,&i); 965 *params = ctx->shareGroup()->getLocalName(SHADER,i); 966 } 967 break; 968 case GL_FRAMEBUFFER_BINDING: 969 if (ctx->shareGroup().Ptr()) { 970 ctx->dispatcher().glGetIntegerv(pname,&i); 971 *params = ctx->shareGroup()->getLocalName(FRAMEBUFFER,i); 972 } 973 break; 974 case GL_RENDERBUFFER_BINDING: 975 if (ctx->shareGroup().Ptr()) { 976 ctx->dispatcher().glGetIntegerv(pname,&i); 977 *params = ctx->shareGroup()->getLocalName(RENDERBUFFER,i); 978 } 979 break; 980 981 case GL_NUM_COMPRESSED_TEXTURE_FORMATS: 982 *params = getCompressedFormats(NULL); 983 break; 984 case GL_COMPRESSED_TEXTURE_FORMATS: 985 getCompressedFormats(params); 986 break; 987 988 case GL_SHADER_COMPILER: 989 if(es2) 990 ctx->dispatcher().glGetIntegerv(pname,params); 991 else 992 *params = 1; 993 break; 994 995 case GL_SHADER_BINARY_FORMATS: 996 if(es2) 997 ctx->dispatcher().glGetIntegerv(pname,params); 998 break; 999 1000 case GL_NUM_SHADER_BINARY_FORMATS: 1001 if(es2) 1002 ctx->dispatcher().glGetIntegerv(pname,params); 1003 else 1004 *params = 0; 1005 break; 1006 1007 case GL_MAX_VERTEX_UNIFORM_VECTORS: 1008 if(es2) 1009 ctx->dispatcher().glGetIntegerv(pname,params); 1010 else 1011 *params = 128; 1012 break; 1013 1014 case GL_MAX_VARYING_VECTORS: 1015 if(es2) 1016 ctx->dispatcher().glGetIntegerv(pname,params); 1017 else 1018 *params = 8; 1019 break; 1020 1021 case GL_MAX_FRAGMENT_UNIFORM_VECTORS: 1022 if(es2) 1023 ctx->dispatcher().glGetIntegerv(pname,params); 1024 else 1025 *params = 16; 1026 break; 1027 1028 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 1029 ctx->dispatcher().glGetIntegerv(pname,params); 1030 if(*params > 16) 1031 { 1032 // GLES spec requires only 2, and the ATI driver erronously 1033 // returns 32 (although it supports only 16). This WAR is simple, 1034 // compliant and good enough for developers. 1035 *params = 16; 1036 } 1037 break; 1038 default: 1039 ctx->dispatcher().glGetIntegerv(pname,params); 1040 } 1041 if (destroyCtx) 1042 deleteGLESContext(ctx); 1043 } 1044 1045 GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint* params){ 1046 GET_CTX(); 1047 SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(target) && 1048 GLESv2Validate::framebufferAttachment(attachment) && 1049 GLESv2Validate::framebufferAttachmentParams(pname)),GL_INVALID_ENUM); 1050 1051 // 1052 // Take the attachment attribute from our state - if available 1053 // 1054 GLuint fbName = ctx->getFramebufferBinding(); 1055 if (fbName) { 1056 ObjectDataPtr fbObj = ctx->shareGroup()->getObjectData(FRAMEBUFFER,fbName); 1057 if (fbObj.Ptr() != NULL) { 1058 FramebufferData *fbData = (FramebufferData *)fbObj.Ptr(); 1059 GLenum target; 1060 GLuint name = fbData->getAttachment(attachment, &target, NULL); 1061 if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) { 1062 if (target == GL_TEXTURE_2D) { 1063 *params = GL_TEXTURE; 1064 return; 1065 } 1066 else if (target == GL_RENDERBUFFER) { 1067 *params = GL_RENDERBUFFER; 1068 return; 1069 } 1070 } 1071 else if (pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) { 1072 *params = name; 1073 return; 1074 } 1075 } 1076 } 1077 1078 ctx->dispatcher().glGetFramebufferAttachmentParameterivEXT(target,attachment,pname,params); 1079 } 1080 1081 GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv(GLenum target, GLenum pname, GLint* params){ 1082 GET_CTX(); 1083 SET_ERROR_IF(!(GLESv2Validate::renderbufferTarget(target) && GLESv2Validate::renderbufferParams(pname)),GL_INVALID_ENUM); 1084 1085 // 1086 // If this is a renderbuffer which is eglimage's target, we 1087 // should query the underlying eglimage's texture object instead. 1088 // 1089 GLuint rb = ctx->getRenderbufferBinding(); 1090 if (rb) { 1091 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb); 1092 RenderbufferData *rbData = (RenderbufferData *)objData.Ptr(); 1093 if (rbData && rbData->sourceEGLImage != 0) { 1094 GLenum texPname; 1095 switch(pname) { 1096 case GL_RENDERBUFFER_WIDTH: 1097 texPname = GL_TEXTURE_WIDTH; 1098 break; 1099 case GL_RENDERBUFFER_HEIGHT: 1100 texPname = GL_TEXTURE_HEIGHT; 1101 break; 1102 case GL_RENDERBUFFER_INTERNAL_FORMAT: 1103 texPname = GL_TEXTURE_INTERNAL_FORMAT; 1104 break; 1105 case GL_RENDERBUFFER_RED_SIZE: 1106 texPname = GL_TEXTURE_RED_SIZE; 1107 break; 1108 case GL_RENDERBUFFER_GREEN_SIZE: 1109 texPname = GL_TEXTURE_GREEN_SIZE; 1110 break; 1111 case GL_RENDERBUFFER_BLUE_SIZE: 1112 texPname = GL_TEXTURE_BLUE_SIZE; 1113 break; 1114 case GL_RENDERBUFFER_ALPHA_SIZE: 1115 texPname = GL_TEXTURE_ALPHA_SIZE; 1116 break; 1117 case GL_RENDERBUFFER_DEPTH_SIZE: 1118 texPname = GL_TEXTURE_DEPTH_SIZE; 1119 break; 1120 case GL_RENDERBUFFER_STENCIL_SIZE: 1121 default: 1122 *params = 0; //XXX 1123 return; 1124 break; 1125 } 1126 1127 GLint prevTex; 1128 ctx->dispatcher().glGetIntegerv(GL_TEXTURE_BINDING_2D, &prevTex); 1129 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, 1130 rbData->eglImageGlobalTexName); 1131 ctx->dispatcher().glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, 1132 texPname, 1133 params); 1134 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, prevTex); 1135 return; 1136 } 1137 } 1138 1139 ctx->dispatcher().glGetRenderbufferParameterivEXT(target,pname,params); 1140 } 1141 1142 1143 GL_APICALL void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint* params){ 1144 GET_CTX(); 1145 SET_ERROR_IF(!GLESv2Validate::programParam(pname),GL_INVALID_ENUM); 1146 if(ctx->shareGroup().Ptr()) { 1147 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1148 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1149 switch(pname) { 1150 case GL_LINK_STATUS: 1151 { 1152 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1153 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1154 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1155 ProgramData* programData = (ProgramData*)objData.Ptr(); 1156 params[0] = programData->getLinkStatus(); 1157 } 1158 break; 1159 //validate status should not return GL_TRUE if link failed 1160 case GL_VALIDATE_STATUS: 1161 { 1162 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1163 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1164 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1165 ProgramData* programData = (ProgramData*)objData.Ptr(); 1166 if (programData->getLinkStatus()==GL_TRUE) 1167 ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params); 1168 else 1169 params[0] = GL_FALSE; 1170 } 1171 break; 1172 case GL_INFO_LOG_LENGTH: 1173 { 1174 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1175 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1176 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1177 ProgramData* programData = (ProgramData*)objData.Ptr(); 1178 GLint logLength = strlen(programData->getInfoLog()); 1179 params[0] = (logLength>0) ? logLength+1 : 0; 1180 } 1181 break; 1182 default: 1183 ctx->dispatcher().glGetProgramiv(globalProgramName,pname,params); 1184 } 1185 } 1186 } 1187 1188 GL_APICALL void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog){ 1189 GET_CTX(); 1190 if(ctx->shareGroup().Ptr()) { 1191 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1192 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1193 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1194 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1195 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1196 ProgramData* programData = (ProgramData*)objData.Ptr(); 1197 1198 if (bufsize==0) { 1199 if (length) { 1200 *length = 0; 1201 } 1202 return; 1203 } 1204 1205 GLsizei logLength; 1206 logLength = strlen(programData->getInfoLog()); 1207 1208 GLsizei returnLength=0; 1209 if (infolog) { 1210 returnLength = bufsize-1 < logLength ? bufsize-1 : logLength; 1211 strncpy(infolog,programData->getInfoLog(),returnLength+1); 1212 infolog[returnLength] = '\0'; 1213 } 1214 if (length) { 1215 *length = returnLength; 1216 } 1217 } 1218 } 1219 1220 GL_APICALL void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint* params){ 1221 GET_CTX(); 1222 if(ctx->shareGroup().Ptr()) { 1223 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1224 SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE); 1225 switch(pname) { 1226 case GL_INFO_LOG_LENGTH: 1227 { 1228 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1229 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1230 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1231 ShaderParser* sp = (ShaderParser*)objData.Ptr(); 1232 GLint logLength = strlen(sp->getInfoLog()); 1233 params[0] = (logLength>0) ? logLength+1 : 0; 1234 } 1235 break; 1236 default: 1237 ctx->dispatcher().glGetShaderiv(globalShaderName,pname,params); 1238 } 1239 } 1240 } 1241 1242 1243 GL_APICALL void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog){ 1244 GET_CTX(); 1245 if(ctx->shareGroup().Ptr()) { 1246 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1247 SET_ERROR_IF(globalShaderName==0, GL_INVALID_VALUE); 1248 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1249 SET_ERROR_IF(!objData.Ptr() ,GL_INVALID_OPERATION); 1250 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1251 ShaderParser* sp = (ShaderParser*)objData.Ptr(); 1252 1253 if (bufsize==0) { 1254 if (length) { 1255 *length = 0; 1256 } 1257 return; 1258 } 1259 1260 GLsizei logLength; 1261 logLength = strlen(sp->getInfoLog()); 1262 1263 GLsizei returnLength=0; 1264 if (infolog) { 1265 returnLength = bufsize-1 <logLength ? bufsize-1 : logLength; 1266 strncpy(infolog,sp->getInfoLog(),returnLength+1); 1267 infolog[returnLength] = '\0'; 1268 } 1269 if (length) { 1270 *length = returnLength; 1271 } 1272 } 1273 } 1274 1275 GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision){ 1276 GET_CTX_V2(); 1277 SET_ERROR_IF(!(GLESv2Validate::shaderType(shadertype) && GLESv2Validate::precisionType(precisiontype)),GL_INVALID_ENUM); 1278 1279 switch (precisiontype) { 1280 case GL_LOW_INT: 1281 case GL_MEDIUM_INT: 1282 case GL_HIGH_INT: 1283 range[0] = range[1] = 16; 1284 *precision = 0; 1285 break; 1286 1287 case GL_LOW_FLOAT: 1288 case GL_MEDIUM_FLOAT: 1289 case GL_HIGH_FLOAT: 1290 if(ctx->dispatcher().glGetShaderPrecisionFormat != NULL) { 1291 ctx->dispatcher().glGetShaderPrecisionFormat(shadertype,precisiontype,range,precision); 1292 } else { 1293 range[0] = range[1] = 127; 1294 *precision = 24; 1295 } 1296 break; 1297 } 1298 } 1299 1300 GL_APICALL void GL_APIENTRY glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source){ 1301 GET_CTX(); 1302 if(ctx->shareGroup().Ptr()) { 1303 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1304 SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE); 1305 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1306 SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION); 1307 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1308 const char* src = ((ShaderParser*)objData.Ptr())->getOriginalSrc(); 1309 int srcLength = 0; 1310 if (src) { 1311 srcLength = strlen(src); 1312 } 1313 1314 int returnLength = bufsize<srcLength ? bufsize-1 : srcLength; 1315 if (returnLength) { 1316 strncpy(source,src, returnLength); 1317 source[returnLength] = '\0'; 1318 } 1319 1320 if (length) 1321 *length = returnLength; 1322 } 1323 } 1324 1325 1326 GL_APICALL const GLubyte* GL_APIENTRY glGetString(GLenum name){ 1327 GET_CTX_RET(NULL) 1328 static const GLubyte SHADING[] = "OpenGL ES GLSL ES 1.0.17"; 1329 switch(name) { 1330 case GL_VENDOR: 1331 return (const GLubyte*)ctx->getVendorString(); 1332 case GL_RENDERER: 1333 return (const GLubyte*)ctx->getRendererString(); 1334 case GL_VERSION: 1335 return (const GLubyte*)ctx->getVersionString(); 1336 case GL_SHADING_LANGUAGE_VERSION: 1337 return SHADING; 1338 case GL_EXTENSIONS: 1339 return (const GLubyte*)ctx->getExtensionString(); 1340 default: 1341 RET_AND_SET_ERROR_IF(true,GL_INVALID_ENUM,NULL); 1342 } 1343 } 1344 1345 GL_APICALL void GL_APIENTRY glGetTexParameterfv(GLenum target, GLenum pname, GLfloat* params){ 1346 GET_CTX(); 1347 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1348 ctx->dispatcher().glGetTexParameterfv(target,pname,params); 1349 1350 } 1351 GL_APICALL void GL_APIENTRY glGetTexParameteriv(GLenum target, GLenum pname, GLint* params){ 1352 GET_CTX(); 1353 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1354 ctx->dispatcher().glGetTexParameteriv(target,pname,params); 1355 } 1356 1357 GL_APICALL void GL_APIENTRY glGetUniformfv(GLuint program, GLint location, GLfloat* params){ 1358 GET_CTX(); 1359 SET_ERROR_IF(location < 0,GL_INVALID_OPERATION); 1360 if(ctx->shareGroup().Ptr()) { 1361 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1362 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1363 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1364 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1365 ProgramData* pData = (ProgramData *)objData.Ptr(); 1366 SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION); 1367 ctx->dispatcher().glGetUniformfv(globalProgramName,location,params); 1368 } 1369 } 1370 1371 GL_APICALL void GL_APIENTRY glGetUniformiv(GLuint program, GLint location, GLint* params){ 1372 GET_CTX(); 1373 SET_ERROR_IF(location < 0,GL_INVALID_OPERATION); 1374 if(ctx->shareGroup().Ptr()) { 1375 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1376 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1377 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1378 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1379 ProgramData* pData = (ProgramData *)objData.Ptr(); 1380 SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION); 1381 ctx->dispatcher().glGetUniformiv(globalProgramName,location,params); 1382 } 1383 } 1384 1385 GL_APICALL int GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar* name){ 1386 GET_CTX_RET(-1); 1387 if(ctx->shareGroup().Ptr()) { 1388 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1389 RET_AND_SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE,-1); 1390 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1391 RET_AND_SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION,-1); 1392 ProgramData* pData = (ProgramData *)objData.Ptr(); 1393 RET_AND_SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION,-1); 1394 return ctx->dispatcher().glGetUniformLocation(globalProgramName,name); 1395 } 1396 return -1; 1397 } 1398 1399 1400 1401 GL_APICALL void GL_APIENTRY glGetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params){ 1402 GET_CTX_V2(); 1403 const GLESpointer* p = ctx->getPointer(index); 1404 if(p) { 1405 switch(pname){ 1406 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 1407 *params = 0; 1408 break; 1409 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: 1410 *params = p->isEnable(); 1411 break; 1412 case GL_VERTEX_ATTRIB_ARRAY_SIZE: 1413 *params = p->getSize(); 1414 break; 1415 case GL_VERTEX_ATTRIB_ARRAY_STRIDE: 1416 *params = p->getStride(); 1417 break; 1418 case GL_VERTEX_ATTRIB_ARRAY_TYPE: 1419 *params = p->getType(); 1420 break; 1421 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: 1422 *params = p->isNormalize(); 1423 break; 1424 case GL_CURRENT_VERTEX_ATTRIB: 1425 if(index == 0) 1426 { 1427 const float* att0 = ctx->getAtt0(); 1428 for(int i=0; i<4; i++) 1429 params[i] = att0[i]; 1430 } 1431 else 1432 ctx->dispatcher().glGetVertexAttribfv(index,pname,params); 1433 break; 1434 default: 1435 ctx->setGLerror(GL_INVALID_ENUM); 1436 } 1437 } else { 1438 ctx->setGLerror(GL_INVALID_VALUE); 1439 } 1440 } 1441 1442 GL_APICALL void GL_APIENTRY glGetVertexAttribiv(GLuint index, GLenum pname, GLint* params){ 1443 GET_CTX_V2(); 1444 const GLESpointer* p = ctx->getPointer(index); 1445 if(p) { 1446 switch(pname){ 1447 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: 1448 *params = 0; 1449 break; 1450 case GL_VERTEX_ATTRIB_ARRAY_ENABLED: 1451 *params = p->isEnable(); 1452 break; 1453 case GL_VERTEX_ATTRIB_ARRAY_SIZE: 1454 *params = p->getSize(); 1455 break; 1456 case GL_VERTEX_ATTRIB_ARRAY_STRIDE: 1457 *params = p->getStride(); 1458 break; 1459 case GL_VERTEX_ATTRIB_ARRAY_TYPE: 1460 *params = p->getType(); 1461 break; 1462 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED: 1463 *params = p->isNormalize(); 1464 break; 1465 case GL_CURRENT_VERTEX_ATTRIB: 1466 if(index == 0) 1467 { 1468 const float* att0 = ctx->getAtt0(); 1469 for(int i=0; i<4; i++) 1470 params[i] = (GLint)att0[i]; 1471 } 1472 else 1473 ctx->dispatcher().glGetVertexAttribiv(index,pname,params); 1474 break; 1475 default: 1476 ctx->setGLerror(GL_INVALID_ENUM); 1477 } 1478 } else { 1479 ctx->setGLerror(GL_INVALID_VALUE); 1480 } 1481 } 1482 1483 GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** pointer){ 1484 GET_CTX(); 1485 SET_ERROR_IF(pname != GL_VERTEX_ATTRIB_ARRAY_POINTER,GL_INVALID_ENUM); 1486 SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE); 1487 1488 const GLESpointer* p = ctx->getPointer(index); 1489 if(p) { 1490 *pointer = const_cast<void *>( p->getBufferData()); 1491 } else { 1492 ctx->setGLerror(GL_INVALID_VALUE); 1493 } 1494 } 1495 1496 GL_APICALL void GL_APIENTRY glHint(GLenum target, GLenum mode){ 1497 GET_CTX(); 1498 SET_ERROR_IF(!GLESv2Validate::hintTargetMode(target,mode),GL_INVALID_ENUM); 1499 ctx->dispatcher().glHint(target,mode); 1500 } 1501 1502 GL_APICALL GLboolean GL_APIENTRY glIsEnabled(GLenum cap){ 1503 GET_CTX_RET(GL_FALSE); 1504 RET_AND_SET_ERROR_IF(!GLESv2Validate::capability(cap),GL_INVALID_ENUM,GL_FALSE); 1505 return ctx->dispatcher().glIsEnabled(cap); 1506 } 1507 1508 GL_APICALL GLboolean GL_APIENTRY glIsBuffer(GLuint buffer){ 1509 GET_CTX_RET(GL_FALSE) 1510 if(buffer && ctx->shareGroup().Ptr()) { 1511 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(VERTEXBUFFER,buffer); 1512 return objData.Ptr() ? ((GLESbuffer*)objData.Ptr())->wasBinded():GL_FALSE; 1513 } 1514 return GL_FALSE; 1515 } 1516 1517 GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer(GLuint framebuffer){ 1518 GET_CTX_RET(GL_FALSE) 1519 if(framebuffer && ctx->shareGroup().Ptr()){ 1520 return ctx->shareGroup()->isObject(FRAMEBUFFER,framebuffer) ? GL_TRUE :GL_FALSE; 1521 } 1522 return GL_FALSE; 1523 } 1524 1525 GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer){ 1526 GET_CTX_RET(GL_FALSE) 1527 if(renderbuffer && ctx->shareGroup().Ptr()){ 1528 return ctx->shareGroup()->isObject(RENDERBUFFER,renderbuffer) ? GL_TRUE :GL_FALSE; 1529 } 1530 return GL_FALSE; 1531 } 1532 1533 GL_APICALL GLboolean GL_APIENTRY glIsTexture(GLuint texture){ 1534 GET_CTX_RET(GL_FALSE) 1535 if (texture==0) 1536 return GL_FALSE; 1537 TextureData* tex = getTextureData(texture); 1538 return tex ? tex->wasBound : GL_FALSE; 1539 } 1540 1541 GL_APICALL GLboolean GL_APIENTRY glIsProgram(GLuint program){ 1542 GET_CTX_RET(GL_FALSE) 1543 if(program && ctx->shareGroup().Ptr() && 1544 ctx->shareGroup()->isObject(SHADER,program)) { 1545 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1546 return ctx->dispatcher().glIsProgram(globalProgramName); 1547 } 1548 return GL_FALSE; 1549 } 1550 1551 GL_APICALL GLboolean GL_APIENTRY glIsShader(GLuint shader){ 1552 GET_CTX_RET(GL_FALSE) 1553 if(shader && ctx->shareGroup().Ptr() && 1554 ctx->shareGroup()->isObject(SHADER,shader)) { 1555 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1556 return ctx->dispatcher().glIsShader(globalShaderName); 1557 } 1558 return GL_FALSE; 1559 } 1560 1561 GL_APICALL void GL_APIENTRY glLineWidth(GLfloat width){ 1562 GET_CTX(); 1563 ctx->dispatcher().glLineWidth(width); 1564 } 1565 1566 GL_APICALL void GL_APIENTRY glLinkProgram(GLuint program){ 1567 GET_CTX(); 1568 GLint linkStatus = GL_FALSE; 1569 if(ctx->shareGroup().Ptr()) { 1570 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1571 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1572 1573 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1574 SET_ERROR_IF(!objData.Ptr(), GL_INVALID_OPERATION); 1575 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA, GL_INVALID_OPERATION); 1576 ProgramData* programData = (ProgramData*)objData.Ptr(); 1577 GLint fragmentShader = programData->getAttachedFragmentShader(); 1578 GLint vertexShader = programData->getAttachedVertexShader(); 1579 if (vertexShader != 0 && fragmentShader!=0) { 1580 /* validating that the fragment & vertex shaders were compiled successfuly*/ 1581 GLint fCompileStatus = GL_FALSE; 1582 GLint vCompileStatus = GL_FALSE; 1583 GLuint fragmentShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,fragmentShader); 1584 GLuint vertexShaderGlobal = ctx->shareGroup()->getGlobalName(SHADER,vertexShader); 1585 ctx->dispatcher().glGetShaderiv(fragmentShaderGlobal,GL_COMPILE_STATUS,&fCompileStatus); 1586 ctx->dispatcher().glGetShaderiv(vertexShaderGlobal,GL_COMPILE_STATUS,&vCompileStatus); 1587 1588 if(fCompileStatus != 0 && vCompileStatus != 0){ 1589 ctx->dispatcher().glLinkProgram(globalProgramName); 1590 ctx->dispatcher().glGetProgramiv(globalProgramName,GL_LINK_STATUS,&linkStatus); 1591 } 1592 } 1593 programData->setLinkStatus(linkStatus); 1594 1595 GLsizei infoLogLength=0; 1596 GLchar* infoLog; 1597 ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength); 1598 infoLog = new GLchar[infoLogLength+1]; 1599 ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog); 1600 programData->setInfoLog(infoLog); 1601 } 1602 } 1603 1604 GL_APICALL void GL_APIENTRY glPixelStorei(GLenum pname, GLint param){ 1605 GET_CTX(); 1606 SET_ERROR_IF(!GLESv2Validate::pixelStoreParam(pname),GL_INVALID_ENUM); 1607 SET_ERROR_IF(!((param==1)||(param==2)||(param==4)||(param==8)), GL_INVALID_VALUE); 1608 ctx->setUnpackAlignment(param); 1609 ctx->dispatcher().glPixelStorei(pname,param); 1610 } 1611 1612 GL_APICALL void GL_APIENTRY glPolygonOffset(GLfloat factor, GLfloat units){ 1613 GET_CTX(); 1614 ctx->dispatcher().glPolygonOffset(factor,units); 1615 } 1616 1617 GL_APICALL void GL_APIENTRY glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels){ 1618 GET_CTX(); 1619 SET_ERROR_IF(!(GLESv2Validate::readPixelFrmt(format) && GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM); 1620 SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type)),GL_INVALID_OPERATION); 1621 ctx->dispatcher().glReadPixels(x,y,width,height,format,type,pixels); 1622 } 1623 1624 1625 GL_APICALL void GL_APIENTRY glReleaseShaderCompiler(void){ 1626 GET_CTX(); 1627 1628 if(ctx->dispatcher().glReleaseShaderCompiler != NULL) 1629 { 1630 ctx->dispatcher().glReleaseShaderCompiler(); 1631 } 1632 } 1633 1634 GL_APICALL void GL_APIENTRY glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height){ 1635 GET_CTX(); 1636 GLenum internal = internalformat; 1637 switch (internalformat) { 1638 case GL_RGB565: 1639 internal = GL_RGB; 1640 break; 1641 case GL_RGB5_A1: 1642 internal = GL_RGBA; 1643 break; 1644 default: 1645 internal = internalformat; 1646 break; 1647 } 1648 1649 // Get current bounded renderbuffer 1650 // raise INVALID_OPERATIOn if no renderbuffer is bounded 1651 GLuint rb = ctx->getRenderbufferBinding(); 1652 SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION); 1653 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb); 1654 RenderbufferData *rbData = (RenderbufferData *)objData.Ptr(); 1655 SET_ERROR_IF(!rbData,GL_INVALID_OPERATION); 1656 1657 // 1658 // if the renderbuffer was an eglImage target, detach from 1659 // the eglImage. 1660 // 1661 if (rbData->sourceEGLImage != 0) { 1662 if (rbData->eglImageDetach) { 1663 (*rbData->eglImageDetach)(rbData->sourceEGLImage); 1664 } 1665 rbData->sourceEGLImage = 0; 1666 rbData->eglImageGlobalTexName = 0; 1667 } 1668 1669 ctx->dispatcher().glRenderbufferStorageEXT(target,internal,width,height); 1670 } 1671 1672 GL_APICALL void GL_APIENTRY glSampleCoverage(GLclampf value, GLboolean invert){ 1673 GET_CTX(); 1674 ctx->dispatcher().glSampleCoverage(value,invert); 1675 } 1676 1677 GL_APICALL void GL_APIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height){ 1678 GET_CTX(); 1679 ctx->dispatcher().glScissor(x,y,width,height); 1680 } 1681 1682 GL_APICALL void GL_APIENTRY glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length){ 1683 GET_CTX(); 1684 1685 SET_ERROR_IF( (ctx->dispatcher().glShaderBinary == NULL), GL_INVALID_OPERATION); 1686 1687 if(ctx->shareGroup().Ptr()){ 1688 for(int i=0; i < n ; i++){ 1689 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shaders[i]); 1690 SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE); 1691 ctx->dispatcher().glShaderBinary(1,&globalShaderName,binaryformat,binary,length); 1692 } 1693 } 1694 } 1695 1696 GL_APICALL void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar** string, const GLint* length){ 1697 GET_CTX_V2(); 1698 SET_ERROR_IF(count < 0,GL_INVALID_VALUE); 1699 if(ctx->shareGroup().Ptr()){ 1700 const GLuint globalShaderName = ctx->shareGroup()->getGlobalName(SHADER,shader); 1701 SET_ERROR_IF(globalShaderName == 0,GL_INVALID_VALUE); 1702 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,shader); 1703 SET_ERROR_IF(!objData.Ptr(),GL_INVALID_OPERATION); 1704 SET_ERROR_IF(objData.Ptr()->getDataType()!=SHADER_DATA,GL_INVALID_OPERATION); 1705 ShaderParser* sp = (ShaderParser*)objData.Ptr(); 1706 sp->setSrc(ctx->glslVersion(),count,string,length); 1707 ctx->dispatcher().glShaderSource(globalShaderName,1,sp->parsedLines(),NULL); 1708 } 1709 } 1710 1711 GL_APICALL void GL_APIENTRY glStencilFunc(GLenum func, GLint ref, GLuint mask){ 1712 GET_CTX(); 1713 ctx->dispatcher().glStencilFunc(func,ref,mask); 1714 } 1715 GL_APICALL void GL_APIENTRY glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask){ 1716 GET_CTX(); 1717 ctx->dispatcher().glStencilFuncSeparate(face,func,ref,mask); 1718 } 1719 GL_APICALL void GL_APIENTRY glStencilMask(GLuint mask){ 1720 GET_CTX(); 1721 ctx->dispatcher().glStencilMask(mask); 1722 } 1723 1724 GL_APICALL void GL_APIENTRY glStencilMaskSeparate(GLenum face, GLuint mask){ 1725 GET_CTX(); 1726 ctx->dispatcher().glStencilMaskSeparate(face,mask); 1727 } 1728 1729 GL_APICALL void GL_APIENTRY glStencilOp(GLenum fail, GLenum zfail, GLenum zpass){ 1730 GET_CTX(); 1731 ctx->dispatcher().glStencilOp(fail,zfail,zpass); 1732 } 1733 1734 GL_APICALL void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass){ 1735 GET_CTX(); 1736 ctx->dispatcher().glStencilOp(fail,zfail,zpass); 1737 } 1738 1739 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){ 1740 GET_CTX(); 1741 SET_ERROR_IF(!(GLESv2Validate::textureTargetEx(target) && 1742 GLESv2Validate::pixelFrmt(ctx,internalformat) && 1743 GLESv2Validate::pixelFrmt(ctx,format)&& 1744 GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM); 1745 1746 SET_ERROR_IF((format == GL_DEPTH_COMPONENT || internalformat == GL_DEPTH_COMPONENT) && 1747 (type != GL_UNSIGNED_SHORT && type != GL_UNSIGNED_INT), GL_INVALID_OPERATION); 1748 1749 SET_ERROR_IF((type == GL_UNSIGNED_SHORT || type == GL_UNSIGNED_INT) && 1750 (format != GL_DEPTH_COMPONENT || internalformat != GL_DEPTH_COMPONENT), GL_INVALID_OPERATION); 1751 1752 SET_ERROR_IF(!(GLESv2Validate::pixelOp(format,type) && internalformat == ((GLint)format)),GL_INVALID_OPERATION); 1753 SET_ERROR_IF(border != 0,GL_INVALID_VALUE); 1754 1755 if (ctx->shareGroup().Ptr()){ 1756 TextureData *texData = getTextureTargetData(target); 1757 if(texData) { 1758 texData->width = width; 1759 texData->height = height; 1760 texData->border = border; 1761 texData->internalFormat = internalformat; 1762 texData->target = target; 1763 1764 if (texData->sourceEGLImage != 0) { 1765 // 1766 // This texture was a target of EGLImage, 1767 // but now it is re-defined so we need to detach 1768 // from the EGLImage and re-generate global texture name 1769 // for it. 1770 // 1771 if (texData->eglImageDetach) { 1772 (*texData->eglImageDetach)(texData->sourceEGLImage); 1773 } 1774 unsigned int tex = ctx->getBindedTexture(target); 1775 ctx->shareGroup()->replaceGlobalName(TEXTURE, 1776 tex, 1777 texData->oldGlobal); 1778 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, texData->oldGlobal); 1779 texData->sourceEGLImage = 0; 1780 texData->oldGlobal = 0; 1781 } 1782 } 1783 } 1784 1785 if (type==GL_HALF_FLOAT_OES) 1786 type = GL_HALF_FLOAT_NV; 1787 if (pixels==NULL && type==GL_UNSIGNED_SHORT_5_5_5_1) 1788 type = GL_UNSIGNED_SHORT; 1789 ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels); 1790 } 1791 1792 1793 GL_APICALL void GL_APIENTRY glTexParameterf(GLenum target, GLenum pname, GLfloat param){ 1794 GET_CTX(); 1795 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1796 ctx->dispatcher().glTexParameterf(target,pname,param); 1797 } 1798 GL_APICALL void GL_APIENTRY glTexParameterfv(GLenum target, GLenum pname, const GLfloat* params){ 1799 GET_CTX(); 1800 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1801 ctx->dispatcher().glTexParameterfv(target,pname,params); 1802 } 1803 GL_APICALL void GL_APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param){ 1804 GET_CTX(); 1805 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1806 ctx->dispatcher().glTexParameteri(target,pname,param); 1807 } 1808 GL_APICALL void GL_APIENTRY glTexParameteriv(GLenum target, GLenum pname, const GLint* params){ 1809 GET_CTX(); 1810 SET_ERROR_IF(!(GLESv2Validate::textureTarget(target) && GLESv2Validate::textureParams(pname)),GL_INVALID_ENUM); 1811 ctx->dispatcher().glTexParameteriv(target,pname,params); 1812 } 1813 1814 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){ 1815 GET_CTX(); 1816 SET_ERROR_IF(!(GLESv2Validate::textureTargetEx(target) && 1817 GLESv2Validate::pixelFrmt(ctx,format)&& 1818 GLESv2Validate::pixelType(ctx,type)),GL_INVALID_ENUM); 1819 SET_ERROR_IF(!GLESv2Validate::pixelOp(format,type),GL_INVALID_OPERATION); 1820 if (type==GL_HALF_FLOAT_OES) 1821 type = GL_HALF_FLOAT_NV; 1822 1823 ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels); 1824 1825 } 1826 1827 GL_APICALL void GL_APIENTRY glUniform1f(GLint location, GLfloat x){ 1828 GET_CTX(); 1829 ctx->dispatcher().glUniform1f(location,x); 1830 } 1831 GL_APICALL void GL_APIENTRY glUniform1fv(GLint location, GLsizei count, const GLfloat* v){ 1832 GET_CTX(); 1833 ctx->dispatcher().glUniform1fv(location,count,v); 1834 } 1835 1836 GL_APICALL void GL_APIENTRY glUniform1i(GLint location, GLint x){ 1837 GET_CTX(); 1838 ctx->dispatcher().glUniform1i(location,x); 1839 } 1840 GL_APICALL void GL_APIENTRY glUniform1iv(GLint location, GLsizei count, const GLint* v){ 1841 GET_CTX(); 1842 ctx->dispatcher().glUniform1iv(location,count,v); 1843 } 1844 GL_APICALL void GL_APIENTRY glUniform2f(GLint location, GLfloat x, GLfloat y){ 1845 GET_CTX(); 1846 ctx->dispatcher().glUniform2f(location,x,y); 1847 } 1848 GL_APICALL void GL_APIENTRY glUniform2fv(GLint location, GLsizei count, const GLfloat* v){ 1849 GET_CTX(); 1850 ctx->dispatcher().glUniform2fv(location,count,v); 1851 } 1852 GL_APICALL void GL_APIENTRY glUniform2i(GLint location, GLint x, GLint y){ 1853 GET_CTX(); 1854 ctx->dispatcher().glUniform2i(location,x,y); 1855 } 1856 GL_APICALL void GL_APIENTRY glUniform2iv(GLint location, GLsizei count, const GLint* v){ 1857 GET_CTX(); 1858 ctx->dispatcher().glUniform2iv(location,count,v); 1859 } 1860 GL_APICALL void GL_APIENTRY glUniform3f(GLint location, GLfloat x, GLfloat y, GLfloat z){ 1861 GET_CTX(); 1862 ctx->dispatcher().glUniform3f(location,x,y,z); 1863 } 1864 GL_APICALL void GL_APIENTRY glUniform3fv(GLint location, GLsizei count, const GLfloat* v){ 1865 GET_CTX(); 1866 ctx->dispatcher().glUniform3fv(location,count,v); 1867 } 1868 GL_APICALL void GL_APIENTRY glUniform3i(GLint location, GLint x, GLint y, GLint z){ 1869 GET_CTX(); 1870 ctx->dispatcher().glUniform3i(location,x,y,z); 1871 } 1872 1873 GL_APICALL void GL_APIENTRY glUniform3iv(GLint location, GLsizei count, const GLint* v){ 1874 GET_CTX(); 1875 ctx->dispatcher().glUniform3iv(location,count,v); 1876 } 1877 1878 GL_APICALL void GL_APIENTRY glUniform4f(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w){ 1879 GET_CTX(); 1880 ctx->dispatcher().glUniform4f(location,x,y,z,w); 1881 } 1882 1883 GL_APICALL void GL_APIENTRY glUniform4fv(GLint location, GLsizei count, const GLfloat* v){ 1884 GET_CTX(); 1885 ctx->dispatcher().glUniform4fv(location,count,v); 1886 } 1887 1888 GL_APICALL void GL_APIENTRY glUniform4i(GLint location, GLint x, GLint y, GLint z, GLint w){ 1889 GET_CTX(); 1890 ctx->dispatcher().glUniform4i(location,x,y,z,w); 1891 } 1892 1893 GL_APICALL void GL_APIENTRY glUniform4iv(GLint location, GLsizei count, const GLint* v){ 1894 GET_CTX(); 1895 ctx->dispatcher().glUniform4iv(location,count,v); 1896 } 1897 1898 GL_APICALL void GL_APIENTRY glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){ 1899 GET_CTX(); 1900 SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE); 1901 ctx->dispatcher().glUniformMatrix2fv(location,count,transpose,value); 1902 } 1903 1904 GL_APICALL void GL_APIENTRY glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){ 1905 GET_CTX(); 1906 SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE); 1907 ctx->dispatcher().glUniformMatrix3fv(location,count,transpose,value); 1908 } 1909 1910 GL_APICALL void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value){ 1911 GET_CTX(); 1912 SET_ERROR_IF(transpose != GL_FALSE,GL_INVALID_VALUE); 1913 ctx->dispatcher().glUniformMatrix4fv(location,count,transpose,value); 1914 } 1915 1916 GL_APICALL void GL_APIENTRY glUseProgram(GLuint program){ 1917 GET_CTX(); 1918 if(ctx->shareGroup().Ptr()) { 1919 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1920 SET_ERROR_IF(program!=0 && globalProgramName==0,GL_INVALID_VALUE); 1921 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1922 SET_ERROR_IF(objData.Ptr() && (objData.Ptr()->getDataType()!=PROGRAM_DATA),GL_INVALID_OPERATION); 1923 ctx->dispatcher().glUseProgram(globalProgramName); 1924 } 1925 } 1926 1927 GL_APICALL void GL_APIENTRY glValidateProgram(GLuint program){ 1928 GET_CTX(); 1929 if(ctx->shareGroup().Ptr()) { 1930 const GLuint globalProgramName = ctx->shareGroup()->getGlobalName(SHADER,program); 1931 SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); 1932 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(SHADER,program); 1933 SET_ERROR_IF(objData.Ptr()->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); 1934 ProgramData* programData = (ProgramData*)objData.Ptr(); 1935 ctx->dispatcher().glValidateProgram(globalProgramName); 1936 1937 GLsizei infoLogLength=0; 1938 GLchar* infoLog; 1939 ctx->dispatcher().glGetProgramiv(globalProgramName,GL_INFO_LOG_LENGTH,&infoLogLength); 1940 infoLog = new GLchar[infoLogLength+1]; 1941 ctx->dispatcher().glGetProgramInfoLog(globalProgramName,infoLogLength,NULL,infoLog); 1942 programData->setInfoLog(infoLog); 1943 } 1944 } 1945 1946 GL_APICALL void GL_APIENTRY glVertexAttrib1f(GLuint indx, GLfloat x){ 1947 GET_CTX_V2(); 1948 ctx->dispatcher().glVertexAttrib1f(indx,x); 1949 if(indx == 0) 1950 ctx->setAttribute0value(x, 0.0, 0.0, 1.0); 1951 } 1952 1953 GL_APICALL void GL_APIENTRY glVertexAttrib1fv(GLuint indx, const GLfloat* values){ 1954 GET_CTX_V2(); 1955 ctx->dispatcher().glVertexAttrib1fv(indx,values); 1956 if(indx == 0) 1957 ctx->setAttribute0value(values[0], 0.0, 0.0, 1.0); 1958 } 1959 1960 GL_APICALL void GL_APIENTRY glVertexAttrib2f(GLuint indx, GLfloat x, GLfloat y){ 1961 GET_CTX_V2(); 1962 ctx->dispatcher().glVertexAttrib2f(indx,x,y); 1963 if(indx == 0) 1964 ctx->setAttribute0value(x, y, 0.0, 1.0); 1965 } 1966 1967 GL_APICALL void GL_APIENTRY glVertexAttrib2fv(GLuint indx, const GLfloat* values){ 1968 GET_CTX_V2(); 1969 ctx->dispatcher().glVertexAttrib2fv(indx,values); 1970 if(indx == 0) 1971 ctx->setAttribute0value(values[0], values[1], 0.0, 1.0); 1972 } 1973 1974 GL_APICALL void GL_APIENTRY glVertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z){ 1975 GET_CTX_V2(); 1976 ctx->dispatcher().glVertexAttrib3f(indx,x,y,z); 1977 if(indx == 0) 1978 ctx->setAttribute0value(x, y, z, 1.0); 1979 } 1980 1981 GL_APICALL void GL_APIENTRY glVertexAttrib3fv(GLuint indx, const GLfloat* values){ 1982 GET_CTX_V2(); 1983 ctx->dispatcher().glVertexAttrib3fv(indx,values); 1984 if(indx == 0) 1985 ctx->setAttribute0value(values[0], values[1], values[2], 1.0); 1986 } 1987 1988 GL_APICALL void GL_APIENTRY glVertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w){ 1989 GET_CTX_V2(); 1990 ctx->dispatcher().glVertexAttrib4f(indx,x,y,z,w); 1991 if(indx == 0) 1992 ctx->setAttribute0value(x, y, z, w); 1993 } 1994 1995 GL_APICALL void GL_APIENTRY glVertexAttrib4fv(GLuint indx, const GLfloat* values){ 1996 GET_CTX_V2(); 1997 ctx->dispatcher().glVertexAttrib4fv(indx,values); 1998 if(indx == 0) 1999 ctx->setAttribute0value(values[0], values[1], values[2], values[3]); 2000 } 2001 2002 GL_APICALL void GL_APIENTRY glVertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr){ 2003 GET_CTX(); 2004 SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,indx)),GL_INVALID_VALUE); 2005 if (type == GL_HALF_FLOAT_OES) type = GL_HALF_FLOAT; 2006 ctx->setPointer(indx,size,type,stride,ptr,normalized); 2007 } 2008 2009 GL_APICALL void GL_APIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height){ 2010 GET_CTX(); 2011 ctx->dispatcher().glViewport(x,y,width,height); 2012 } 2013 2014 GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOES image) 2015 { 2016 GET_CTX(); 2017 SET_ERROR_IF(!GLESv2Validate::textureTargetLimited(target),GL_INVALID_ENUM); 2018 unsigned int imagehndl = SafeUIntFromPointer(image); 2019 EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl); 2020 if (img) { 2021 // Create the texture object in the underlying EGL implementation, 2022 // flag to the OpenGL layer to skip the image creation and map the 2023 // current binded texture object to the existing global object. 2024 if (ctx->shareGroup().Ptr()) { 2025 ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target)); 2026 unsigned int oldGlobal = ctx->shareGroup()->getGlobalName(TEXTURE, tex); 2027 // Delete old texture object but only if it is not a target of a EGLImage 2028 if (oldGlobal) { 2029 TextureData* oldTexData = getTextureData(tex); 2030 if (!oldTexData || oldTexData->sourceEGLImage == 0) { 2031 ctx->dispatcher().glDeleteTextures(1, &oldGlobal); 2032 } 2033 } 2034 // replace mapping and bind the new global object 2035 ctx->shareGroup()->replaceGlobalName(TEXTURE, tex,img->globalTexName); 2036 ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName); 2037 TextureData *texData = getTextureTargetData(target); 2038 SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION); 2039 texData->width = img->width; 2040 texData->height = img->height; 2041 texData->border = img->border; 2042 texData->internalFormat = img->internalFormat; 2043 texData->sourceEGLImage = imagehndl; 2044 texData->eglImageDetach = s_eglIface->eglDetachEGLImage; 2045 texData->oldGlobal = oldGlobal; 2046 } 2047 } 2048 } 2049 2050 GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES(GLenum target, GLeglImageOES image) 2051 { 2052 GET_CTX(); 2053 SET_ERROR_IF(target != GL_RENDERBUFFER_OES,GL_INVALID_ENUM); 2054 unsigned int imagehndl = SafeUIntFromPointer(image); 2055 EglImage *img = s_eglIface->eglAttachEGLImage(imagehndl); 2056 SET_ERROR_IF(!img,GL_INVALID_VALUE); 2057 SET_ERROR_IF(!ctx->shareGroup().Ptr(),GL_INVALID_OPERATION); 2058 2059 // Get current bounded renderbuffer 2060 // raise INVALID_OPERATIOn if no renderbuffer is bounded 2061 GLuint rb = ctx->getRenderbufferBinding(); 2062 SET_ERROR_IF(rb == 0,GL_INVALID_OPERATION); 2063 ObjectDataPtr objData = ctx->shareGroup()->getObjectData(RENDERBUFFER,rb); 2064 RenderbufferData *rbData = (RenderbufferData *)objData.Ptr(); 2065 SET_ERROR_IF(!rbData,GL_INVALID_OPERATION); 2066 2067 // 2068 // flag in the renderbufferData that it is an eglImage target 2069 // 2070 rbData->sourceEGLImage = imagehndl; 2071 rbData->eglImageDetach = s_eglIface->eglDetachEGLImage; 2072 rbData->eglImageGlobalTexName = img->globalTexName; 2073 2074 // 2075 // if the renderbuffer is attached to a framebuffer 2076 // change the framebuffer attachment in the undelying OpenGL 2077 // to point to the eglImage texture object. 2078 // 2079 if (rbData->attachedFB) { 2080 // update the framebuffer attachment point to the 2081 // underlying texture of the img 2082 GLuint prevFB = ctx->getFramebufferBinding(); 2083 if (prevFB != rbData->attachedFB) { 2084 ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 2085 rbData->attachedFB); 2086 } 2087 ctx->dispatcher().glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, 2088 rbData->attachedPoint, 2089 GL_TEXTURE_2D, 2090 img->globalTexName,0); 2091 if (prevFB != rbData->attachedFB) { 2092 ctx->dispatcher().glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 2093 prevFB); 2094 } 2095 } 2096 } 2097