[Mesa-dev] [PATCH] mesa: Fix glCompressedTexImage when dstRowStride != srcRowStride.

Kenneth Graunke kenneth at whitecape.org
Wed Nov 30 15:01:49 PST 2011


On 11/30/2011 01:35 PM, Eric Anholt wrote:
> Since the MapTextureImage changes on Intel, nwn had corruption in the
> scrollbar at the load game menu, and corrupted ground textures in the
> starting zone.
> 
> The issue was this code now seeing dstRowStride aligned to hardware
> requirements instead of a temporary buffer that gets uploaded to
> hardware later.  The existing code was just trying to memcpy
> srcRowStride * height / bh, while the glCompressedTexSubImage2D()
> storage code nearby did the correct walking by blockheight rows at a
> time.  Just reuse the subimage upload instead of duplicating that
> logic.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41451
> ---
> 
> (a piglit test is in progress for this, but not finished yet
> because I really want to cover all the compressed formats at once)
> 
>  src/mesa/main/texstore.c |   32 ++++++--------------------------
>  1 files changed, 6 insertions(+), 26 deletions(-)
>
> diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
> index 0079590..424e258 100644
> --- a/src/mesa/main/texstore.c
> +++ b/src/mesa/main/texstore.c
> @@ -5015,9 +5015,6 @@ _mesa_store_compressed_teximage2d(struct gl_context *ctx,
>                                    struct gl_texture_object *texObj,
>                                    struct gl_texture_image *texImage)
>  {
> -   GLubyte *dstMap;
> -   GLint dstRowStride;
> -
>     /* This is pretty simple, basically just do a memcpy without worrying
>      * about the usual image unpacking or image transfer operations.
>      */
> @@ -5034,29 +5031,12 @@ _mesa_store_compressed_teximage2d(struct gl_context *ctx,
>        return;
>     }
>  
> -   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
> -                                                 &ctx->Unpack,
> -                                                 "glCompressedTexImage2D");
> -   if (!data)
> -      return;
> -
> -
> -   /* Map dest texture buffer (write to whole region) */
> -   ctx->Driver.MapTextureImage(ctx, texImage, 0,
> -                               0, 0, width, height,
> -                               GL_MAP_WRITE_BIT,
> -                               &dstMap, &dstRowStride);
> -   if (dstMap) {
> -      /* copy the data */
> -      memcpy(dstMap, data, imageSize);
> -
> -      ctx->Driver.UnmapTextureImage(ctx, texImage, 0);
> -   }
> -   else {
> -      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");
> -   }
> -
> -   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
> +   _mesa_store_compressed_texsubimage2d(ctx, target, level,
> +					0, 0,
> +					width, height,
> +					texImage->TexFormat,
> +					imageSize, data,
> +					texObj, texImage);
>  }

Looks good to me.  Kudos for finding this!

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>


More information about the mesa-dev mailing list