Mesa (master): mesa: Fix glCompressedTexImage when dstRowStride != srcRowStride.

Eric Anholt anholt at kemper.freedesktop.org
Fri Dec 2 23:40:52 UTC 2011


Module: Mesa
Branch: master
Commit: bda361e0d47a670f318664abcdf0a065bef22883
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=bda361e0d47a670f318664abcdf0a065bef22883

Author: Eric Anholt <eric at anholt.net>
Date:   Wed Nov 30 12:04:14 2011 -0800

mesa: Fix glCompressedTexImage when dstRowStride != srcRowStride.

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.  Heroes of Newerth's intro screen was also thoroughly
garbled.  A new piglit test "compressedteximage" was created to
regression test this.

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.

v2: Update comment at the top of the function (suggestion by Joel
Forsberg)

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41451
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org> (v1)

---

 src/mesa/main/texstore.c |   37 +++++++++----------------------------
 1 files changed, 9 insertions(+), 28 deletions(-)

diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
index 7c4e08c..237f920 100644
--- a/src/mesa/main/texstore.c
+++ b/src/mesa/main/texstore.c
@@ -5017,11 +5017,9 @@ _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.
+   /* This is pretty simple, because unlike the general texstore path we don't
+    * have to worry about the usual image unpacking or image transfer
+    * operations.
     */
    ASSERT(texObj);
    ASSERT(texImage);
@@ -5036,29 +5034,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);
 }
 
 




More information about the mesa-commit mailing list