[Mesa-dev] [PATCH 3/3] mesa: do more thorough target checking in compressed_subtexture_target_check()
Roland Scheidegger
sroland at vmware.com
Thu Jul 23 07:26:27 PDT 2015
Am 23.07.2015 um 15:57 schrieb Brian Paul:
> When we're error-checking the target, we also need to check if the
> corresponding extension is supported.
> ---
> src/mesa/main/teximage.c | 67 +++++++++++++++++++++++++++++-------------------
> 1 file changed, 41 insertions(+), 26 deletions(-)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 0726758..11eca5e 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -4555,13 +4555,16 @@ compressed_subtexture_target_check(struct gl_context *ctx, GLenum target,
> case 2:
> switch (target) {
> case GL_TEXTURE_2D:
> + targetOK = GL_TRUE;
> + break;
> case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
> case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
> case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
> case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
> case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
> case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
> - targetOK = GL_TRUE;
> + targetOK = _mesa_is_desktop_gl(ctx)
> + && ctx->Extensions.ARB_texture_cube_map;
Why isn't this valid for ES?
> break;
> default:
> targetOK = GL_FALSE;
> @@ -4569,31 +4572,40 @@ compressed_subtexture_target_check(struct gl_context *ctx, GLenum target,
> }
> break;
> case 3:
> - targetOK = (target == GL_TEXTURE_3D) ||
> - (target == GL_TEXTURE_2D_ARRAY) ||
> - (target == GL_TEXTURE_CUBE_MAP_ARRAY) ||
> - (target == GL_TEXTURE_CUBE_MAP && dsa);
> -
> - /* OpenGL 4.5 spec (30.10.2014) says in Section 8.7 Compressed Texture
> - * Images:
> - * "An INVALID_OPERATION error is generated by
> - * CompressedTex*SubImage3D if the internal format of the texture is
> - * one of the EAC, ETC2, or RGTC formats and either border is
> - * non-zero, or the effective target for the texture is not
> - * TEXTURE_2D_ARRAY."
> - *
> - * NOTE: that's probably a spec error. It should probably say
> - * "... or the effective target for the texture is not
> - * TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, nor GL_TEXTURE_CUBE_MAP_ARRAY."
> - * since those targets are 2D images and they support all compression
> - * formats.
> - *
> - * Instead of listing all these, just list those which are allowed,
> - * which is (at this time) only bptc. Otherwise we'd say s3tc (and more)
> - * are valid here, which they are not, but of course not mentioned by
> - * core spec.
> - */
> - if (target == GL_TEXTURE_3D) {
> + switch (target) {
> + case GL_TEXTURE_CUBE_MAP:
> + targetOK = dsa && ctx->Extensions.ARB_texture_cube_map;
I think technically the ARB_texture_cube_map check wouldn't be
necessary, since dsa implies support for it. Should't hurt though...
> + break;
> + case GL_TEXTURE_2D_ARRAY:
> + targetOK = _mesa_is_gles3(ctx) ||
> + (_mesa_is_desktop_gl(ctx) && ctx->Extensions.EXT_texture_array);
> + break;
> + case GL_TEXTURE_CUBE_MAP_ARRAY:
> + targetOK = ctx->Extensions.ARB_texture_cube_map_array;
> + break;
> + case GL_TEXTURE_3D:
> + targetOK = GL_TRUE;
> + /*
> + * OpenGL 4.5 spec (30.10.2014) says in Section 8.7 Compressed Texture
> + * Images:
> + * "An INVALID_OPERATION error is generated by
> + * CompressedTex*SubImage3D if the internal format of the texture
> + * is one of the EAC, ETC2, or RGTC formats and either border is
> + * non-zero, or the effective target for the texture is not
> + * TEXTURE_2D_ARRAY."
> + *
> + * NOTE: that's probably a spec error. It should probably say
> + * "... or the effective target for the texture is not
> + * TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, nor
> + * GL_TEXTURE_CUBE_MAP_ARRAY."
> + * since those targets are 2D images and they support all compression
> + * formats.
> + *
> + * Instead of listing all these, just list those which are allowed,
> + * which is (at this time) only bptc. Otherwise we'd say s3tc (and
> + * more) are valid here, which they are not, but of course not
> + * mentioned by core spec.
> + */
> switch (format) {
> /* These are the only 3D compression formats supported at this time */
> case GL_COMPRESSED_RGBA_BPTC_UNORM:
> @@ -4610,6 +4622,9 @@ compressed_subtexture_target_check(struct gl_context *ctx, GLenum target,
> _mesa_enum_to_string(format));
> return GL_TRUE;
> }
> + break;
> + default:
> + targetOK = GL_FALSE;
> }
>
> break;
>
Otherwise, and for the rest of the series,
Reviewed-by: Roland Scheidegger <sroland at vmware.com>
More information about the mesa-dev
mailing list