[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