am bcfc7b17: Merge "GLES translator - enable binding to multiple texture targets"

* commit 'bcfc7b17a0bd7feb90ab0c240864b6e1a5385f56':
  GLES translator - enable binding to multiple texture targets
This commit is contained in:
David Turner
2011-08-03 06:50:25 -07:00
committed by Android Git Automerger
7 changed files with 238 additions and 130 deletions

View File

@@ -73,6 +73,7 @@ static void initContext(GLEScontext* ctx,ShareGroupPtr grp) {
ctx->setShareGroup(grp);
ctx->init();
glBindTexture(GL_TEXTURE_2D,0);
glBindTexture(GL_TEXTURE_CUBE_MAP_OES,0);
}
}
@@ -169,7 +170,12 @@ GL_API GLESiface* __translator_getIfaces(EGLiface* eglIface){
}
static TextureData* getTextureData(unsigned int tex){
static ObjectLocalName TextureLocalName(GLenum target, unsigned int tex) {
GET_CTX_RET(0);
return (tex!=0? tex : ctx->getDefaultTextureName(target));
}
static TextureData* getTextureData(ObjectLocalName tex){
GET_CTX_RET(NULL);
if(!thrd->shareGroup->isObject(TEXTURE,tex))
@@ -188,11 +194,10 @@ static TextureData* getTextureData(unsigned int tex){
return texData;
}
static TextureData* getTextureData(){
static TextureData* getTextureTargetData(GLenum target){
GET_CTX_RET(NULL);
unsigned int tex = ctx->getBindedTexture();
return getTextureData(tex);
unsigned int tex = ctx->getBindedTexture(target);
return getTextureData(TextureLocalName(target,tex));
}
GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) {
@@ -303,19 +308,27 @@ GL_API void GL_APIENTRY glBindTexture( GLenum target, GLuint texture) {
GET_CTX()
SET_ERROR_IF(!GLEScmValidate::textureTarget(target),GL_INVALID_ENUM)
GLuint globalTextureName = texture;
//for handling default texture (0)
ObjectLocalName localTexName = TextureLocalName(target,texture);
GLuint globalTextureName = localTexName;
if(thrd->shareGroup.Ptr()){
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
//if texture wasn't generated before,generate one
if(!globalTextureName){
thrd->shareGroup->genName(TEXTURE,texture);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
thrd->shareGroup->genName(TEXTURE,localTexName);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
}
}
ctx->setBindedTexture(texture);
TextureData* tex = getTextureData(texture);
tex->wasBound = true;
TextureData* texData = getTextureData(localTexName);
if (texData->target==0)
texData->target = target;
//if texture was already bound to another target
SET_ERROR_IF(texData->target!=target,GL_INVALID_OPERATION);
texData->wasBound = true;
}
ctx->setBindedTexture(target,texture);
ctx->dispatcher().glBindTexture(target,globalTextureName);
}
@@ -483,11 +496,11 @@ GL_API void GL_APIENTRY glDeleteTextures( GLsizei n, const GLuint *textures) {
thrd->shareGroup->deleteName(TEXTURE,textures[i]);
const GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,textures[i]);
ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
if(ctx->getBindedTexture() == textures[i])
{
ctx->setBindedTexture(0);
}
if(ctx->getBindedTexture(GL_TEXTURE_2D) == textures[i])
ctx->setBindedTexture(GL_TEXTURE_2D,0);
if (ctx->getBindedTexture(GL_TEXTURE_CUBE_MAP) == textures[i])
ctx->setBindedTexture(GL_TEXTURE_CUBE_MAP,0);
}
}
}
@@ -521,10 +534,8 @@ GL_API void GL_APIENTRY glDisable( GLenum cap) {
ctx->dispatcher().glDisable(GL_TEXTURE_GEN_R);
}
ctx->dispatcher().glDisable(cap);
if (cap==GL_TEXTURE_2D)
ctx->setTextureEnabled(TEXTURE_2D,false);
else if (cap==GL_TEXTURE_CUBE_MAP_OES)
ctx->setTextureEnabled(TEXTURE_CUBE_MAP,false);
if (cap==GL_TEXTURE_2D || cap==GL_TEXTURE_CUBE_MAP_OES)
ctx->setTextureEnabled(cap,false);
}
GL_API void GL_APIENTRY glDisableClientState( GLenum array) {
@@ -585,10 +596,8 @@ GL_API void GL_APIENTRY glEnable( GLenum cap) {
}
else
ctx->dispatcher().glEnable(cap);
if (cap==GL_TEXTURE_2D)
ctx->setTextureEnabled(TEXTURE_2D,true);
else if (cap==GL_TEXTURE_CUBE_MAP_OES)
ctx->setTextureEnabled(TEXTURE_CUBE_MAP,true);
if (cap==GL_TEXTURE_2D || cap==GL_TEXTURE_CUBE_MAP_OES)
ctx->setTextureEnabled(cap,true);
}
GL_API void GL_APIENTRY glEnableClientState( GLenum array) {
@@ -986,7 +995,7 @@ GL_API void GL_APIENTRY glGetTexEnvxv( GLenum env, GLenum pname, GLfixed *param
GL_API void GL_APIENTRY glGetTexParameterfv( GLenum target, GLenum pname, GLfloat *params) {
GET_CTX()
if (pname==GL_TEXTURE_CROP_RECT_OES) {
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
for (int i=0;i<4;++i)
params[i] = texData->crop_rect[i];
@@ -999,7 +1008,7 @@ GL_API void GL_APIENTRY glGetTexParameterfv( GLenum target, GLenum pname, GLflo
GL_API void GL_APIENTRY glGetTexParameteriv( GLenum target, GLenum pname, GLint *params) {
GET_CTX()
if (pname==GL_TEXTURE_CROP_RECT_OES) {
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
for (int i=0;i<4;++i)
params[i] = texData->crop_rect[i];
@@ -1012,7 +1021,7 @@ GL_API void GL_APIENTRY glGetTexParameteriv( GLenum target, GLenum pname, GLint
GL_API void GL_APIENTRY glGetTexParameterxv( GLenum target, GLenum pname, GLfixed *params) {
GET_CTX()
if (pname==GL_TEXTURE_CROP_RECT_OES) {
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
for (int i=0;i<4;++i)
params[i] = F2X(texData->crop_rect[i]);
@@ -1419,13 +1428,14 @@ GL_API void GL_APIENTRY glTexImage2D( GLenum target, GLint level, GLint interna
ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels);
if (thrd->shareGroup.Ptr()){
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
if(texData) {
texData->width = width;
texData->height = height;
texData->border = border;
texData->internalFormat = internalformat;
texData->target = target;
if(texData->requiresAutoMipmap)
{
@@ -1435,13 +1445,13 @@ GL_API void GL_APIENTRY glTexImage2D( GLenum target, GLint level, GLint interna
}
}
static bool handleMipmapGeneration(GLenum pname, bool param)
static bool handleMipmapGeneration(GLenum target, GLenum pname, bool param)
{
GET_CTX_RET(false)
if(pname == GL_GENERATE_MIPMAP && !ctx->isAutoMipmapSupported())
{
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
if(texData)
{
texData->requiresAutoMipmap = param;
@@ -1456,7 +1466,7 @@ GL_API void GL_APIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat p
GET_CTX()
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
if(handleMipmapGeneration(pname, (bool)param))
if(handleMipmapGeneration(target, pname, (bool)param))
return;
ctx->dispatcher().glTexParameterf(target,pname,param);
@@ -1466,11 +1476,11 @@ GL_API void GL_APIENTRY glTexParameterfv( GLenum target, GLenum pname, const GL
GET_CTX()
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
if(handleMipmapGeneration(pname, (bool)(*params)))
if(handleMipmapGeneration(target, pname, (bool)(*params)))
return;
if (pname==GL_TEXTURE_CROP_RECT_OES) {
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
for (int i=0;i<4;++i)
texData->crop_rect[i] = params[i];
@@ -1484,7 +1494,7 @@ GL_API void GL_APIENTRY glTexParameteri( GLenum target, GLenum pname, GLint par
GET_CTX()
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
if(handleMipmapGeneration(pname, (bool)param))
if(handleMipmapGeneration(target, pname, (bool)param))
return;
ctx->dispatcher().glTexParameteri(target,pname,param);
@@ -1494,11 +1504,11 @@ GL_API void GL_APIENTRY glTexParameteriv( GLenum target, GLenum pname, const GL
GET_CTX()
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
if(handleMipmapGeneration(pname, (bool)(*params)))
if(handleMipmapGeneration(target, pname, (bool)(*params)))
return;
if (pname==GL_TEXTURE_CROP_RECT_OES) {
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
for (int i=0;i<4;++i)
texData->crop_rect[i] = params[i];
@@ -1512,7 +1522,7 @@ GL_API void GL_APIENTRY glTexParameterx( GLenum target, GLenum pname, GLfixed p
GET_CTX()
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
if(handleMipmapGeneration(pname, (bool)param))
if(handleMipmapGeneration(target, pname, (bool)param))
return;
ctx->dispatcher().glTexParameterf(target,pname,static_cast<GLfloat>(param));
@@ -1522,11 +1532,11 @@ GL_API void GL_APIENTRY glTexParameterxv( GLenum target, GLenum pname, const GL
GET_CTX()
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
if(handleMipmapGeneration(pname, (bool)(*params)))
if(handleMipmapGeneration(target, pname, (bool)(*params)))
return;
if (pname==GL_TEXTURE_CROP_RECT_OES) {
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
for (int i=0;i<4;++i)
texData->crop_rect[i] = X2F(params[i]);
@@ -1547,7 +1557,7 @@ GL_API void GL_APIENTRY glTexSubImage2D( GLenum target, GLint level, GLint xoff
ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
if (thrd->shareGroup.Ptr()){
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
if(texData && texData->requiresAutoMipmap)
{
@@ -1588,7 +1598,7 @@ GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOE
// flag to the OpenGL layer to skip the image creation and map the
// current binded texture object to the existing global object.
if (thrd->shareGroup.Ptr()) {
unsigned int tex = ctx->getBindedTexture();
ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
unsigned int oldGlobal = thrd->shareGroup->getGlobalName(TEXTURE, tex);
// Delete old texture object
if (oldGlobal) {
@@ -1597,7 +1607,7 @@ GL_API void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglImageOE
// replace mapping and bind the new global object
thrd->shareGroup->replaceGlobalName(TEXTURE, tex,img->globalTexName);
ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName);
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
texData->sourceEGLImage = (unsigned int)image;
texData->eglImageDetach = s_eglIface->eglDetachEGLImage;
@@ -1981,7 +1991,8 @@ void glDrawTexOES (T x, T y, T z, T width, T height) {
for (int i=0;i<ctx->getMaxTexUnits();++i) {
if (ctx->isTextureUnitEnabled(GL_TEXTURE0+i)) {
TextureData * texData = NULL;
int tex = ctx->getBindedTexture(GL_TEXTURE0+i);
unsigned int texname = ctx->getBindedTexture(GL_TEXTURE0+i,GL_TEXTURE_2D);
ObjectLocalName tex = TextureLocalName(GL_TEXTURE_2D,texname);
ctx->dispatcher().glClientActiveTexture(GL_TEXTURE0+i);
ObjectDataPtr objData = thrd->shareGroup->getObjectData(TEXTURE,tex);
if (objData.Ptr()) {

View File

@@ -70,6 +70,7 @@ static void initContext(GLEScontext* ctx,ShareGroupPtr grp) {
ctx->setShareGroup(grp);
ctx->init();
glBindTexture(GL_TEXTURE_2D,0);
glBindTexture(GL_TEXTURE_CUBE_MAP,0);
}
}
static GLEScontext* createGLESContext() {
@@ -115,6 +116,30 @@ GL_APICALL GLESiface* __translator_getIfaces(EGLiface* eglIface){
}
static ObjectLocalName TextureLocalName(GLenum target,unsigned int tex) {
GET_CTX_RET(0);
return (tex!=0? tex : ctx->getDefaultTextureName(target));
}
static TextureData* getTextureData(ObjectLocalName tex) {
GET_CTX_RET(NULL);
TextureData *texData = NULL;
ObjectDataPtr objData = thrd->shareGroup->getObjectData(TEXTURE,tex);
if(!objData.Ptr()){
texData = new TextureData();
thrd->shareGroup->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
} else {
texData = (TextureData*)objData.Ptr();
}
return texData;
}
static TextureData* getTextureTargetData(GLenum target){
GET_CTX_RET(NULL);
unsigned int tex = ctx->getBindedTexture(target);
return getTextureData(TextureLocalName(target,tex));
}
GL_APICALL void GL_APIENTRY glActiveTexture(GLenum texture){
GET_CTX_V2();
SET_ERROR_IF (!GLESv2Validate::textureEnum(texture,ctx->getMaxTexUnits()),GL_INVALID_ENUM);
@@ -204,16 +229,27 @@ GL_APICALL void GL_APIENTRY glBindTexture(GLenum target, GLuint texture){
GET_CTX();
SET_ERROR_IF(!GLESv2Validate::textureTarget(target),GL_INVALID_ENUM)
GLuint globalTextureName = texture;
//for handling default texture (0)
ObjectLocalName localTexName = TextureLocalName(target,texture);
GLuint globalTextureName = localTexName;
if(thrd->shareGroup.Ptr()){
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
//if texture wasn't generated before,generate one
if(!globalTextureName){
thrd->shareGroup->genName(TEXTURE,texture);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
thrd->shareGroup->genName(TEXTURE,localTexName);
globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,localTexName);
}
TextureData* texData = getTextureData(localTexName);
if (texData->target==0)
texData->target = target;
//if texture was already bound to another target
SET_ERROR_IF(texData->target !=target,GL_INVALID_OPERATION);
texData->wasBound = true;
}
ctx->setBindedTexture(texture);
ctx->setBindedTexture(target,texture);
ctx->dispatcher().glBindTexture(target,globalTextureName);
}
@@ -403,9 +439,16 @@ GL_APICALL void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint* textures)
SET_ERROR_IF(n<0,GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
for(int i=0; i < n; i++){
const GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,textures[i]);
thrd->shareGroup->deleteName(TEXTURE,textures[i]);
ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
if (textures[i]!=0) {
const GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,textures[i]);
thrd->shareGroup->deleteName(TEXTURE,textures[i]);
ctx->dispatcher().glDeleteTextures(1,&globalTextureName);
if (ctx->getBindedTexture(GL_TEXTURE_2D) == textures[i])
ctx->setBindedTexture(GL_TEXTURE_2D,0);
if (ctx->getBindedTexture(GL_TEXTURE_CUBE_MAP) == textures[i])
ctx->setBindedTexture(GL_TEXTURE_CUBE_MAP,0);
}
}
}
}
@@ -571,7 +614,8 @@ GL_APICALL void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attach
SET_ERROR_IF(level != 0, GL_INVALID_VALUE);
if(thrd->shareGroup.Ptr()) {
GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texture);
ObjectLocalName texname = TextureLocalName(textarget,texture);
GLuint globalTextureName = thrd->shareGroup->getGlobalName(TEXTURE,texname);
ctx->dispatcher().glFramebufferTexture2DEXT(target,attachment,textarget,globalTextureName,level);
}
}
@@ -1158,10 +1202,10 @@ GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer(GLuint renderbuffer){
GL_APICALL GLboolean GL_APIENTRY glIsTexture(GLuint texture){
GET_CTX_RET(GL_FALSE)
if(texture && thrd->shareGroup.Ptr()){
return thrd->shareGroup->isObject(TEXTURE,texture) ? GL_TRUE :GL_FALSE;
}
return GL_FALSE;
if (texture==0)
return GL_FALSE;
TextureData* tex = getTextureData(texture);
return tex ? tex->wasBound : GL_FALSE;
}
GL_APICALL GLboolean GL_APIENTRY glIsProgram(GLuint program){
@@ -1310,20 +1354,6 @@ GL_APICALL void GL_APIENTRY glStencilOpSeparate(GLenum face, GLenum fail, GLenu
ctx->dispatcher().glStencilOp(fail,zfail,zpass);
}
static TextureData* getTextureData(){
GET_CTX_RET(NULL);
unsigned int tex = ctx->getBindedTexture();
TextureData *texData = NULL;
ObjectDataPtr objData = thrd->shareGroup->getObjectData(TEXTURE,tex);
if(!objData.Ptr()){
texData = new TextureData();
thrd->shareGroup->setObjectData(TEXTURE, tex, ObjectDataPtr(texData));
} else {
texData = (TextureData*)objData.Ptr();
}
return texData;
}
GL_APICALL void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels){
GET_CTX();
SET_ERROR_IF(!(GLESv2Validate::textureTargetEx(target) &&
@@ -1335,13 +1365,13 @@ GL_APICALL void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint inte
SET_ERROR_IF(border != 0,GL_INVALID_VALUE);
if (thrd->shareGroup.Ptr()){
unsigned int tex = ctx->getBindedTexture();
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
if(texData) {
texData->width = width;
texData->height = height;
texData->border = border;
texData->internalFormat = internalformat;
texData->target = target;
}
}
if (type==GL_HALF_FLOAT_OES)
@@ -1553,7 +1583,7 @@ GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglIma
// flag to the OpenGL layer to skip the image creation and map the
// current binded texture object to the existing global object.
if (thrd->shareGroup.Ptr()) {
unsigned int tex = ctx->getBindedTexture();
ObjectLocalName tex = TextureLocalName(target,ctx->getBindedTexture(target));
unsigned int oldGlobal = thrd->shareGroup->getGlobalName(TEXTURE, tex);
// Delete old texture object
if (oldGlobal) {
@@ -1562,7 +1592,7 @@ GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES(GLenum target, GLeglIma
// replace mapping and bind the new global object
thrd->shareGroup->replaceGlobalName(TEXTURE, tex,img->globalTexName);
ctx->dispatcher().glBindTexture(GL_TEXTURE_2D, img->globalTexName);
TextureData *texData = getTextureData();
TextureData *texData = getTextureTargetData(target);
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
texData->sourceEGLImage = (unsigned int)image;
texData->eglImageDetach = s_eglIface->eglDetachEGLImage;

View File

@@ -121,11 +121,13 @@ void GLEScontext::init() {
initExtensionString();
int maxTexUnits = getMaxTexUnits();
m_tex2DBind = new textureUnitState[maxTexUnits];
m_texState = new textureUnitState[maxTexUnits];
for (int i=0;i<maxTexUnits;++i) {
m_tex2DBind[i].texture = 0;
for (int j=0;j<NUM_TEXTURE_TARGETS;++j)
m_tex2DBind[i].enabled[j] = GL_FALSE;
{
m_texState[i][j].texture = 0;
m_texState[i][j].enabled = GL_FALSE;
}
}
}
}
@@ -135,7 +137,7 @@ GLEScontext::GLEScontext():
m_activeTexture(0) ,
m_unpackAlignment(4) ,
m_glError(GL_NO_ERROR) ,
m_tex2DBind(0) ,
m_texState(0) ,
m_arrayBuffer(0) ,
m_elementBuffer(0){};
@@ -158,8 +160,8 @@ GLEScontext::~GLEScontext() {
delete p;
}
}
delete[] m_tex2DBind;
m_tex2DBind = NULL;
delete[] m_texState;
m_texState = NULL;
}
const GLvoid* GLEScontext::setPointer(GLenum arrType,GLint size,GLenum type,GLsizei stride,const GLvoid* data,bool normalize) {
@@ -518,7 +520,7 @@ void GLEScontext::initCapsLocked(const GLubyte * extensionString)
bool GLEScontext::isTextureUnitEnabled(GLenum unit) {
for (int i=0;i<NUM_TEXTURE_TARGETS;++i) {
if (m_tex2DBind[unit-GL_TEXTURE0].enabled[i])
if (m_texState[unit-GL_TEXTURE0][i].enabled)
return true;
}
return false;
@@ -588,8 +590,11 @@ bool GLEScontext::glGetIntegerv(GLenum pname, GLint *params)
break;
case GL_TEXTURE_BINDING_CUBE_MAP:
*params = m_texState[m_activeTexture][TEXTURE_CUBE_MAP].texture;
break;
case GL_TEXTURE_BINDING_2D:
*params = m_tex2DBind[m_activeTexture].texture;
*params = m_texState[m_activeTexture][TEXTURE_2D].texture;
break;
case GL_ACTIVE_TEXTURE:
@@ -610,3 +615,59 @@ bool GLEScontext::glGetIntegerv(GLenum pname, GLint *params)
return true;
}
TextureTarget GLEScontext::GLTextureTargetToLocal(GLenum target) {
TextureTarget value=TEXTURE_2D;
switch (target) {
case GL_TEXTURE_CUBE_MAP:
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
value = TEXTURE_CUBE_MAP;
break;
case GL_TEXTURE_2D:
value = TEXTURE_2D;
break;
}
return value;
}
unsigned int GLEScontext::getBindedTexture(GLenum target) {
TextureTarget pos = GLTextureTargetToLocal(target);
return m_texState[m_activeTexture][pos].texture;
}
unsigned int GLEScontext::getBindedTexture(GLenum unit, GLenum target) {
TextureTarget pos = GLTextureTargetToLocal(target);
return m_texState[unit-GL_TEXTURE0][pos].texture;
}
void GLEScontext::setBindedTexture(GLenum target, unsigned int tex) {
TextureTarget pos = GLTextureTargetToLocal(target);
m_texState[m_activeTexture][pos].texture = tex;
}
void GLEScontext::setTextureEnabled(GLenum target, GLenum enable) {
TextureTarget pos = GLTextureTargetToLocal(target);
m_texState[m_activeTexture][pos].enabled = enable;
}
#define INTERNAL_NAME(x) (x +0x100000000ll);
ObjectLocalName GLEScontext::getDefaultTextureName(GLenum target) {
ObjectLocalName name = 0;
switch (GLTextureTargetToLocal(target)) {
case TEXTURE_2D:
name = INTERNAL_NAME(0);
break;
case TEXTURE_CUBE_MAP:
name = INTERNAL_NAME(1);
break;
default:
name = 0;
break;
}
return name;
}

View File

@@ -33,11 +33,11 @@ NameSpace::~NameSpace()
}
}
unsigned int
NameSpace::genName(unsigned int p_localName, bool genGlobal, bool genLocal)
ObjectLocalName
NameSpace::genName(ObjectLocalName p_localName, bool genGlobal, bool genLocal)
{
unsigned int localName = p_localName;
ObjectLocalName localName = p_localName;
if (genLocal) {
do {
localName = ++m_nextName;
@@ -53,7 +53,7 @@ NameSpace::genName(unsigned int p_localName, bool genGlobal, bool genLocal)
}
unsigned int
NameSpace::getGlobalName(unsigned int p_localName)
NameSpace::getGlobalName(ObjectLocalName p_localName)
{
NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
if (n != m_localToGlobalMap.end()) {
@@ -65,7 +65,7 @@ NameSpace::getGlobalName(unsigned int p_localName)
return 0;
}
unsigned int
ObjectLocalName
NameSpace::getLocalName(unsigned int p_globalName)
{
for(NamesMap::iterator it = m_localToGlobalMap.begin(); it != m_localToGlobalMap.end();it++){
@@ -80,7 +80,7 @@ NameSpace::getLocalName(unsigned int p_globalName)
}
void
NameSpace::deleteName(unsigned int p_localName)
NameSpace::deleteName(ObjectLocalName p_localName)
{
NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
if (n != m_localToGlobalMap.end()) {
@@ -90,13 +90,13 @@ NameSpace::deleteName(unsigned int p_localName)
}
bool
NameSpace::isObject(unsigned int p_localName)
NameSpace::isObject(ObjectLocalName p_localName)
{
return (m_localToGlobalMap.find(p_localName) != m_localToGlobalMap.end() );
}
void
NameSpace::replaceGlobalName(unsigned int p_localName, unsigned int p_globalName)
NameSpace::replaceGlobalName(ObjectLocalName p_localName, unsigned int p_globalName)
{
NamesMap::iterator n( m_localToGlobalMap.find(p_localName) );
if (n != m_localToGlobalMap.end()) {
@@ -105,7 +105,7 @@ NameSpace::replaceGlobalName(unsigned int p_localName, unsigned int p_globalName
}
}
typedef std::pair<NamedObjectType, unsigned int> ObjectIDPair;
typedef std::pair<NamedObjectType, ObjectLocalName> ObjectIDPair;
typedef std::map<ObjectIDPair, ObjectDataPtr> ObjectDataMap;
ShareGroup::ShareGroup(GlobalNameSpace *globalNameSpace)
@@ -133,20 +133,20 @@ ShareGroup::~ShareGroup()
mutex_destroy(&m_lock);
}
unsigned int
ShareGroup::genName(NamedObjectType p_type, unsigned int p_localName, bool genLocal)
ObjectLocalName
ShareGroup::genName(NamedObjectType p_type, ObjectLocalName p_localName, bool genLocal)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
mutex_lock(&m_lock);
unsigned int localName = m_nameSpace[p_type]->genName(p_localName,true,genLocal);
ObjectLocalName localName = m_nameSpace[p_type]->genName(p_localName,true,genLocal);
mutex_unlock(&m_lock);
return localName;
}
unsigned int
ShareGroup::getGlobalName(NamedObjectType p_type, unsigned int p_localName)
ShareGroup::getGlobalName(NamedObjectType p_type, ObjectLocalName p_localName)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
@@ -157,20 +157,20 @@ ShareGroup::getGlobalName(NamedObjectType p_type, unsigned int p_localName)
return globalName;
}
unsigned int
ObjectLocalName
ShareGroup::getLocalName(NamedObjectType p_type, unsigned int p_globalName)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
mutex_lock(&m_lock);
unsigned int localName = m_nameSpace[p_type]->getLocalName(p_globalName);
ObjectLocalName localName = m_nameSpace[p_type]->getLocalName(p_globalName);
mutex_unlock(&m_lock);
return localName;
}
void
ShareGroup::deleteName(NamedObjectType p_type, unsigned int p_localName)
ShareGroup::deleteName(NamedObjectType p_type, ObjectLocalName p_localName)
{
if (p_type >= NUM_OBJECT_TYPES) return;
@@ -184,7 +184,7 @@ ShareGroup::deleteName(NamedObjectType p_type, unsigned int p_localName)
}
bool
ShareGroup::isObject(NamedObjectType p_type, unsigned int p_localName)
ShareGroup::isObject(NamedObjectType p_type, ObjectLocalName p_localName)
{
if (p_type >= NUM_OBJECT_TYPES) return 0;
@@ -196,7 +196,7 @@ ShareGroup::isObject(NamedObjectType p_type, unsigned int p_localName)
}
void
ShareGroup::replaceGlobalName(NamedObjectType p_type, unsigned int p_localName, unsigned int p_globalName)
ShareGroup::replaceGlobalName(NamedObjectType p_type, ObjectLocalName p_localName, unsigned int p_globalName)
{
if (p_type >= NUM_OBJECT_TYPES) return;
@@ -206,7 +206,7 @@ ShareGroup::replaceGlobalName(NamedObjectType p_type, unsigned int p_localName,
}
void
ShareGroup::setObjectData(NamedObjectType p_type, unsigned int p_localName, ObjectDataPtr data)
ShareGroup::setObjectData(NamedObjectType p_type, ObjectLocalName p_localName, ObjectDataPtr data)
{
if (p_type >= NUM_OBJECT_TYPES) return;
@@ -225,7 +225,7 @@ ShareGroup::setObjectData(NamedObjectType p_type, unsigned int p_localName, Obje
}
ObjectDataPtr
ShareGroup::getObjectData(NamedObjectType p_type, unsigned int p_localName)
ShareGroup::getObjectData(NamedObjectType p_type, ObjectLocalName p_localName)
{
ObjectDataPtr ret;

View File

@@ -15,10 +15,12 @@ TEXTURE_CUBE_MAP,
NUM_TEXTURE_TARGETS
};
typedef struct _textureUnitState {
typedef struct _textureTargetState {
GLuint texture;
GLboolean enabled[NUM_TEXTURE_TARGETS];
} textureUnitState;
GLboolean enabled;
} textureTargetState;
typedef textureTargetState textureUnitState[NUM_TEXTURE_TARGETS];
class Version{
public:
@@ -102,11 +104,12 @@ public:
void setGLerror(GLenum err);
void setShareGroup(ShareGroupPtr grp){m_shareGroup = grp;};
virtual void setActiveTexture(GLenum tex);
unsigned int getBindedTexture(){return m_tex2DBind[m_activeTexture].texture;};
unsigned int getBindedTexture(GLenum unit) { return m_tex2DBind[unit - GL_TEXTURE0].texture;};
void setBindedTexture(unsigned int tex){ m_tex2DBind[m_activeTexture].texture = tex;};
unsigned int getBindedTexture(GLenum target);
unsigned int getBindedTexture(GLenum unit,GLenum target);
void setBindedTexture(GLenum target,unsigned int tex);
bool isTextureUnitEnabled(GLenum unit);
void setTextureEnabled(TextureTarget target, GLenum enable) {m_tex2DBind[m_activeTexture].enabled[target] = enable; };
void setTextureEnabled(GLenum target, GLenum enable);
ObjectLocalName getDefaultTextureName(GLenum target);
bool isInitialized() { return m_initialized; };
void setUnpackAlignment(GLint param){ m_unpackAlignment = param; };
GLint getUnpackAlignment(){ return m_unpackAlignment; };
@@ -166,10 +169,11 @@ private:
virtual void setupArr(const GLvoid* arr,GLenum arrayType,GLenum dataType,GLint size,GLsizei stride, GLboolean normalized, int pointsIndex = -1) = 0 ;
GLuint getBuffer(GLenum target);
TextureTarget GLTextureTargetToLocal(GLenum target);
ShareGroupPtr m_shareGroup;
GLenum m_glError;
textureUnitState* m_tex2DBind;
textureUnitState* m_texState;
unsigned int m_arrayBuffer;
unsigned int m_elementBuffer;
};

View File

@@ -44,7 +44,8 @@ public:
internalFormat(GL_RGBA),
sourceEGLImage(0),
wasBound(false),
requiresAutoMipmap(false){
requiresAutoMipmap(false),
target(0) {
memset(crop_rect,0,4*sizeof(int));
};
@@ -57,6 +58,7 @@ public:
bool requiresAutoMipmap;
int crop_rect[4];
void (*eglImageDetach)(unsigned int imageId);
GLenum target;
};
struct EglImage

View File

@@ -20,8 +20,6 @@
#include <map>
#include "SmartPtr.h"
typedef std::map<unsigned int, unsigned int> NamesMap;
enum NamedObjectType {
VERTEXBUFFER = 0,
TEXTURE = 1,
@@ -50,6 +48,8 @@ private:
ObjectDataType m_dataType;
};
typedef SmartPtr<ObjectData> ObjectDataPtr;
typedef unsigned long long ObjectLocalName;
typedef std::map<ObjectLocalName, unsigned int> NamesMap;
//
// Class NameSpace - this class manages allocations and deletions of objects
@@ -78,38 +78,38 @@ private:
// the value of the global name can be retrieved using the
// getGlobalName function.
//
unsigned int genName(unsigned int p_localName, bool genGlobal, bool genLocal);
ObjectLocalName genName(ObjectLocalName p_localName, bool genGlobal, bool genLocal);
//
// getGlobalName - returns the global name of an object or 0 if the object
// does not exist.
//
unsigned int getGlobalName(unsigned int p_localName);
unsigned int getGlobalName(ObjectLocalName p_localName);
//
// getLocaalName - returns the local name of an object or 0 if the object
// does not exist.
//
unsigned int getLocalName(unsigned int p_globalName);
ObjectLocalName getLocalName(unsigned int p_globalName);
//
// deleteName - deletes and object from the namespace as well as its
// global name from the global name space.
//
void deleteName(unsigned int p_localName);
void deleteName(ObjectLocalName p_localName);
//
// isObject - returns true if the named object exist.
//
bool isObject(unsigned int p_localName);
bool isObject(ObjectLocalName p_localName);
//
// replaces an object to map to an existing global object
//
void replaceGlobalName(unsigned int p_localName, unsigned int p_globalName);
void replaceGlobalName(ObjectLocalName p_localName, unsigned int p_globalName);
private:
unsigned int m_nextName;
ObjectLocalName m_nextName;
NamesMap m_localToGlobalMap;
const NamedObjectType m_type;
GlobalNameSpace *m_globalNameSpace;
@@ -183,46 +183,46 @@ public:
// This function also generates a "global" name for the object
// which can be queried using the getGlobalName function.
//
unsigned int genName(NamedObjectType p_type, unsigned int p_localName = 0, bool genLocal= false);
ObjectLocalName genName(NamedObjectType p_type, ObjectLocalName p_localName = 0, bool genLocal= false);
//
// getGlobalName - retrieves the "global" name of an object or 0 if the
// object does not exist.
//
unsigned int getGlobalName(NamedObjectType p_type, unsigned int p_localName);
unsigned int getGlobalName(NamedObjectType p_type, ObjectLocalName p_localName);
//
// getLocalName - retrieves the "local" name of an object or 0 if the
// object does not exist.
//
unsigned int getLocalName(NamedObjectType p_type, unsigned int p_globalName);
ObjectLocalName getLocalName(NamedObjectType p_type, unsigned int p_globalName);
//
// deleteName - deletes and object from the namespace as well as its
// global name from the global name space.
//
void deleteName(NamedObjectType p_type, unsigned int p_localName);
void deleteName(NamedObjectType p_type, ObjectLocalName p_localName);
//
// replaceGlobalName - replaces an object to map to an existing global
// named object. (used when creating EGLImage siblings)
//
void replaceGlobalName(NamedObjectType p_type, unsigned int p_localName, unsigned int p_globalName);
void replaceGlobalName(NamedObjectType p_type, ObjectLocalName p_localName, unsigned int p_globalName);
//
// isObject - returns true if the named object exist.
//
bool isObject(NamedObjectType p_type, unsigned int p_localName);
bool isObject(NamedObjectType p_type, ObjectLocalName p_localName);
//
// Assign object global data to a names object
//
void setObjectData(NamedObjectType p_type, unsigned int p_localName, ObjectDataPtr data);
void setObjectData(NamedObjectType p_type, ObjectLocalName p_localName, ObjectDataPtr data);
//
// Retrieve object global data
//
ObjectDataPtr getObjectData(NamedObjectType p_type, unsigned int p_localName);
ObjectDataPtr getObjectData(NamedObjectType p_type, ObjectLocalName p_localName);
private:
explicit ShareGroup(GlobalNameSpace *globalNameSpace);