This patch is Reviewed-by: Ian Romanick <ian.d.roman...@intel.com>
On 08/04/2015 11:02 AM, Eduardo Lima Mitev wrote: > Argument validation for glTexSubImageXD is missing a check of format and type > against texture object's internal format when profile is OpenGL-ES 3.0+. > > This patch also groups together all format and type checks on GLES into a > new function texture_format_error_check_gles(), to factorize similar > code in texture_format_error_check(). > > Fixes 2 dEQP tests: > * dEQP-GLES3.functional.negative_api.texture.texsubimage2d > * dEQP-GLES3.functional.negative_api.texture.texsubimage3d > --- > src/mesa/main/teximage.c | 116 > ++++++++++++++++++++++++++++------------------- > 1 file changed, 69 insertions(+), 47 deletions(-) > > diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c > index d19ad64..fc69387 100644 > --- a/src/mesa/main/teximage.c > +++ b/src/mesa/main/teximage.c > @@ -2089,6 +2089,53 @@ texture_formats_agree(GLenum internalFormat, > } > > /** > + * Test the combination of format, type and internal format arguments of > + * different texture operations on GLES. > + * > + * \param ctx GL context. > + * \param format pixel data format given by the user. > + * \param type pixel data type given by the user. > + * \param internalFormat internal format given by the user. > + * \param dimensions texture image dimensions (must be 1, 2 or 3). > + * \param callerName name of the caller function to print in the error > message > + * > + * \return true if a error is found, false otherwise > + * > + * Currently, it is used by texture_error_check() and > texsubimage_error_check(). > + */ > +static bool > +texture_format_error_check_gles(struct gl_context *ctx, GLenum format, > + GLenum type, GLenum internalFormat, > + GLuint dimensions, const char *callerName) > +{ > + GLenum err; > + > + if (_mesa_is_gles3(ctx)) { > + err = _mesa_es3_error_check_format_and_type(ctx, format, type, > + internalFormat); > + if (err != GL_NO_ERROR) { > + _mesa_error(ctx, err, > + "%s(format = %s, type = %s, internalformat = %s)", > + callerName, _mesa_enum_to_string(format), > + _mesa_enum_to_string(type), > + _mesa_enum_to_string(internalFormat)); > + return true; > + } > + } > + else { > + err = _mesa_es_error_check_format_and_type(format, type, dimensions); > + if (err != GL_NO_ERROR) { > + _mesa_error(ctx, err, "%s(format = %s, type = %s)", > + callerName, _mesa_enum_to_string(format), > + _mesa_enum_to_string(type)); > + return true; > + } > + } > + > + return false; > +} > + > +/** > * Test the glTexImage[123]D() parameters for errors. > * > * \param ctx GL context. > @@ -2159,32 +2206,10 @@ texture_error_check( struct gl_context *ctx, > * Formats and types that require additional extensions (e.g., GL_FLOAT > * requires GL_OES_texture_float) are filtered elsewhere. > */ > - > - if (_mesa_is_gles(ctx)) { > - if (_mesa_is_gles3(ctx)) { > - err = _mesa_es3_error_check_format_and_type(ctx, format, type, > - internalFormat); > - } else { > - if (format != internalFormat) { > - _mesa_error(ctx, GL_INVALID_OPERATION, > - "glTexImage%dD(format = %s, internalFormat = %s)", > - dimensions, > - _mesa_enum_to_string(format), > - _mesa_enum_to_string(internalFormat)); > - return GL_TRUE; > - } > - > - err = _mesa_es_error_check_format_and_type(format, type, > dimensions); > - } > - if (err != GL_NO_ERROR) { > - _mesa_error(ctx, err, > - "glTexImage%dD(format = %s, type = %s, internalFormat = > %s)", > - dimensions, > - _mesa_enum_to_string(format), > - _mesa_enum_to_string(type), > - _mesa_enum_to_string(internalFormat)); > - return GL_TRUE; > - } > + if (_mesa_is_gles(ctx) && > + texture_format_error_check_gles(ctx, format, type, internalFormat, > + dimensions, "glTexImage%dD")) { > + return GL_TRUE; > } > > /* Check internalFormat */ > @@ -2493,19 +2518,12 @@ texsubimage_error_check(struct gl_context *ctx, > GLuint dimensions, > return GL_TRUE; > } > > - /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the > - * combinations of format and type that can be used. Formats and types > - * that require additional extensions (e.g., GL_FLOAT requires > - * GL_OES_texture_float) are filtered elsewhere. > - */ > - if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) { > - err = _mesa_es_error_check_format_and_type(format, type, dimensions); > - if (err != GL_NO_ERROR) { > - _mesa_error(ctx, err, "%s(format = %s, type = %s)", > - callerName, _mesa_enum_to_string(format), > - _mesa_enum_to_string(type)); > - return GL_TRUE; > - } > + texImage = _mesa_select_tex_image(texObj, target, level); > + if (!texImage) { > + /* non-existant texture level */ > + _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid texture image)", > + callerName); > + return GL_TRUE; > } > > err = _mesa_error_check_format_and_type(ctx, format, type); > @@ -2517,6 +2535,18 @@ texsubimage_error_check(struct gl_context *ctx, GLuint > dimensions, > return GL_TRUE; > } > > + /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the > + * combinations of format, internalFormat, and type that can be used. > + * Formats and types that require additional extensions (e.g., GL_FLOAT > + * requires GL_OES_texture_float) are filtered elsewhere. > + */ > + if (_mesa_is_gles(ctx) && > + texture_format_error_check_gles(ctx, format, type, > + texImage->InternalFormat, > + dimensions, callerName)) { > + return GL_TRUE; > + } > + > /* validate the bound PBO, if any */ > if (!_mesa_validate_pbo_source(ctx, dimensions, &ctx->Unpack, > width, height, depth, format, type, > @@ -2524,14 +2554,6 @@ texsubimage_error_check(struct gl_context *ctx, GLuint > dimensions, > return GL_TRUE; > } > > - texImage = _mesa_select_tex_image(texObj, target, level); > - if (!texImage) { > - /* non-existant texture level */ > - _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid texture image)", > - callerName); > - return GL_TRUE; > - } > - > if (error_check_subtexture_dimensions(ctx, dimensions, > texImage, xoffset, yoffset, zoffset, > width, height, depth, callerName)) { > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev