Merge "1.1 Translator conformance: fix texture issues"
This commit is contained in:
@@ -168,9 +168,14 @@ GL_API GLESiface* __translator_getIfaces(EGLiface* eglIface){
|
||||
|
||||
}
|
||||
|
||||
static TextureData* getTextureData(){
|
||||
static TextureData* getTextureData(unsigned int tex){
|
||||
GET_CTX_RET(NULL);
|
||||
unsigned int tex = ctx->getBindedTexture();
|
||||
|
||||
if(!thrd->shareGroup->isObject(TEXTURE,tex))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
TextureData *texData = NULL;
|
||||
ObjectDataPtr objData = thrd->shareGroup->getObjectData(TEXTURE,tex);
|
||||
if(!objData.Ptr()){
|
||||
@@ -182,6 +187,13 @@ static TextureData* getTextureData(){
|
||||
return texData;
|
||||
}
|
||||
|
||||
static TextureData* getTextureData(){
|
||||
GET_CTX_RET(NULL);
|
||||
unsigned int tex = ctx->getBindedTexture();
|
||||
|
||||
return getTextureData(tex);
|
||||
}
|
||||
|
||||
GL_API GLboolean GL_APIENTRY glIsBuffer(GLuint buffer) {
|
||||
GET_CTX_RET(GL_FALSE)
|
||||
|
||||
@@ -208,10 +220,12 @@ GL_API GLboolean GL_APIENTRY glIsEnabled( GLenum cap) {
|
||||
|
||||
GL_API 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 ctx->dispatcher().glIsTexture(texture);
|
||||
|
||||
if(texture == 0) // Special case
|
||||
return GL_FALSE;
|
||||
|
||||
TextureData* tex = getTextureData(texture);
|
||||
return tex ? tex->wasBound : GL_FALSE;
|
||||
}
|
||||
|
||||
GL_API GLenum GL_APIENTRY glGetError(void) {
|
||||
@@ -298,6 +312,9 @@ GL_API void GL_APIENTRY glBindTexture( GLenum target, GLuint texture) {
|
||||
}
|
||||
}
|
||||
ctx->setBindedTexture(texture);
|
||||
TextureData* tex = getTextureData(texture);
|
||||
tex->wasBound = true;
|
||||
|
||||
ctx->dispatcher().glBindTexture(target,globalTextureName);
|
||||
}
|
||||
|
||||
@@ -1398,6 +1415,8 @@ GL_API void GL_APIENTRY glTexImage2D( GLenum target, GLint level, GLint interna
|
||||
|
||||
SET_ERROR_IF(!(GLEScmValidate::pixelOp(format,type) && internalformat == ((GLint)format)),GL_INVALID_OPERATION);
|
||||
|
||||
ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels);
|
||||
|
||||
if (thrd->shareGroup.Ptr()){
|
||||
TextureData *texData = getTextureData();
|
||||
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
|
||||
@@ -1406,20 +1425,49 @@ GL_API void GL_APIENTRY glTexImage2D( GLenum target, GLint level, GLint interna
|
||||
texData->height = height;
|
||||
texData->border = border;
|
||||
texData->internalFormat = internalformat;
|
||||
|
||||
if(texData->requiresAutoMipmap)
|
||||
{
|
||||
ctx->dispatcher().glGenerateMipmapEXT(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx->dispatcher().glTexImage2D(target,level,internalformat,width,height,border,format,type,pixels);
|
||||
}
|
||||
|
||||
static bool handleMipmapGeneration(GLenum pname, bool param)
|
||||
{
|
||||
GET_CTX_RET(false)
|
||||
|
||||
if(pname == GL_GENERATE_MIPMAP && !ctx->isAutoMipmapSupported())
|
||||
{
|
||||
TextureData *texData = getTextureData();
|
||||
if(texData)
|
||||
{
|
||||
texData->requiresAutoMipmap = param;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
GL_API void GL_APIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param) {
|
||||
GET_CTX()
|
||||
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
|
||||
|
||||
if(handleMipmapGeneration(pname, (bool)param))
|
||||
return;
|
||||
|
||||
ctx->dispatcher().glTexParameterf(target,pname,param);
|
||||
}
|
||||
|
||||
GL_API void GL_APIENTRY glTexParameterfv( GLenum target, GLenum pname, const GLfloat *params) {
|
||||
GET_CTX()
|
||||
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
|
||||
|
||||
if(handleMipmapGeneration(pname, (bool)(*params)))
|
||||
return;
|
||||
|
||||
if (pname==GL_TEXTURE_CROP_RECT_OES) {
|
||||
TextureData *texData = getTextureData();
|
||||
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
|
||||
@@ -1434,12 +1482,20 @@ GL_API void GL_APIENTRY glTexParameterfv( GLenum target, GLenum pname, const GL
|
||||
GL_API void GL_APIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param) {
|
||||
GET_CTX()
|
||||
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
|
||||
|
||||
if(handleMipmapGeneration(pname, (bool)param))
|
||||
return;
|
||||
|
||||
ctx->dispatcher().glTexParameteri(target,pname,param);
|
||||
}
|
||||
|
||||
GL_API void GL_APIENTRY glTexParameteriv( GLenum target, GLenum pname, const GLint *params) {
|
||||
GET_CTX()
|
||||
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
|
||||
|
||||
if(handleMipmapGeneration(pname, (bool)(*params)))
|
||||
return;
|
||||
|
||||
if (pname==GL_TEXTURE_CROP_RECT_OES) {
|
||||
TextureData *texData = getTextureData();
|
||||
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
|
||||
@@ -1454,12 +1510,20 @@ GL_API void GL_APIENTRY glTexParameteriv( GLenum target, GLenum pname, const GL
|
||||
GL_API void GL_APIENTRY glTexParameterx( GLenum target, GLenum pname, GLfixed param) {
|
||||
GET_CTX()
|
||||
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
|
||||
|
||||
if(handleMipmapGeneration(pname, (bool)param))
|
||||
return;
|
||||
|
||||
ctx->dispatcher().glTexParameterf(target,pname,static_cast<GLfloat>(param));
|
||||
}
|
||||
|
||||
GL_API void GL_APIENTRY glTexParameterxv( GLenum target, GLenum pname, const GLfixed *params) {
|
||||
GET_CTX()
|
||||
SET_ERROR_IF(!GLEScmValidate::texParams(target,pname),GL_INVALID_ENUM);
|
||||
|
||||
if(handleMipmapGeneration(pname, (bool)(*params)))
|
||||
return;
|
||||
|
||||
if (pname==GL_TEXTURE_CROP_RECT_OES) {
|
||||
TextureData *texData = getTextureData();
|
||||
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
|
||||
@@ -1480,6 +1544,15 @@ GL_API void GL_APIENTRY glTexSubImage2D( GLenum target, GLint level, GLint xoff
|
||||
SET_ERROR_IF(!GLEScmValidate::pixelOp(format,type),GL_INVALID_OPERATION);
|
||||
|
||||
ctx->dispatcher().glTexSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixels);
|
||||
|
||||
if (thrd->shareGroup.Ptr()){
|
||||
TextureData *texData = getTextureData();
|
||||
SET_ERROR_IF(texData==NULL,GL_INVALID_OPERATION);
|
||||
if(texData && texData->requiresAutoMipmap)
|
||||
{
|
||||
ctx->dispatcher().glGenerateMipmapEXT(target);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GL_API void GL_APIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z) {
|
||||
|
||||
@@ -111,6 +111,7 @@ bool GLEScmValidate::texParams(GLenum target,GLenum pname) {
|
||||
case GL_TEXTURE_WRAP_S:
|
||||
case GL_TEXTURE_WRAP_T:
|
||||
case GL_TEXTURE_CROP_RECT_OES:
|
||||
case GL_GENERATE_MIPMAP:
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
|
||||
@@ -504,6 +504,9 @@ void GLEScontext::initCapsLocked(const GLubyte * extensionString)
|
||||
if (strstr(cstring,"GL_ARB_half_float_vertex ")!=NULL)
|
||||
s_glSupport.GL_ARB_HALF_FLOAT_VERTEX = true;
|
||||
|
||||
if (strstr(cstring,"GL_SGIS_generate_mipmap ")!=NULL)
|
||||
s_glSupport.GL_SGIS_GENERATE_MIPMAP = true;
|
||||
|
||||
}
|
||||
|
||||
bool GLEScontext::isTextureUnitEnabled(GLenum unit) {
|
||||
@@ -565,6 +568,10 @@ bool GLEScontext::glGetIntegerv(GLenum pname, GLint *params)
|
||||
*params = m_elementBuffer;
|
||||
break;
|
||||
|
||||
case GL_TEXTURE_BINDING_2D:
|
||||
*params = m_tex2DBind[m_activeTexture].texture;
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ struct GLSupport {
|
||||
GL_ARB_VERTEX_BLEND(false), GL_ARB_MATRIX_PALETTE(false), \
|
||||
GL_NV_PACKED_DEPTH_STENCIL(false) , GL_OES_READ_FORMAT(false), \
|
||||
GL_ARB_HALF_FLOAT_PIXEL(false), GL_NV_HALF_FLOAT(false), \
|
||||
GL_ARB_HALF_FLOAT_VERTEX(false) {} ;
|
||||
GL_ARB_HALF_FLOAT_VERTEX(false),GL_SGIS_GENERATE_MIPMAP(false) {} ;
|
||||
int maxLights;
|
||||
int maxVertexAttribs;
|
||||
int maxClipPlane;
|
||||
@@ -58,6 +58,7 @@ struct GLSupport {
|
||||
bool GL_ARB_HALF_FLOAT_PIXEL;
|
||||
bool GL_NV_HALF_FLOAT;
|
||||
bool GL_ARB_HALF_FLOAT_VERTEX;
|
||||
bool GL_SGIS_GENERATE_MIPMAP;
|
||||
|
||||
};
|
||||
|
||||
@@ -133,6 +134,7 @@ public:
|
||||
static int getMaxClipPlanes(){return s_glSupport.maxClipPlane;}
|
||||
static int getMaxTexSize(){return s_glSupport.maxTexSize;}
|
||||
static Version glslVersion(){return s_glSupport.glslVersion;}
|
||||
static bool isAutoMipmapSupported(){return s_glSupport.GL_SGIS_GENERATE_MIPMAP;}
|
||||
|
||||
virtual bool glGetIntegerv(GLenum pname, GLint *params);
|
||||
virtual bool glGetBooleanv(GLenum pname, GLboolean *params);
|
||||
|
||||
@@ -37,7 +37,7 @@ public:
|
||||
~TextureData() {
|
||||
if (sourceEGLImage && eglImageDetach) (*eglImageDetach)(sourceEGLImage);
|
||||
}
|
||||
TextureData():width(0),height(0),border(0),internalFormat(GL_RGBA),sourceEGLImage(0){
|
||||
TextureData():width(0),height(0),border(0),internalFormat(GL_RGBA),sourceEGLImage(0),wasBound(false),requiresAutoMipmap(false){
|
||||
memset(crop_rect,0,4*sizeof(int));
|
||||
};
|
||||
|
||||
@@ -46,6 +46,8 @@ public:
|
||||
unsigned int border;
|
||||
unsigned int internalFormat;
|
||||
unsigned int sourceEGLImage;
|
||||
bool wasBound;
|
||||
bool requiresAutoMipmap;
|
||||
int crop_rect[4];
|
||||
void (*eglImageDetach)(unsigned int imageId);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user