intel: Fix 2x2 and 1x1 compressed teximages from _mesa_generate_mipmap()
authorEric Anholt <eric@anholt.net>
Wed, 8 Jun 2011 23:38:01 +0000 (16:38 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 14 Jun 2011 18:15:29 +0000 (11:15 -0700)
Generally image uploads to a the region occur at TexImage time, but
that's not the case for fallback _mesa_generate_mipmap(), and in this
path we were forgetting to align the width when dividing height.  We
were just leaving out parts of the compressed block at 2x2 and 1x1
levels.

Fixes gen-compressed-teximage.

src/mesa/drivers/dri/intel/intel_mipmap_tree.c

index e62905de7c3b5eb6c3966de8875b4e242e5eb12f..55eb9a124a3ec5875b283587d77c9967ea237bfe 100644 (file)
@@ -389,26 +389,33 @@ intel_miptree_image_data(struct intel_context *intel,
    GLuint i;
 
    for (i = 0; i < depth; i++) {
-      GLuint dst_x, dst_y, height;
+      GLuint dst_x, dst_y, height, width;
 
       intel_miptree_get_image_offset(dst, level, face, i, &dst_x, &dst_y);
 
       height = dst->level[level].height;
-      if(dst->compressed)
-        height = (height + 3) / 4;
+      width = dst->level[level].width;
+      if (dst->compressed) {
+        unsigned int align_w, align_h;
+
+        intel_get_texture_alignment_unit(dst->internal_format,
+                                         &align_w, &align_h);
+        height = (height + align_h - 1) / align_h;
+        width = ALIGN(width, align_w);
+      }
 
       DBG("%s: %d/%d %p/%d -> (%d, %d)/%d (%d, %d)\n",
          __FUNCTION__, face, level,
          src, src_row_pitch * dst->cpp,
          dst_x, dst_y, dst->region->pitch * dst->cpp,
-         dst->level[level].width, height);
+         width, height);
 
       intel_region_data(intel,
                        dst->region, 0, dst_x, dst_y,
                        src,
                        src_row_pitch,
                        0, 0,                             /* source x, y */
-                       dst->level[level].width, height); /* width, height */
+                       width, height);
 
       src = (char *)src + src_image_pitch * dst->cpp;
    }