radeon: fix errors in miptree related function
authorMaciej Cencora <m.cencora@gmail.com>
Mon, 23 Nov 2009 20:59:08 +0000 (21:59 +0100)
committerMaciej Cencora <m.cencora@gmail.com>
Mon, 23 Nov 2009 20:59:08 +0000 (21:59 +0100)
- typo
- memory leak
- off by one (spotted by airlied)

src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c

index a11b5b9979960b107a8e6cd2b0b24ba06c3bad17..46603de2e76c338c56642edeb28ca24ca27856dc 100644 (file)
@@ -492,11 +492,12 @@ static radeon_mipmap_tree * get_biggest_matching_miptree(radeonTexObj *texObj,
                                                                                                                 unsigned firstLevel,
                                                                                                                 unsigned lastLevel)
 {
-       const unsigned numLevels = lastLevel - firstLevel;
+       const unsigned numLevels = lastLevel - firstLevel + 1;
        unsigned *mtSizes = calloc(numLevels, sizeof(unsigned));
        radeon_mipmap_tree **mts = calloc(numLevels, sizeof(radeon_mipmap_tree *));
        unsigned mtCount = 0;
        unsigned maxMtIndex = 0;
+       radeon_mipmap_tree *tmp;
 
        for (unsigned level = firstLevel; level <= lastLevel; ++level) {
                radeon_texture_image *img = get_radeon_texture_image(texObj->base.Image[0][level]);
@@ -518,7 +519,7 @@ static radeon_mipmap_tree * get_biggest_matching_miptree(radeonTexObj *texObj,
 
                if (!found) {
                        mtSizes[mtCount] += img->mt->levels[img->mtlevel].size;
-                       mts[mtCount++] = img->mt;
+                       mts[mtCount] = img->mt;
                        mtCount++;
                }
        }
@@ -533,7 +534,11 @@ static radeon_mipmap_tree * get_biggest_matching_miptree(radeonTexObj *texObj,
                }
        }
 
-       return mts[maxMtIndex];
+       tmp = mts[maxMtIndex];
+       free(mtSizes);
+       free(mts);
+
+       return tmp;
 }
 
 /**