[Mesa-dev] [PATCH 1/2] mesa: fix glTexImage proxy texture error generation

Anuj Phogat anuj.phogat at gmail.com
Wed Aug 22 16:21:10 PDT 2012


On Tue, Aug 21, 2012 at 7:28 PM, Brian Paul <brianp at vmware.com> wrote:
> When calling glTexImage() with a proxy target most error conditions should
> generate a GL error.  We were erroneously doing the proxy-error behaviour
> (where we zeroed-out the image's width/height/depth/format fields) in too
> many places.
>
> There's another issue with proxy textures, but that'll be fixed in the
> next patch.
> ---
>  src/mesa/main/teximage.c |   95 +++++++++++++++++++++-------------------------
>  1 files changed, 43 insertions(+), 52 deletions(-)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 27294ba..95efa70 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -1579,12 +1579,17 @@ texture_error_check( struct gl_context *ctx,
>      */
>     const GLboolean indexFormat = (format == GL_COLOR_INDEX);
>
> +   /* Note: for proxy textures, some error conditions immediately generate
> +    * a GL error in the usual way.  But others do not generate a GL error.
> +    * Instead, they cause the width, height, depth, format fields of the
> +    * texture image to be zeroed-out.  The GL spec seems to indicate that the
> +    * zero-out behaviour is only used in cases related to memory allocation.
> +    */
> +
>     /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */
>     if (level < 0 || level >= MAX_TEXTURE_LEVELS) {
> -      if (!isProxy) {
> -         _mesa_error(ctx, GL_INVALID_VALUE,
> -                     "glTexImage%dD(level=%d)", dimensions, level);
> -      }
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glTexImage%dD(level=%d)", dimensions, level);
>        return GL_TRUE;
>     }
>
> @@ -1592,18 +1597,14 @@ texture_error_check( struct gl_context *ctx,
>     if (border < 0 || border > 1 ||
>         ((target == GL_TEXTURE_RECTANGLE_NV ||
>           target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) {
> -      if (!isProxy) {
> -         _mesa_error(ctx, GL_INVALID_VALUE,
> -                     "glTexImage%dD(border=%d)", dimensions, border);
> -      }
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glTexImage%dD(border=%d)", dimensions, border);
>        return GL_TRUE;
>     }
>
>     if (width < 0 || height < 0 || depth < 0) {
> -      if (!isProxy) {
> -         _mesa_error(ctx, GL_INVALID_VALUE,
> -                     "glTexImage%dD(width, height or depth < 0)", dimensions);
> -      }
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glTexImage%dD(width, height or depth < 0)", dimensions);
>        return GL_TRUE;
>     }
>
> @@ -1631,22 +1632,18 @@ texture_error_check( struct gl_context *ctx,
>
>     /* Check internalFormat */
>     if (_mesa_base_tex_format(ctx, internalFormat) < 0) {
> -      if (!isProxy) {
> -         _mesa_error(ctx, GL_INVALID_VALUE,
> -                     "glTexImage%dD(internalFormat=%s)",
> -                     dimensions, _mesa_lookup_enum_by_nr(internalFormat));
> -      }
> +      _mesa_error(ctx, GL_INVALID_VALUE,
> +                  "glTexImage%dD(internalFormat=%s)",
> +                  dimensions, _mesa_lookup_enum_by_nr(internalFormat));
>        return GL_TRUE;
>     }
>
>     /* Check incoming image format and type */
>     err = _mesa_error_check_format_and_type(ctx, format, type);
>     if (err != GL_NO_ERROR) {
> -      if (!isProxy) {
> -         _mesa_error(ctx, err,
> -                     "glTexImage%dD(incompatible format 0x%x, type 0x%x)",
> -                     dimensions, format, type);
> -      }
> +      _mesa_error(ctx, err,
> +                  "glTexImage%dD(incompatible format 0x%x, type 0x%x)",
> +                  dimensions, format, type);
>        return GL_TRUE;
>     }
>
> @@ -1657,10 +1654,9 @@ texture_error_check( struct gl_context *ctx,
>         (_mesa_is_ycbcr_format(internalFormat) != _mesa_is_ycbcr_format(format)) ||
>         (_mesa_is_depthstencil_format(internalFormat) != _mesa_is_depthstencil_format(format)) ||
>         (_mesa_is_dudv_format(internalFormat) != _mesa_is_dudv_format(format))) {
> -      if (!isProxy)
> -         _mesa_error(ctx, GL_INVALID_OPERATION,
> -                     "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)",
> -                     dimensions, internalFormat, format);
> +      _mesa_error(ctx, GL_INVALID_OPERATION,
> +                  "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)",
> +                  dimensions, internalFormat, format);
>        return GL_TRUE;
>     }
>
> @@ -1671,7 +1667,8 @@ texture_error_check( struct gl_context *ctx,
>            type != GL_UNSIGNED_SHORT_8_8_REV_MESA) {
>           char message[100];
>           _mesa_snprintf(message, sizeof(message),
> -                        "glTexImage%dD(format/type YCBCR mismatch", dimensions);
> +                        "glTexImage%dD(format/type YCBCR mismatch)",
> +                        dimensions);
>           _mesa_error(ctx, GL_INVALID_ENUM, "%s", message);
>           return GL_TRUE; /* error */
>        }
> @@ -1679,18 +1676,17 @@ texture_error_check( struct gl_context *ctx,
>            target != GL_PROXY_TEXTURE_2D &&
>            target != GL_TEXTURE_RECTANGLE_NV &&
>            target != GL_PROXY_TEXTURE_RECTANGLE_NV) {
> -         if (!isProxy)
> -            _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage(target)");
> +         _mesa_error(ctx, GL_INVALID_ENUM,
> +                     "glTexImage%dD(bad target for YCbCr texture)",
> +                     dimensions);
>           return GL_TRUE;
>        }
>        if (border != 0) {
> -         if (!isProxy) {
> -            char message[100];
> -            _mesa_snprintf(message, sizeof(message),
> -                           "glTexImage%dD(format=GL_YCBCR_MESA and border=%d)",
> -                           dimensions, border);
> -            _mesa_error(ctx, GL_INVALID_VALUE, "%s", message);
> -         }
> +         char message[100];
> +         _mesa_snprintf(message, sizeof(message),
> +                        "glTexImage%dD(format=GL_YCBCR_MESA and border=%d)",
> +                        dimensions, border);
> +         _mesa_error(ctx, GL_INVALID_VALUE, "%s", message);
>           return GL_TRUE;
>        }
>     }
> @@ -1711,9 +1707,9 @@ texture_error_check( struct gl_context *ctx,
>            target != GL_PROXY_TEXTURE_RECTANGLE_ARB &&
>           !((_mesa_is_cube_face(target) || target == GL_PROXY_TEXTURE_CUBE_MAP) &&
>             (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))) {
> -         if (!isProxy)
> -            _mesa_error(ctx, GL_INVALID_ENUM,
> -                        "glTexImage(target/internalFormat)");
> +         _mesa_error(ctx, GL_INVALID_ENUM,
> +                     "glTexImage%dD(bad target for depth texture)",
> +                     dimensions);
>           return GL_TRUE;
>        }
>     }
> @@ -1721,21 +1717,18 @@ texture_error_check( struct gl_context *ctx,
>     /* additional checks for compressed textures */
>     if (_mesa_is_compressed_format(ctx, internalFormat)) {
>        if (!target_can_be_compressed(ctx, target, internalFormat)) {
> -         if (!isProxy)
> -            _mesa_error(ctx, GL_INVALID_ENUM,
> -                        "glTexImage%dD(target)", dimensions);
> +         _mesa_error(ctx, GL_INVALID_ENUM,
> +                     "glTexImage%dD(target can't be compressed)", dimensions);
>           return GL_TRUE;
>        }
>        if (compressedteximage_only_format(ctx, internalFormat)) {
>           _mesa_error(ctx, GL_INVALID_OPERATION,
> -               "glTexImage%dD(no compression for format)", dimensions);
> +                     "glTexImage%dD(no compression for format)", dimensions);
>           return GL_TRUE;
>        }
>        if (border != 0) {
> -         if (!isProxy) {
> -            _mesa_error(ctx, GL_INVALID_OPERATION,
> -                        "glTexImage%dD(border!=0)", dimensions);
> -         }
> +         _mesa_error(ctx, GL_INVALID_OPERATION,
> +                     "glTexImage%dD(border!=0)", dimensions);
>           return GL_TRUE;
>        }
>     }
> @@ -1744,11 +1737,9 @@ texture_error_check( struct gl_context *ctx,
>     if ((ctx->Version >= 30 || ctx->Extensions.EXT_texture_integer) &&
>         (_mesa_is_enum_format_integer(format) !=
>          _mesa_is_enum_format_integer(internalFormat))) {
> -      if (!isProxy) {
> -         _mesa_error(ctx, GL_INVALID_OPERATION,
> -                     "glTexImage%dD(integer/non-integer format mismatch)",
> -                     dimensions);
> -      }
> +      _mesa_error(ctx, GL_INVALID_OPERATION,
> +                  "glTexImage%dD(integer/non-integer format mismatch)",
> +                  dimensions);
>        return GL_TRUE;
>     }
>
> --
> 1.7.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list