custom_preprocesses = { "glBindVertexArray" : """ ctx->setVertexArrayObject(array); """, "glDeleteVertexArrays" : """ ctx->removeVertexArrayObjects(n, arrays); """, "glBindBufferRange" : """ ctx->bindBuffer(target, buffer); ctx->bindIndexedBuffer(target, index, buffer, offset, size); """, "glBindBufferBase" : """ ctx->bindBuffer(target, buffer); ctx->bindIndexedBuffer(target, index, buffer); """, "glVertexAttribIPointer" : """ SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE); s_glPrepareVertexAttribPointer(ctx, index, size, type, false, stride, pointer, true); if (ctx->isBindedBuffer(GL_ARRAY_BUFFER)) { """, "glVertexAttribDivisor" : """ SET_ERROR_IF((!GLESv2Validate::arrayIndex(ctx,index)),GL_INVALID_VALUE); ctx->setVertexAttribBindingIndex(index, index); ctx->setVertexAttribDivisor(index, divisor); """, "glRenderbufferStorageMultisample" : """ GLint err = GL_NO_ERROR; internalformat = sPrepareRenderbufferStorage(internalformat, &err); SET_ERROR_IF(err != GL_NO_ERROR, err); """, "glFramebufferTextureLayer" : """ GLenum textarget = GL_TEXTURE_2D_ARRAY; SET_ERROR_IF(!(GLESv2Validate::framebufferTarget(ctx, target) && GLESv2Validate::framebufferAttachment(ctx, attachment)), GL_INVALID_ENUM); if (texture) { if (!ctx->shareGroup()->isObject(NamedObjectType::TEXTURE, texture)) { ctx->shareGroup()->genName(NamedObjectType::TEXTURE, texture); } TextureData* texData = getTextureData(texture); textarget = texData->target; } """, "glTexStorage2D" : """ GLint err = GL_NO_ERROR; GLenum format, type; GLESv2Validate::getCompatibleFormatTypeForInternalFormat(internalformat, &format, &type); for (GLsizei i = 0; i < levels; i++) sPrepareTexImage2D(target, i, (GLint)internalformat, width, height, 0, format, type, NULL, &type, (GLint*)&internalformat, &err); SET_ERROR_IF(err != GL_NO_ERROR, err); """, "glGenSamplers" : """ if(ctx->shareGroup().get()) { for(int i=0; ishareGroup()->genName(NamedObjectType::SAMPLER, 0, true); } } """, "glDeleteSamplers" : """ if(ctx->shareGroup().get()) { for(int i=0; ishareGroup()->deleteName(NamedObjectType::SAMPLER, samplers[i]); } } """, "glGenQueries" : """ if(ctx->shareGroup().get()) { for(int i=0; ishareGroup()->genName(NamedObjectType::QUERY, 0, true); } } """, "glDeleteQueries" : """ if(ctx->shareGroup().get()) { for(int i=0; ishareGroup()->deleteName(NamedObjectType::QUERY, queries[i]); } } """, "glTexImage3D" : """ SET_ERROR_IF(!GLESv2Validate::isCompressedFormat(internalFormat) && !GLESv2Validate::pixelSizedFrmt(ctx, internalFormat, format, type), GL_INVALID_OPERATION); s_glInitTexImage3D(target, level, internalFormat, width, height, depth, border); """, "glTexStorage3D" : """ for (int i = 0; i < levels; i++) { s_glInitTexImage3D(target, i, internalformat, width, height, depth, 0); } """, "glDrawArraysInstanced" : """ SET_ERROR_IF(count < 0,GL_INVALID_VALUE) SET_ERROR_IF(!(GLESv2Validate::drawMode(mode)),GL_INVALID_ENUM); s_glDrawPre(ctx, mode); if (ctx->isBindedBuffer(GL_ARRAY_BUFFER)) { ctx->dispatcher().glDrawArraysInstanced(mode, first, count, primcount); } else { GLESConversionArrays tmpArrs; s_glDrawSetupArraysPre(ctx, tmpArrs, first, count, 0, NULL, true); ctx->dispatcher().glDrawArrays(mode,first,count); s_glDrawSetupArraysPost(ctx); } s_glDrawPost(ctx, mode); """, "glDrawElementsInstanced" : """ SET_ERROR_IF(count < 0,GL_INVALID_VALUE) SET_ERROR_IF(!(GLESv2Validate::drawMode(mode) && GLESv2Validate::drawType(type)),GL_INVALID_ENUM); s_glDrawPre(ctx, mode); if (ctx->isBindedBuffer(GL_ELEMENT_ARRAY_BUFFER)) { ctx->dispatcher().glDrawElementsInstanced(mode,count,type,indices, primcount); } else { s_glDrawEmulateClientArraysPre(ctx); GLESConversionArrays tmpArrs; s_glDrawSetupArraysPre(ctx,tmpArrs,0,count,type,indices,false); ctx->dispatcher().glDrawElementsInstanced(mode,count,type,indices, primcount); s_glDrawSetupArraysPost(ctx); s_glDrawEmulateClientArraysPost(ctx); } s_glDrawPost(ctx, mode); """, "glDrawRangeElements" : """ SET_ERROR_IF(count < 0,GL_INVALID_VALUE) SET_ERROR_IF(!(GLESv2Validate::drawMode(mode) && GLESv2Validate::drawType(type)),GL_INVALID_ENUM); s_glDrawPre(ctx, mode); if (ctx->isBindedBuffer(GL_ELEMENT_ARRAY_BUFFER)) { ctx->dispatcher().glDrawRangeElements(mode,start,end,count,type,indices); } else { s_glDrawEmulateClientArraysPre(ctx); GLESConversionArrays tmpArrs; s_glDrawSetupArraysPre(ctx,tmpArrs,0,count,type,indices,false); ctx->dispatcher().glDrawRangeElements(mode,start,end,count,type,indices); s_glDrawSetupArraysPost(ctx); s_glDrawEmulateClientArraysPost(ctx); } s_glDrawPost(ctx, mode); """, "glGetUniformuiv" : """ SET_ERROR_IF(location < 0,GL_INVALID_OPERATION); """, } custom_postprocesses = { "glGenVertexArrays" : """ ctx->addVertexArrayObjects(n, arrays); """, "glVertexAttribIPointer" : """ } """, "glFramebufferTextureLayer" : """ GLuint fbName = ctx->getFramebufferBinding(target); auto fbObj = ctx->shareGroup()->getObjectData( NamedObjectType::FRAMEBUFFER, fbName); if (fbObj) { FramebufferData *fbData = (FramebufferData *)fbObj; fbData->setAttachment(attachment, textarget, texture, ObjectDataPtr()); } """, "glGetInteger64v" : """ s_glStateQueryTv(true, pname, data, s_glGetInteger64v_wrapper); """, "glGetIntegeri_v" : """ s_glStateQueryTi_v(target, index, data, s_glGetIntegeri_v_wrapper); """, "glGetInteger64i_v" : """ s_glStateQueryTi_v(target, index, data, s_glGetInteger64i_v_wrapper); """, } custom_share_processing = { "glBindSampler" : """ SET_ERROR_IF(sampler && !globalSampler, GL_INVALID_OPERATION); """, "glGetUniformuiv" : """ SET_ERROR_IF(globalProgramName==0, GL_INVALID_VALUE); auto objData = ctx->shareGroup()->getObjectData( NamedObjectType::SHADER_OR_PROGRAM, program); SET_ERROR_IF(objData->getDataType()!=PROGRAM_DATA,GL_INVALID_OPERATION); ProgramData* pData = (ProgramData *)objData; SET_ERROR_IF(pData->getLinkStatus() != GL_TRUE,GL_INVALID_OPERATION); """, } no_passthrough = { "glGenSamplers": True, "glDeleteSamplers": True, "glGenQueries": True, "glDeleteQueries": True, "glGetInteger64_v": True, "glGetIntegeri_v": True, "glGetInteger64i_v": True, }