[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