[Mesa-dev] [PATCH 05/11] mesa: Validate internal format and format type first to provide accurate error code

Anuj Phogat anuj.phogat at gmail.com
Tue Jan 20 18:26:33 PST 2015


On Mon, Jan 19, 2015 at 3:32 AM, Eduardo Lima Mitev <elima at igalia.com> wrote:
> The specification states that glTexImage2D and glTexImage3D should return
> GL_INVALID_VALUE if the internal format is invalid, and GL_INVALID_ENUM is
> the format type is invalid. However, current error check only considers the
> combination of format, type and internal format; which returns a
> GL_INVALID_OPERATION error when invalid.
>
I did a quick search in es 3.0.4 spec but couldn't find the reference. Could you
point me to the reference in the spec and may be add it as a comment in the
code?

> Fixes 2 dEQP tests:
> * dEQP-GLES3.functional.negative_api.texture.teximage2d
> * dEQP-GLES3.functional.negative_api.texture.teximage3d
> ---
>  src/mesa/main/glformats.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 114 insertions(+)
>
> diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c
> index 06f9aaf..5cec90d 100644
> --- a/src/mesa/main/glformats.c
> +++ b/src/mesa/main/glformats.c
> @@ -2012,6 +2012,112 @@ _mesa_es_error_check_format_and_type(GLenum format, GLenum type,
>     return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION;
>  }
>
> +/**
> + * Check that internal format is a valid enum for OpenGL ES 3.
> + * \return TRUE if valid, FALSE otherwise.
> + */
> +static GLboolean
> +_mesa_es3_is_valid_internal_format(GLenum internalFormat)
> +{
> +   switch (internalFormat) {
> +   case GL_RGB:
> +   case GL_RGBA:
> +   case GL_LUMINANCE_ALPHA:
> +   case GL_LUMINANCE:
> +   case GL_ALPHA:
> +   case GL_R8:
> +   case GL_R8_SNORM:
> +   case GL_R16F:
> +   case GL_R32F:
> +   case GL_R8UI:
> +   case GL_R8I:
> +   case GL_R16UI:
> +   case GL_R16I:
> +   case GL_R32UI:
> +   case GL_R32I:
> +   case GL_RG8:
> +   case GL_RG8_SNORM:
> +   case GL_RG16F:
> +   case GL_RG32F:
> +   case GL_RG8UI:
> +   case GL_RG8I:
> +   case GL_RG16UI:
> +   case GL_RG16I:
> +   case GL_RG32UI:
> +   case GL_RG32I:
> +   case GL_RGB8:
> +   case GL_SRGB8:
> +   case GL_RGB565:
> +   case GL_RGB8_SNORM:
> +   case GL_R11F_G11F_B10F:
> +   case GL_RGB9_E5:
> +   case GL_RGB16F:
> +   case GL_RGB32F:
> +   case GL_RGB8UI:
> +   case GL_RGB8I:
> +   case GL_RGB16UI:
> +   case GL_RGB16I:
> +   case GL_RGB32UI:
> +   case GL_RGB32I:
> +   case GL_RGBA8:
> +   case GL_SRGB8_ALPHA8:
> +   case GL_RGBA8_SNORM:
> +   case GL_RGB5_A1:
> +   case GL_RGBA4:
> +   case GL_RGB10_A2:
> +   case GL_RGBA16F:
> +   case GL_RGBA32F:
> +   case GL_RGBA8UI:
> +   case GL_RGBA8I:
> +   case GL_RGB10_A2UI:
> +   case GL_RGBA16UI:
> +   case GL_RGBA16I:
> +   case GL_RGBA32I:
> +   case GL_RGBA32UI:
> +   case GL_DEPTH_COMPONENT16:
> +   case GL_DEPTH_COMPONENT24:
> +   case GL_DEPTH_COMPONENT32F:
> +   case GL_DEPTH24_STENCIL8:
> +   case GL_DEPTH32F_STENCIL8:
> +      break;
> +   default:
> +      return GL_FALSE;
> +   }
> +
> +   return GL_TRUE;
> +}
> +
> +/**
> + * Check that format type is a valid enum for OpenGL ES 3.
> + * \return TRUE if valid, FALSE otherwise.
> + */
> +static GLboolean
> +_mesa_es3_is_valid_format_type(GLenum type)
> +{
> +   switch (type) {
> +   case GL_UNSIGNED_BYTE:
> +   case GL_UNSIGNED_SHORT_5_6_5:
> +   case GL_UNSIGNED_SHORT_4_4_4_4:
> +   case GL_UNSIGNED_SHORT_5_5_5_1:
> +   case GL_BYTE:
> +   case GL_HALF_FLOAT:
> +   case GL_FLOAT:
> +   case GL_UNSIGNED_SHORT:
> +   case GL_SHORT:
> +   case GL_UNSIGNED_INT:
> +   case GL_INT:
> +   case GL_UNSIGNED_INT_10F_11F_11F_REV:
> +   case GL_UNSIGNED_INT_5_9_9_9_REV:
> +   case GL_UNSIGNED_INT_2_10_10_10_REV:
> +   case GL_UNSIGNED_INT_24_8:
> +   case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
> +      break;
> +   default:
> +      return GL_FALSE;
> +   }
> +
> +   return GL_TRUE;
> +}
>
>  /**
>   * Do error checking of format/type combinations for OpenGL ES 3
> @@ -2022,6 +2128,14 @@ GLenum
>  _mesa_es3_error_check_format_and_type(GLenum format, GLenum type,
>                                        GLenum internalFormat)
>  {
> +   if (!_mesa_es3_is_valid_format_type(type)) {
> +      return GL_INVALID_ENUM;
> +   }
> +
> +   if (!_mesa_es3_is_valid_internal_format(internalFormat)) {
> +      return GL_INVALID_VALUE;
> +   }
> +
>     switch (format) {
>     case GL_RGBA:
>        switch (type) {
> --
> 2.1.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list