[Mesa-dev] [PATCH] mesa: handle array textures in strip_texture_border()

Anuj Phogat anuj.phogat at gmail.com
Mon Mar 5 19:42:14 PST 2012


On Wed 29 Feb 2012 07:36:21 PM PST, Brian Paul wrote:
> If the texture is a 1D array, don't remove the border pixel from the
> height.  Similarly for 2D array textures and the depth direction.
> Simplify the function by assuming the border is always one pixel.
> ---
>  src/mesa/main/teximage.c |   37 ++++++++++++++++++++-----------------
>  1 files changed, 20 insertions(+), 17 deletions(-)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 4fb81e6..29d1d36 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -2422,7 +2422,7 @@ _mesa_choose_texture_format(struct gl_context *ctx,
>  
>  /**
>   * Adjust pixel unpack params and image dimensions to strip off the
> - * texture border.
> + * one-pixel texture border.
>   *
>   * Gallium and intel don't support texture borders.  They've seldem been used
>   * and seldom been implemented correctly anyway.
> @@ -2430,34 +2430,37 @@ _mesa_choose_texture_format(struct gl_context *ctx,
>   * \param unpackNew returns the new pixel unpack parameters
>   */
>  static void
> -strip_texture_border(GLint *border,
> +strip_texture_border(GLenum target,
>                       GLint *width, GLint *height, GLint *depth,
>                       const struct gl_pixelstore_attrib *unpack,
>                       struct gl_pixelstore_attrib *unpackNew)
>  {
> -   assert(*border > 0);  /* sanity check */
> +   assert(width);
> +   assert(height);
> +   assert(depth);
>  
>     *unpackNew = *unpack;
>  
>     if (unpackNew->RowLength == 0)
>        unpackNew->RowLength = *width;
>  
> -   if (depth && unpackNew->ImageHeight == 0)
> +   if (unpackNew->ImageHeight == 0)
>        unpackNew->ImageHeight = *height;
>  
> -   unpackNew->SkipPixels += *border;
> -   if (height)
> -      unpackNew->SkipRows += *border;
> -   if (depth)
> -      unpackNew->SkipImages += *border;
> -
>     assert(*width >= 3);
> -   *width = *width - 2 * *border;
> -   if (height && *height >= 3)
> -      *height = *height - 2 * *border;
> -   if (depth && *depth >= 3)
> -      *depth = *depth - 2 * *border;
> -   *border = 0;
> +   unpackNew->SkipPixels++;  /* skip the border */
> +   *width = *width - 2;      /* reduce the width by two border pixels */
> +
> +   /* The min height of a texture with a border is 3 */
> +   if (*height >= 3 && target != GL_TEXTURE_1D_ARRAY) {
> +      unpackNew->SkipRows++;  /* skip the border */
> +      *height = *height - 2;  /* reduce the height by two border pixels */
> +   }
> +
> +   if (*depth >= 3 && target != GL_TEXTURE_2D_ARRAY) {
> +      unpackNew->SkipImages++;  /* skip the border */
> +      *depth = *depth - 2;      /* reduce the depth by two border pixels */
> +   }
>  }
>  
>  /**
> @@ -2542,7 +2545,7 @@ teximage(struct gl_context *ctx, GLuint dims,
>         * rarely-tested software fallback rendering.
>         */
>        if (border && ctx->Const.StripTextureBorder) {
> -	 strip_texture_border(&border, &width, &height, &depth, unpack,
> +	 strip_texture_border(target, &width, &height, &depth, unpack,
>  			      &unpack_no_border);
border value should be set to zero after this call. I'm getting 
assertion failure in piglit
texture-border test (under review) without that:
texture-border: intel_tex.c:64: intel_alloc_texture_image_buffer: 
Assertion `image->Border == 0' failed.
>  	 unpack = &unpack_no_border;
>        }

Apart from above issue this patch looks cleaner than mine.
After above fix this patch is:
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>



More information about the mesa-dev mailing list