r300g: fix blitting NPOT compressed textures
authorMarek Olšák <maraeo@gmail.com>
Wed, 16 Feb 2011 19:09:06 +0000 (20:09 +0100)
committerMarek Olšák <maraeo@gmail.com>
Wed, 16 Feb 2011 20:40:54 +0000 (21:40 +0100)
src/gallium/drivers/r300/r300_blit.c
src/gallium/drivers/r300/r300_texture_desc.c

index 14c9794888cb3d935b4cd88815275ccf4b39004e..4f86db399265fc274881c2670b25780212bc4ac4 100644 (file)
@@ -480,12 +480,12 @@ static void r300_resource_copy_region(struct pipe_context *pipe,
         /* Since the pixels are 4 times larger, we must decrease
          * the image size and the coordinates 4 times. */
         new_src.format = new_dst.format;
-        new_dst.height0 /= 4;
-        new_src.height0 /= 4;
+        new_dst.height0 = (new_dst.height0 + 3) / 4;
+        new_src.height0 = (new_src.height0 + 3) / 4;
         dsty /= 4;
         box = *src_box;
         box.y /= 4;
-        box.height /= 4;
+        box.height = (box.height + 3) / 4;
         src_box = &box;
     }
 
index 221e5a314acf912b795aff8bcdaa0f2b544d5c17..2cfeec7d7516e7b723beae364f159aabc2e0f499 100644 (file)
@@ -162,6 +162,14 @@ static unsigned r300_texture_get_nblocksy(struct r300_resource *tex,
 
     height = u_minify(tex->tex.height0, level);
 
+    /* Mipmapped and 3D textures must have their height aligned to POT. */
+    if ((tex->b.b.b.target != PIPE_TEXTURE_1D &&
+         tex->b.b.b.target != PIPE_TEXTURE_2D &&
+         tex->b.b.b.target != PIPE_TEXTURE_RECT) ||
+        tex->b.b.b.last_level != 0) {
+        height = util_next_power_of_two(height);
+    }
+
     if (util_format_is_plain(tex->b.b.b.format)) {
         tile_height = r300_get_pixel_alignment(tex->b.b.b.format,
                                                tex->b.b.b.nr_samples,
@@ -170,14 +178,6 @@ static unsigned r300_texture_get_nblocksy(struct r300_resource *tex,
                                                DIM_HEIGHT, 0);
         height = align(height, tile_height);
 
-        /* This is needed for the kernel checker, unfortunately. */
-        if ((tex->b.b.b.target != PIPE_TEXTURE_1D &&
-             tex->b.b.b.target != PIPE_TEXTURE_2D &&
-             tex->b.b.b.target != PIPE_TEXTURE_RECT) ||
-            tex->b.b.b.last_level != 0) {
-            height = util_next_power_of_two(height);
-        }
-
         /* See if the CBZB clear can be used on the buffer,
          * taking the texture size into account. */
         if (out_aligned_for_cbzb) {