Fix compressed texture loads for non-minimal pitches
authorLuca Barbieri <luca@luca-barbieri.com>
Sun, 10 Jan 2010 20:04:21 +0000 (12:04 -0800)
committerKeith Whitwell <keithw@vmware.com>
Mon, 11 Jan 2010 10:53:02 +0000 (10:53 +0000)
The current glCompressedTexImage support in the state tracker assumes
that compressed textures have minimal pitch.

However, in some cases this is not true, such as for mipmaps of non-POT
compressed textures on nVidia hardware.

This patch adds a check and does a memcpy for each line instead of the
whole image in that case.

Signed-off-by: Keith Whitwell <keithw@vmware.com>
Tweaks for C90 compilation.

src/mesa/state_tracker/st_cb_texture.c

index 0cec23f2b3cd728988a56fa0a618ab9bf2cd4233..f01053cdacc0b344c32c56e237ee32c406f7f4dd 100644 (file)
@@ -680,7 +680,22 @@ st_TexImage(GLcontext * ctx,
     * conversion and copy:
     */
    if (compressed_src) {
-      memcpy(texImage->Data, pixels, imageSize);
+      const GLuint srcImageStride = _mesa_format_row_stride(texImage->TexFormat, width);
+      if(dstRowStride == srcImageStride)
+         memcpy(texImage->Data, pixels, imageSize);
+      else
+      {
+         char *dst = texImage->Data;
+         const char *src = pixels;
+         int i;
+
+         for(i = 0; i < height; ++i)
+         {
+            memcpy(dst, src, srcImageStride);
+            dst += dstRowStride;
+            src += srcImageStride;
+         }
+      }
    }
    else {
       const GLuint srcImageStride =