radeon: fix teximage migration failure in rare case
authorMaciej Cencora <m.cencora@gmail.com>
Sun, 11 Jul 2010 13:33:18 +0000 (15:33 +0200)
committerMaciej Cencora <m.cencora@gmail.com>
Sun, 11 Jul 2010 13:34:17 +0000 (15:34 +0200)
Always store selected miptree in texObj->mt so get_base_teximage_offset returns correct data.
Found with piglit/mipmap-setup.

Candidate for 7.8 branch.

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

index 6cd1d87de242c1dd96019586da78b2493398d78c..c7dda4780f17a3d142bb53fad1bf9743896c4816 100644 (file)
@@ -604,15 +604,15 @@ int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *t
        radeon_mipmap_tree *dst_miptree;
        dst_miptree = get_biggest_matching_miptree(t, t->minLod, t->maxLod);
 
+       radeon_miptree_unreference(&t->mt);
        if (!dst_miptree) {
-               radeon_miptree_unreference(&t->mt);
                radeon_try_alloc_miptree(rmesa, t);
-               dst_miptree = t->mt;
                radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
                        "%s: No matching miptree found, allocated new one %p\n",
                        __FUNCTION__, t->mt);
 
        } else {
+               radeon_miptree_reference(dst_miptree, &t->mt);
                radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
                        "%s: Using miptree %p\n", __FUNCTION__, t->mt);
        }
@@ -629,7 +629,7 @@ int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *t
                                "Checking image level %d, face %d, mt %p ... ",
                                level, face, img->mt);
                        
-                       if (img->mt != dst_miptree) {
+                       if (img->mt != t->mt) {
                                radeon_print(RADEON_TEXTURE, RADEON_TRACE,
                                        "MIGRATING\n");
 
@@ -637,7 +637,7 @@ int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *t
                                if (src_bo && radeon_bo_is_referenced_by_cs(src_bo, rmesa->cmdbuf.cs)) {
                                        radeon_firevertices(rmesa);
                                }
-                               migrate_image_to_miptree(dst_miptree, img, face, level);
+                               migrate_image_to_miptree(t->mt, img, face, level);
                        } else
                                radeon_print(RADEON_TEXTURE, RADEON_TRACE, "OK\n");
                }