[Mesa-dev] [PATCH 14/18] mesa/es: Validate glTexImage format, type, and internalFormat in Mesa code rather than the ES wrapper

Kenneth Graunke kenneth at whitecape.org
Mon Aug 20 22:53:09 PDT 2012


On 08/20/2012 05:06 PM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> v2: Add proper GLES3 filtering.
> 
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/mesa/main/APIspec.xml |  203 ---------------------------------------------
>  src/mesa/main/teximage.c  |  104 +++++++++++++++++++++++
>  src/mesa/main/teximage.h  |    4 +
>  3 files changed, 108 insertions(+), 203 deletions(-)
> 
> diff --git a/src/mesa/main/APIspec.xml b/src/mesa/main/APIspec.xml
> index 1c5be8c..ffc384c 100644
> --- a/src/mesa/main/APIspec.xml
> +++ b/src/mesa/main/APIspec.xml
> @@ -241,148 +241,6 @@
>  		<param name="type" type="GLenum"/>
>  		<param name="pixels" type="const GLvoid *"/>
>  	</proto>
> -
> -	<desc name="internalFormat">
> -		<value name="GL_ALPHA"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_ALPHA"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="internalFormat">
> -		<value name="GL_RGB"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_RGB"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="internalFormat">
> -		<value name="GL_RGBA"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_RGBA"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="internalFormat">
> -		<value name="GL_LUMINANCE"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_LUMINANCE"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="internalFormat">
> -		<value name="GL_LUMINANCE_ALPHA"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_LUMINANCE_ALPHA"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="internalFormat" category="OES_depth_texture">
> -		<value name="GL_DEPTH_COMPONENT"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_DEPTH_COMPONENT"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="internalFormat" category="OES_packed_depth_stencil">
> -		<value name="GL_DEPTH_STENCIL_OES"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_DEPTH_STENCIL_OES"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="internalFormat" category="EXT_texture_format_BGRA8888">
> -		<value name="GL_BGRA_EXT"/>
> -
> -		<desc name="format" error="GL_INVALID_VALUE">
> -			<value name="GL_BGRA_EXT"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_ALPHA"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_RGB"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_UNSIGNED_SHORT_5_6_5"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_RGBA"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_UNSIGNED_SHORT_4_4_4_4"/>
> -			<value name="GL_UNSIGNED_SHORT_5_5_5_1"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -			<value name="GL_UNSIGNED_INT_2_10_10_10_REV_EXT" category="EXT_texture_type_2_10_10_10_REV"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_LUMINANCE"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_LUMINANCE_ALPHA"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format" category="OES_depth_texture">
> -		<value name="GL_DEPTH_COMPONENT"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_SHORT"/>
> -			<value name="GL_UNSIGNED_INT"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format" category="OES_packed_depth_stencil">
> -		<value name="GL_DEPTH_STENCIL_OES"/>
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_INT_24_8_OES"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format" category="EXT_texture_format_BGRA8888">
> -		<value name="GL_BGRA_EXT"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -		</desc>
> -	</desc>
>  </template>
>  
>  <template name="TexEnv">
> @@ -1749,67 +1607,6 @@
>  		<param name="pixels" type="const GLvoid *"/>
>  	</proto>
>  
> -	<desc name="internalFormat">
> -		<value name="GL_ALPHA"/>
> -		<value name="GL_RGB"/>
> -		<value name="GL_RGBA"/>
> -		<value name="GL_LUMINANCE"/>
> -		<value name="GL_LUMINANCE_ALPHA"/>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_ALPHA"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_RGB"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_UNSIGNED_SHORT_5_6_5"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_RGBA"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_UNSIGNED_SHORT_4_4_4_4"/>
> -			<value name="GL_UNSIGNED_SHORT_5_5_5_1"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -			<value name="GL_UNSIGNED_INT_2_10_10_10_REV_EXT" category="EXT_texture_type_2_10_10_10_REV"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_LUMINANCE"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
> -
> -	<desc name="format">
> -		<value name="GL_LUMINANCE_ALPHA"/>
> -
> -		<desc name="type" error="GL_INVALID_OPERATION">
> -			<value name="GL_UNSIGNED_BYTE"/>
> -			<value name="GL_FLOAT" category="OES_texture_float"/>
> -			<value name="GL_HALF_FLOAT_OES" category="OES_texture_half_float"/>
> -		</desc>
> -	</desc>
>  </template>
>  
>  <template name="TexSubImage3D">
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 679cf5c..9c97e60 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -50,6 +50,12 @@
>  #include "glformats.h"
>  
>  
> +/* Inexplicably, GL_HALF_FLOAT_OES has a different value than GL_HALF_FLOAT.
> + */
> +#ifndef GL_HALF_FLOAT_OES
> +#define GL_HALF_FLOAT_OES 0x8D61
> +#endif
> +
>  /**
>   * State changes which we care about for glCopyTex[Sub]Image() calls.
>   * In particular, we care about pixel transfer state and buffer state
> @@ -1578,6 +1584,78 @@ mutable_tex_object(struct gl_context *ctx, GLenum target)
>  }
>  
>  
> +GLenum
> +_mesa_es_error_check_format_and_type(GLenum format, GLenum type,
> +                                     unsigned dimensions)
> +{
> +   bool type_valid = true;
> +
> +   switch (format) {
> +   case GL_ALPHA:
> +      type_valid = (type == GL_UNSIGNED_BYTE
> +                    || type == GL_FLOAT
> +                    || type == GL_HALF_FLOAT_OES);
> +      break;
> +
> +   case GL_RGB:
> +      type_valid = (type == GL_UNSIGNED_BYTE
> +                    || type == GL_UNSIGNED_SHORT_5_6_5
> +                    || type == GL_FLOAT
> +                    || type == GL_HALF_FLOAT_OES);
> +      break;
> +
> +   case GL_RGBA:
> +      type_valid = (type == GL_UNSIGNED_BYTE
> +                    || type == GL_UNSIGNED_SHORT_4_4_4_4
> +                    || type == GL_UNSIGNED_SHORT_5_5_5_1
> +                    || type == GL_FLOAT
> +                    || type == GL_HALF_FLOAT_OES
> +                    || type == GL_UNSIGNED_INT_2_10_10_10_REV);
> +      break;
> +
> +   case GL_LUMINANCE:
> +      type_valid = (type == GL_UNSIGNED_BYTE
> +                    || type == GL_FLOAT
> +                    || type == GL_HALF_FLOAT_OES);
> +      break;
> +
> +   case GL_LUMINANCE_ALPHA:
> +      type_valid = (type == GL_UNSIGNED_BYTE
> +                    || type == GL_FLOAT
> +                    || type == GL_HALF_FLOAT_OES);
> +      break;

You could actually coalesce the L and LA cases here, if you like.  A bit
less code.  But either way.


More information about the mesa-dev mailing list