[Mesa-dev] [PATCH 1/2 v2] meta: use _mesa_prepare_mipmap_levels()

Brian Paul brianp at vmware.com
Wed Mar 30 00:00:29 UTC 2016


On 03/29/2016 05:44 PM, Ian Romanick wrote:
> From: Brian Paul <brianp at vmware.com>
>
> The prepare_mipmap_level() wrapper for _mesa_prepare_mipmap_level() is
> not needed.  It only served to undo the GL_TEXTURE_1D_ARRAY height/depth
> change was was made before the call to prepare_mipmap_level()
>
> Said another way, regardless of how the meta code manipulates the height/
> depth dims for GL_TEXTURE_1D_ARRAY, the gl_texture_image dimensions are
> correctly set up by _mesa_prepare_mipmap_levels().
>
> Tested by plugging _mesa_meta_GenerateMipmap() into the swrast driver
> and testing with piglit.
>
> v2 (idr): Early out of the mipmap generation loop with dstImage is NULL.
> This can occur for immutable textures that have a limited range of
> levels or in the presense of memory allocation failures.  Fixes
> arb_texture_view-mipgen on Intel platforms.
> ---
>   src/mesa/drivers/common/meta_generate_mipmap.c | 32 +++++++-------------------
>   1 file changed, 8 insertions(+), 24 deletions(-)
>
> diff --git a/src/mesa/drivers/common/meta_generate_mipmap.c b/src/mesa/drivers/common/meta_generate_mipmap.c
> index d4b7539..b81e179 100644
> --- a/src/mesa/drivers/common/meta_generate_mipmap.c
> +++ b/src/mesa/drivers/common/meta_generate_mipmap.c
> @@ -137,21 +137,6 @@ _mesa_meta_glsl_generate_mipmap_cleanup(struct gl_context *ctx,
>      _mesa_meta_blit_shader_table_cleanup(ctx, &mipmap->shaders);
>   }
>
> -static GLboolean
> -prepare_mipmap_level(struct gl_context *ctx,
> -                     struct gl_texture_object *texObj, GLuint level,
> -                     GLsizei width, GLsizei height, GLsizei depth,
> -                     GLenum intFormat, mesa_format format)
> -{
> -   if (texObj->Target == GL_TEXTURE_1D_ARRAY) {
> -      /* Work around Mesa expecting the number of array slices in "height". */
> -      height = depth;
> -      depth = 1;
> -   }
> -
> -   return _mesa_prepare_mipmap_level(ctx, texObj, level, width, height, depth,
> -                                     0, intFormat, format);
> -}
>
>   /**
>    * Called via ctx->Driver.GenerateMipmap()
> @@ -270,6 +255,8 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
>      /* texture is already locked, unlock now */
>      _mesa_unlock_texture(ctx, texObj);
>
> +   _mesa_prepare_mipmap_levels(ctx, texObj, baseLevel, maxLevel);
> +
>      for (dstLevel = baseLevel + 1; dstLevel <= maxLevel; dstLevel++) {
>         const struct gl_texture_image *srcImage;
>         struct gl_texture_image *dstImage;
> @@ -309,17 +296,14 @@ _mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target,
>         _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
>                                   (GLint *) &dstLevel, false);
>
> -      if (!prepare_mipmap_level(ctx, texObj, dstLevel,
> -                                dstWidth, dstHeight, dstDepth,
> -                                srcImage->InternalFormat,
> -                                srcImage->TexFormat)) {
> -         /* All done.  We either ran out of memory or we would go beyond the
> -          * last valid level of an immutable texture if we continued.
> -          */
> -         break;
> -      }
>         dstImage = _mesa_select_tex_image(texObj, faceTarget, dstLevel);
>
> +      /* All done.  We either ran out of memory or we would go beyond the last
> +       * valid level of an immutable texture if we continued.
> +       */
> +      if (dstImage == NULL)
> +         break;
> +
>         /* limit minification to src level */
>         _mesa_texture_parameteriv(ctx, texObj, GL_TEXTURE_MAX_LEVEL,
>                                   (GLint *) &srcLevel, false);
>

LGTM.  Thanks for testing & fixing.

Reviewed-by: Brian Paul <brianp at vmware.com>

I'll insert this into my series and push it soon.



More information about the mesa-dev mailing list