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.
---
 src/mesa/drivers/dri/radeon/radeon_texture.c |   11 +++++++----
 1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c 
b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 2b655fb..5cb33a4 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -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;
 
-- 
1.7.1

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to