Fix image_matches_texture_obj() MaxLevel check
authorWill Dyson <will.dyson@gmail.com>
Tue, 25 May 2010 05:10:20 +0000 (01:10 -0400)
committerAlex Deucher <alexdeucher@gmail.com>
Wed, 26 May 2010 22:17:28 +0000 (18:17 -0400)
When generating or uploading a new (higher) mipmap level for an image,
we can need to allocate a miptree for a level greater than
texObj->MaxLevel.

Signed-off-by: Maciej Cencora <m.cencora@gmail.com>
Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
src/mesa/drivers/dri/radeon/radeon_texture.c

index 2b655fbd953f8ebcc73c57d0fe18b7845f48fa36..5cb33a4751d22ff62a8d32f0e317b504d30ea59d 100644 (file)
@@ -588,7 +588,12 @@ static int image_matches_texture_obj(struct gl_texture_object *texObj,
        if (!baseImage)
                return 0;
 
-       if (level < texObj->BaseLevel || level > texObj->MaxLevel)
+       /* Check image level against object BaseLevel, but not MaxLevel. MaxLevel is not
+        * the highest level that can be assigned to the miptree.
+        */
+       const unsigned maxLevel = texObj->BaseLevel + baseImage->MaxLog2;
+       if (level < texObj->BaseLevel || level > maxLevel
+                       || level > RADEON_MIPTREE_MAX_TEXTURE_LEVELS)
                return 0;
 
        const unsigned levelDiff = level - texObj->BaseLevel;
@@ -610,9 +615,7 @@ static void teximage_assign_miptree(radeonContextPtr rmesa,
        radeonTexObj *t = radeon_tex_obj(texObj);
        radeon_texture_image* image = get_radeon_texture_image(texImage);
 
-       /* Since miptree holds only images for levels <BaseLevel..MaxLevel>
-        * don't allocate the miptree if the teximage won't fit.
-        */
+       /* check image for dimension and level compatibility with texture */
        if (!image_matches_texture_obj(texObj, texImage, level))
                return;