diff options
author | Ian Romanick <[email protected]> | 2012-07-26 19:18:58 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2012-08-23 10:15:31 -0700 |
commit | 409620e47748479aaef593dc9bec0d6dd520e14a (patch) | |
tree | ea178aa35db5e586e0161d1aa094fff3154be351 | |
parent | 0686ccac950bac1a650400b29c47ddaafea22fa9 (diff) |
mesa/es: Validate glTexImage format, type, and internalFormat in Mesa code rather than the ES wrapper
v2: Add proper GLES3 filtering.
v3: Collapse ALPHA, LUMINANCE, and LUMINANCE_ALPHA cases per review
comment from Ken.
Signed-off-by: Ian Romanick <[email protected]>
Reviewed-by: Kenneth Graunke <[email protected]>
Reviewed-by: Jordan Justen <[email protected]>
-rw-r--r-- | src/mesa/main/APIspec.xml | 203 | ||||
-rw-r--r-- | src/mesa/main/teximage.c | 94 | ||||
-rw-r--r-- | src/mesa/main/teximage.h | 4 |
3 files changed, 98 insertions, 203 deletions
diff --git a/src/mesa/main/APIspec.xml b/src/mesa/main/APIspec.xml index 1c5be8c2eba..ffc384c8756 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 d9f0c7d84b5..e22881ce6c9 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 @@ -1552,6 +1558,68 @@ 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: + case GL_LUMINANCE: + case GL_LUMINANCE_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_DEPTH_COMPONENT: + /* This format is filtered against invalid dimensionalities elsewhere. + */ + type_valid = (type == GL_UNSIGNED_SHORT + || type == GL_UNSIGNED_INT); + break; + + case GL_DEPTH_STENCIL: + /* This format is filtered against invalid dimensionalities elsewhere. + */ + type_valid = (type == GL_UNSIGNED_INT_24_8); + break; + + case GL_BGRA_EXT: + type_valid = (type == GL_UNSIGNED_BYTE); + + /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but + * the format does not appear to be allowed for 3D textures in OpenGL + * ES. + */ + if (dimensions != 2) + return GL_INVALID_VALUE; + + break; + + default: + return GL_INVALID_VALUE; + } + + return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION; +} /** * Test the glTexImage[123]D() parameters for errors. @@ -1623,6 +1691,32 @@ texture_error_check( struct gl_context *ctx, 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) && !_mesa_is_gles3(ctx)) { + if (format != internalFormat) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glTexImage%dD(format = %s, internalFormat = %s)", + dimensions, + _mesa_lookup_enum_by_nr(format), + _mesa_lookup_enum_by_nr(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)", + dimensions, + _mesa_lookup_enum_by_nr(format), + _mesa_lookup_enum_by_nr(type)); + return GL_TRUE; + } + } + /* Do this simple check before calling the TestProxyTexImage() function */ if (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { sizeOK = (width == height); diff --git a/src/mesa/main/teximage.h b/src/mesa/main/teximage.h index 66a0c88950b..739c5dda132 100644 --- a/src/mesa/main/teximage.h +++ b/src/mesa/main/teximage.h @@ -140,6 +140,10 @@ _mesa_tex_target_to_face(GLenum target); extern GLint _mesa_get_texture_dimensions(GLenum target); +extern GLenum +_mesa_es_error_check_format_and_type(GLenum format, GLenum type, + unsigned dimensions); + /** * Lock a texture for updating. See also _mesa_lock_context_textures(). */ |