Fix issues raised by the GLES 1.1 conformance test
- Most of the fixes are about unhandled enums. - Adding an unbindBuffer method to GLEScontext, and use it in the glDeleteBuffers call, so a buffer is not considered bound after it has been deleted. - Handle the case where a call to glCompressedTexImage2D gets NULL as its data (in which case the uncompressTexture function should only calculate the output format, but not attempt to uncompress the NULL data). - A few segfaults. Change-Id: I6a856ea6da1be3b15b41140d6383508a6803897c
This commit is contained in:
@@ -337,7 +337,6 @@ GL_API void GL_APIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLe
|
|||||||
tmpHeight/=2;
|
tmpHeight/=2;
|
||||||
delete uncompressed;
|
delete uncompressed;
|
||||||
}
|
}
|
||||||
ctx->dispatcher().glCompressedTexImage2D(target,level,internalformat,width,height,border,imageSize,data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_API void GL_APIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) {
|
GL_API void GL_APIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data) {
|
||||||
@@ -375,6 +374,7 @@ GL_API void GL_APIENTRY glDeleteBuffers( GLsizei n, const GLuint *buffers) {
|
|||||||
if(thrd->shareGroup.Ptr()) {
|
if(thrd->shareGroup.Ptr()) {
|
||||||
for(int i=0; i < n; i++){
|
for(int i=0; i < n; i++){
|
||||||
thrd->shareGroup->deleteName(VERTEXBUFFER,buffers[i]);
|
thrd->shareGroup->deleteName(VERTEXBUFFER,buffers[i]);
|
||||||
|
ctx->unbindBuffer(buffers[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -555,7 +555,18 @@ GL_API void GL_APIENTRY glGenTextures( GLsizei n, GLuint *textures) {
|
|||||||
|
|
||||||
GL_API void GL_APIENTRY glGetBooleanv( GLenum pname, GLboolean *params) {
|
GL_API void GL_APIENTRY glGetBooleanv( GLenum pname, GLboolean *params) {
|
||||||
GET_CTX()
|
GET_CTX()
|
||||||
|
switch(pname)
|
||||||
|
{
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
|
||||||
|
GLint i;
|
||||||
|
glGetIntegerv(pname, &i);
|
||||||
|
*params = (i != 0) ? GL_TRUE : GL_FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
ctx->dispatcher().glGetBooleanv(pname,params);
|
ctx->dispatcher().glGetBooleanv(pname,params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_API void GL_APIENTRY glGetBufferParameteriv( GLenum target, GLenum pname, GLint *params) {
|
GL_API void GL_APIENTRY glGetBufferParameteriv( GLenum target, GLenum pname, GLint *params) {
|
||||||
@@ -596,22 +607,56 @@ GL_API void GL_APIENTRY glGetClipPlanex( GLenum pname, GLfixed eqn[4]) {
|
|||||||
|
|
||||||
GL_API void GL_APIENTRY glGetFixedv( GLenum pname, GLfixed *params) {
|
GL_API void GL_APIENTRY glGetFixedv( GLenum pname, GLfixed *params) {
|
||||||
GET_CTX()
|
GET_CTX()
|
||||||
|
switch(pname)
|
||||||
|
{
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
|
||||||
|
GLint i;
|
||||||
|
glGetIntegerv(pname, &i);
|
||||||
|
*params = I2X(i);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
size_t nParams = glParamSize(pname);
|
size_t nParams = glParamSize(pname);
|
||||||
GLfloat fParams[16];
|
GLfloat fParams[16];
|
||||||
ctx->dispatcher().glGetFloatv(pname,fParams);
|
ctx->dispatcher().glGetFloatv(pname,fParams);
|
||||||
for(size_t i =0 ; i < nParams;i++) {
|
for(size_t i =0 ; i < nParams;i++) {
|
||||||
params[i] = F2X(fParams[i]);
|
params[i] = F2X(fParams[i]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_API void GL_APIENTRY glGetFloatv( GLenum pname, GLfloat *params) {
|
GL_API void GL_APIENTRY glGetFloatv( GLenum pname, GLfloat *params) {
|
||||||
GET_CTX()
|
GET_CTX()
|
||||||
|
switch(pname)
|
||||||
|
{
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
|
||||||
|
GLint i;
|
||||||
|
glGetIntegerv(pname, &i);
|
||||||
|
*params = (GLfloat)i;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
ctx->dispatcher().glGetFloatv(pname,params);
|
ctx->dispatcher().glGetFloatv(pname,params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_API void GL_APIENTRY glGetIntegerv( GLenum pname, GLint *params) {
|
GL_API void GL_APIENTRY glGetIntegerv( GLenum pname, GLint *params) {
|
||||||
GET_CTX()
|
GET_CTX()
|
||||||
|
switch(pname)
|
||||||
|
{
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_TYPE_OES:
|
||||||
|
*params = GL_UNSIGNED_BYTE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES:
|
||||||
|
*params = GL_RGBA;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
ctx->dispatcher().glGetIntegerv(pname,params);
|
ctx->dispatcher().glGetIntegerv(pname,params);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_API void GL_APIENTRY glGetLightfv( GLenum light, GLenum pname, GLfloat *params) {
|
GL_API void GL_APIENTRY glGetLightfv( GLenum light, GLenum pname, GLfloat *params) {
|
||||||
@@ -632,6 +677,11 @@ GL_API void GL_APIENTRY glGetLightxv( GLenum light, GLenum pname, GLfixed *para
|
|||||||
params[3] = F2X(tmpParams[3]);
|
params[3] = F2X(tmpParams[3]);
|
||||||
case GL_SPOT_DIRECTION:
|
case GL_SPOT_DIRECTION:
|
||||||
params[2] = F2X(tmpParams[2]);
|
params[2] = F2X(tmpParams[2]);
|
||||||
|
case GL_SPOT_EXPONENT:
|
||||||
|
case GL_SPOT_CUTOFF:
|
||||||
|
case GL_CONSTANT_ATTENUATION:
|
||||||
|
case GL_LINEAR_ATTENUATION:
|
||||||
|
case GL_QUADRATIC_ATTENUATION:
|
||||||
params[1] = F2X(tmpParams[1]);
|
params[1] = F2X(tmpParams[1]);
|
||||||
break;
|
break;
|
||||||
default:{
|
default:{
|
||||||
@@ -663,6 +713,7 @@ GL_API void GL_APIENTRY glGetMaterialxv( GLenum face, GLenum pname, GLfixed *pa
|
|||||||
params[1] = tmpParams[1];
|
params[1] = tmpParams[1];
|
||||||
case GL_SHININESS:
|
case GL_SHININESS:
|
||||||
params[0] = tmpParams[0];
|
params[0] = tmpParams[0];
|
||||||
|
break;
|
||||||
default:{
|
default:{
|
||||||
ctx->setGLerror(GL_INVALID_ENUM);
|
ctx->setGLerror(GL_INVALID_ENUM);
|
||||||
return;
|
return;
|
||||||
@@ -780,18 +831,24 @@ GL_API void GL_APIENTRY glLightxv( GLenum light, GLenum pname, const GLfixed *p
|
|||||||
case GL_AMBIENT:
|
case GL_AMBIENT:
|
||||||
case GL_DIFFUSE:
|
case GL_DIFFUSE:
|
||||||
case GL_SPECULAR:
|
case GL_SPECULAR:
|
||||||
|
case GL_EMISSION:
|
||||||
case GL_POSITION:
|
case GL_POSITION:
|
||||||
tmpParams[3] = X2F(params[3]);
|
tmpParams[3] = X2F(params[3]);
|
||||||
case GL_SPOT_DIRECTION:
|
case GL_SPOT_DIRECTION:
|
||||||
tmpParams[2] = X2F(params[2]);
|
tmpParams[2] = X2F(params[2]);
|
||||||
tmpParams[1] = X2F(params[1]);
|
tmpParams[1] = X2F(params[1]);
|
||||||
|
case GL_SPOT_EXPONENT:
|
||||||
|
case GL_SPOT_CUTOFF:
|
||||||
|
case GL_CONSTANT_ATTENUATION:
|
||||||
|
case GL_LINEAR_ATTENUATION:
|
||||||
|
case GL_QUADRATIC_ATTENUATION:
|
||||||
|
tmpParams[0] = X2F(params[0]);
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
ctx->setGLerror(GL_INVALID_ENUM);
|
ctx->setGLerror(GL_INVALID_ENUM);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tmpParams[0] = X2F(params[0]);
|
|
||||||
ctx->dispatcher().glLightfv(light,pname,tmpParams);
|
ctx->dispatcher().glLightfv(light,pname,tmpParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -935,14 +992,9 @@ GL_API void GL_APIENTRY glPointParameterx( GLenum pname, GLfixed param)
|
|||||||
|
|
||||||
GL_API void GL_APIENTRY glPointParameterxv( GLenum pname, const GLfixed *params) {
|
GL_API void GL_APIENTRY glPointParameterxv( GLenum pname, const GLfixed *params) {
|
||||||
GET_CTX()
|
GET_CTX()
|
||||||
GLfloat tmpParams[3];
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
do {
|
GLfloat tmpParam = X2F(*params) ;
|
||||||
tmpParams[i] = X2F(params[i]);
|
ctx->dispatcher().glPointParameterfv(pname,&tmpParam);
|
||||||
i++;
|
|
||||||
}while(pname != GL_POINT_DISTANCE_ATTENUATION);
|
|
||||||
ctx->dispatcher().glPointParameterfv(pname,tmpParams);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GL_API void GL_APIENTRY glPointSize( GLfloat size) {
|
GL_API void GL_APIENTRY glPointSize( GLfloat size) {
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ bool GLEScmValidate::alphaFunc(GLenum f) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool GLEScmValidate::vertexPointerParams(GLint size,GLsizei stride) {
|
bool GLEScmValidate::vertexPointerParams(GLint size,GLsizei stride) {
|
||||||
return ((size >=2) && (size <= 4)) && (stride >=0) ;
|
return ((size >=2) && (size <= 4)) && (stride >=0) ;
|
||||||
}
|
}
|
||||||
@@ -55,7 +54,7 @@ bool GLEScmValidate::colorPointerParams(GLint size,GLsizei stride) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool GLEScmValidate::texCoordPointerParams(GLint size,GLsizei stride) {
|
bool GLEScmValidate::texCoordPointerParams(GLint size,GLsizei stride) {
|
||||||
return ((size >=1) && (size <= 4)) && (stride >=0) ;
|
return ((size >=2) && (size <= 4)) && (stride >=0) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GLEScmValidate::supportedArrays(GLenum arr) {
|
bool GLEScmValidate::supportedArrays(GLenum arr) {
|
||||||
@@ -107,6 +106,7 @@ bool GLEScmValidate::texParams(GLenum target,GLenum pname) {
|
|||||||
bool GLEScmValidate::texEnv(GLenum target,GLenum pname) {
|
bool GLEScmValidate::texEnv(GLenum target,GLenum pname) {
|
||||||
switch(pname) {
|
switch(pname) {
|
||||||
case GL_TEXTURE_ENV_MODE:
|
case GL_TEXTURE_ENV_MODE:
|
||||||
|
case GL_TEXTURE_ENV_COLOR:
|
||||||
case GL_COMBINE_RGB:
|
case GL_COMBINE_RGB:
|
||||||
case GL_COMBINE_ALPHA:
|
case GL_COMBINE_ALPHA:
|
||||||
case GL_SRC0_RGB:
|
case GL_SRC0_RGB:
|
||||||
@@ -204,6 +204,7 @@ bool GLEScmValidate::blendSrc(GLenum s) {
|
|||||||
case GL_ONE_MINUS_SRC_ALPHA:
|
case GL_ONE_MINUS_SRC_ALPHA:
|
||||||
case GL_DST_ALPHA:
|
case GL_DST_ALPHA:
|
||||||
case GL_ONE_MINUS_DST_ALPHA:
|
case GL_ONE_MINUS_DST_ALPHA:
|
||||||
|
case GL_SRC_ALPHA_SATURATE:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ void getPaletteInfo(GLenum internalFormat,unsigned int& indexSizeBits,unsigned i
|
|||||||
|
|
||||||
case GL_PALETTE4_RGBA4_OES:
|
case GL_PALETTE4_RGBA4_OES:
|
||||||
colorFrmt = GL_RGBA;
|
colorFrmt = GL_RGBA;
|
||||||
|
/* fall-through */
|
||||||
case GL_PALETTE4_R5_G6_B5_OES:
|
case GL_PALETTE4_R5_G6_B5_OES:
|
||||||
case GL_PALETTE4_RGB5_A1_OES:
|
case GL_PALETTE4_RGB5_A1_OES:
|
||||||
indexSizeBits = 4;
|
indexSizeBits = 4;
|
||||||
@@ -61,6 +62,9 @@ void getPaletteInfo(GLenum internalFormat,unsigned int& indexSizeBits,unsigned i
|
|||||||
colorFrmt = GL_RGBA;
|
colorFrmt = GL_RGBA;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GL_PALETTE8_RGBA4_OES:
|
||||||
|
colorFrmt = GL_RGBA;
|
||||||
|
/* fall-through */
|
||||||
case GL_PALETTE8_R5_G6_B5_OES:
|
case GL_PALETTE8_R5_G6_B5_OES:
|
||||||
case GL_PALETTE8_RGB5_A1_OES:
|
case GL_PALETTE8_RGB5_A1_OES:
|
||||||
indexSizeBits = 8;
|
indexSizeBits = 8;
|
||||||
@@ -104,9 +108,13 @@ unsigned char* uncompressTexture(GLenum internalformat,GLenum& formatOut,GLsizei
|
|||||||
unsigned int indexSizeBits; //the size of the color index in the pallete
|
unsigned int indexSizeBits; //the size of the color index in the pallete
|
||||||
unsigned int colorSizeBytes; //the size of each color cell in the pallete
|
unsigned int colorSizeBytes; //the size of each color cell in the pallete
|
||||||
|
|
||||||
const unsigned char* palette = static_cast<const unsigned char *>(data);
|
|
||||||
|
|
||||||
getPaletteInfo(internalformat,indexSizeBits,colorSizeBytes,formatOut);
|
getPaletteInfo(internalformat,indexSizeBits,colorSizeBytes,formatOut);
|
||||||
|
if(!data)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned char* palette = static_cast<const unsigned char *>(data);
|
||||||
|
|
||||||
//the pallete positioned in the begininng of the data
|
//the pallete positioned in the begininng of the data
|
||||||
// so we jump over it to get to the colos indices in the palette
|
// so we jump over it to get to the colos indices in the palette
|
||||||
|
|||||||
@@ -68,7 +68,18 @@ bool GLEScontext::isArrEnabled(GLenum arr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const GLESpointer* GLEScontext::getPointer(GLenum arrType) {
|
const GLESpointer* GLEScontext::getPointer(GLenum arrType) {
|
||||||
if(m_map.find(arrType) != m_map.end()) return m_map[arrType];
|
GLenum type =
|
||||||
|
arrType == GL_VERTEX_ARRAY_POINTER ? GL_VERTEX_ARRAY :
|
||||||
|
arrType == GL_NORMAL_ARRAY_POINTER ? GL_NORMAL_ARRAY :
|
||||||
|
arrType == GL_TEXTURE_COORD_ARRAY_POINTER ? GL_TEXTURE_COORD_ARRAY :
|
||||||
|
arrType == GL_COLOR_ARRAY_POINTER ? GL_COLOR_ARRAY :
|
||||||
|
arrType == GL_POINT_SIZE_ARRAY_POINTER_OES ? GL_POINT_SIZE_ARRAY_OES :
|
||||||
|
0;
|
||||||
|
|
||||||
|
if(type != 0 && m_map.find(type) != m_map.end())
|
||||||
|
{
|
||||||
|
return m_map[type];
|
||||||
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,6 +279,17 @@ void GLEScontext::bindBuffer(GLenum target,GLuint buffer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GLEScontext::unbindBuffer(GLuint buffer) {
|
||||||
|
if(m_arrayBuffer == buffer)
|
||||||
|
{
|
||||||
|
m_arrayBuffer = 0;
|
||||||
|
}
|
||||||
|
if(m_elementBuffer == buffer)
|
||||||
|
{
|
||||||
|
m_elementBuffer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//checks if any buffer is binded to target
|
//checks if any buffer is binded to target
|
||||||
bool GLEScontext::isBindedBuffer(GLenum target) {
|
bool GLEScontext::isBindedBuffer(GLenum target) {
|
||||||
if(target == GL_ARRAY_BUFFER) {
|
if(target == GL_ARRAY_BUFFER) {
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public:
|
|||||||
const GLESpointer* getPointer(GLenum arrType);
|
const GLESpointer* getPointer(GLenum arrType);
|
||||||
virtual void convertArrs(GLESFloatArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) = 0;
|
virtual void convertArrs(GLESFloatArrays& fArrs,GLint first,GLsizei count,GLenum type,const GLvoid* indices,bool direct) = 0;
|
||||||
void bindBuffer(GLenum target,GLuint buffer);
|
void bindBuffer(GLenum target,GLuint buffer);
|
||||||
|
void unbindBuffer(GLuint buffer);
|
||||||
bool isBuffer(GLuint buffer);
|
bool isBuffer(GLuint buffer);
|
||||||
bool isBindedBuffer(GLenum target);
|
bool isBindedBuffer(GLenum target);
|
||||||
GLvoid* getBindedBuffer(GLenum target);
|
GLvoid* getBindedBuffer(GLenum target);
|
||||||
|
|||||||
@@ -25,5 +25,6 @@
|
|||||||
(d) < -32768.65535 ? -32768 * 65536 + 65535 : \
|
(d) < -32768.65535 ? -32768 * 65536 + 65535 : \
|
||||||
((GLfixed) ((d) * 65536)))
|
((GLfixed) ((d) * 65536)))
|
||||||
|
|
||||||
|
#define I2X(d) ((d)*65536)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user