fix small s3tc mipmaps (#10968)
authorRoland Scheidegger <sroland@tungstengraphics.com>
Fri, 18 May 2007 22:45:38 +0000 (00:45 +0200)
committerRoland Scheidegger <sroland@tungstengraphics.com>
Fri, 18 May 2007 22:59:46 +0000 (00:59 +0200)
make sure that always whole blocks are uploaded.
(May still not work correctly if the top mip map is not at least a full block,
that is 4 pixels wide - not sure, but probably doesn't happen in real world)

src/mesa/drivers/dri/i915/i915_texstate.c
src/mesa/drivers/dri/i915/intel_tex.c

index 3b639e7..9f0c949 100644 (file)
@@ -172,12 +172,8 @@ static void i915LayoutTextureImages( i915ContextPtr i915,
         
         t->intel.image[0][i].offset = total_height * pitch;
         t->intel.image[0][i].internalFormat = baseImage->_BaseFormat;
-        if (t->intel.image[0][i].image->IsCompressed)
-        {
-          if (t->intel.image[0][i].image->Height > 4)
-            total_height += t->intel.image[0][i].image->Height/4;
-          else
-            total_height += 1;
+        if (t->intel.image[0][i].image->IsCompressed) {
+           total_height += (t->intel.image[0][i].image->Height + 3) / 4;
         }
         else
           total_height += MAX2(2, t->intel.image[0][i].image->Height);
index 6012d3e..46f49e7 100644 (file)
@@ -634,18 +634,12 @@ static void intelUploadTexImage( intelContextPtr intel,
                               image->Height);
    }
    else if (image->IsCompressed) {
-      GLuint row_len = image->Width * 2;
+      GLuint row_len = 0;
       GLubyte *dst = (GLubyte *)(t->BufAddr + offset);
       GLubyte *src = (GLubyte *)image->Data;
       GLuint j;
 
-      if (INTEL_DEBUG & DEBUG_TEXTURE)
-        fprintf(stderr, 
-                "Upload image %dx%dx%d offset %xm row_len %x "
-                "pitch %x depth_pitch %x\n",
-                image->Width, image->Height, image->Depth, offset,
-                row_len, t->Pitch, t->depth_pitch);
-
+      /* must always copy whole blocks (8/16 bytes) */
       switch (image->InternalFormat) {
        case GL_COMPRESSED_RGB_FXT1_3DFX:
        case GL_COMPRESSED_RGBA_FXT1_3DFX:
@@ -653,24 +647,31 @@ static void intelUploadTexImage( intelContextPtr intel,
        case GL_RGB4_S3TC:
        case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
        case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-         for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
-           __memcpy(dst, src, row_len );
-           src += row_len;
-         }
+         row_len = (image->Width * 2 + 7) & ~7;
          break;
        case GL_RGBA_S3TC:
        case GL_RGBA4_S3TC:
        case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
-         for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
-           __memcpy(dst, src, (image->Width*4) );
-           src += image->Width*4;
-         }
+         row_len = (image->Width * 4 + 15) & ~15;
          break;
        default:
          fprintf(stderr,"Internal Compressed format not supported %d\n", image->InternalFormat);
          break;
       }
+
+      if (INTEL_DEBUG & DEBUG_TEXTURE)
+        fprintf(stderr, 
+                "Upload image %dx%dx%d offset %xm row_len %x "
+                "pitch %x depth_pitch %x\n",
+                image->Width, image->Height, image->Depth, offset,
+                row_len, t->Pitch, t->depth_pitch);
+
+      if (row_len) {
+        for (j = 0 ; j < (image->Height + 3)/4 ; j++, dst += (t->Pitch)) {
+          __memcpy(dst, src, row_len );
+          src += row_len;
+        }
+      }
    }
    /* Time for another vtbl entry:
     */