Fix up texture compression mipmapping .. not sure if it fixes FXT1 but
authorDave Airlie <airliedfreedesktop.org>
Thu, 17 Jun 2004 13:42:45 +0000 (13:42 +0000)
committerDave Airlie <airliedfreedesktop.org>
Thu, 17 Jun 2004 13:42:45 +0000 (13:42 +0000)
with S3TC patch it fixes those

src/mesa/drivers/dri/i830/i830_texmem.c
src/mesa/drivers/dri/i830/i830_texstate.c

index 1a5abf5bab7719cc2ade14f1423edb951dbcb224..6a30b496555c714e8262eac453d055fde769f9c7 100644 (file)
@@ -105,17 +105,23 @@ static void i830UploadTexLevel( i830ContextPtr imesa,
    if (!image || !image->Data)
       return;
 
-   if (image->Width * image->TexFormat->TexelBytes == t->Pitch) {
+   if (image->IsCompressed) {
         GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[0][hwlevel].offset);
         GLubyte *src = (GLubyte *)image->Data;
-        
-        memcpy( dst, src, t->Pitch * image->Height );
+
+        if ((t->Setup[I830_TEXREG_TM0S1] & TM0S1_MT_FORMAT_MASK)==MT_COMPRESS_FXT1)
+          {
+            for (j = 0 ; j < image->Height/4 ; j++, dst += (t->Pitch)) {
+              __memcpy(dst, src, (image->Width*2) );
+              src += image->Width*2;
+            }
+          }
    }
-   else if (image->IsCompressed) {
-         GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[0][hwlevel].offset);
+   else if (image->Width * image->TexFormat->TexelBytes == t->Pitch) {
+        GLubyte *dst = (GLubyte *)(t->BufAddr + t->image[0][hwlevel].offset);
         GLubyte *src = (GLubyte *)image->Data;
         
-        memcpy( dst, src, image->CompressedSize );
+        memcpy( dst, src, t->Pitch * image->Height );
    }
    else switch (image->TexFormat->TexelBytes) {
    case 1:
index 6b8193c924606416140a352390460d4639b45cda..d5440141bfefbe955e467636ff9e653d14622c9e 100644 (file)
@@ -159,8 +159,16 @@ static void i830SetTexImages( i830ContextPtr imesa,
         break;
       
       t->image[0][i].offset = total_height * pitch;
+      if (t->image[0][i].image->IsCompressed)
+       {
+         if (t->image[0][i].image->Height > 4)
+           total_height += t->image[0][i].image->Height/4;
+         else
+           total_height += 1;
+       }
+      else
+       total_height += t->image[0][i].image->Height;
       t->image[0][i].internalFormat = baseImage->Format;
-      total_height += t->image[0][i].image->Height;
    }
 
    t->Pitch = pitch;