i965/copy_image: Divide the x offsets by block width when using the blitter
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 2 Sep 2014 22:30:41 +0000 (15:30 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Wed, 3 Sep 2014 19:27:19 +0000 (12:27 -0700)
Signed-off-by: Jason Ekstrand <jason.ekstrand@intel.com>
Cc: "10.3" <mesa-stable@lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=82804
Tested-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/intel_copy_image.c

index 8bda2dd594c24fd19b060dc72bbd0a35ae64a6b4..341220cff88ad4f53b1b50e37e59bb82533ae3bd 100644 (file)
@@ -40,6 +40,7 @@ copy_image_with_blitter(struct brw_context *brw,
                         int src_width, int src_height)
 {
    GLuint bw, bh;
+   uint32_t src_image_x, src_image_y, dst_image_x, dst_image_y;
    int cpp;
 
    /* The blitter doesn't understand multisampling at all. */
@@ -70,6 +71,9 @@ copy_image_with_blitter(struct brw_context *brw,
       return false;
    }
 
+   intel_miptree_get_image_offset(src_mt, src_level, src_z,
+                                  &src_image_x, &src_image_y);
+
    if (_mesa_is_format_compressed(src_mt->format)) {
       _mesa_get_format_block_size(src_mt->format, &bw, &bh);
 
@@ -83,10 +87,21 @@ copy_image_with_blitter(struct brw_context *brw,
       src_width /= (int)bw;
       src_height /= (int)bh;
 
+      /* Inside of the miptree, the x offsets are stored in pixels while
+       * the y offsets are stored in blocks.  We need to scale just the x
+       * offset.
+       */
+      src_image_x /= bw;
+
       cpp = _mesa_get_format_bytes(src_mt->format);
    } else {
       cpp = src_mt->cpp;
    }
+   src_x += src_image_x;
+   src_y += src_image_y;
+
+   intel_miptree_get_image_offset(dst_mt, dst_level, dst_z,
+                                  &dst_image_x, &dst_image_y);
 
    if (_mesa_is_format_compressed(dst_mt->format)) {
       _mesa_get_format_block_size(dst_mt->format, &bw, &bh);
@@ -96,17 +111,13 @@ copy_image_with_blitter(struct brw_context *brw,
 
       dst_x /= (int)bw;
       dst_y /= (int)bh;
-   }
 
-   uint32_t src_image_x, src_image_y;
-   intel_miptree_get_image_offset(src_mt, src_level, src_z,
-                                  &src_image_x, &src_image_y);
-   src_x += src_image_x;
-   src_y += src_image_y;
-
-   uint32_t dst_image_x, dst_image_y;
-   intel_miptree_get_image_offset(dst_mt, dst_level, dst_z,
-                                  &dst_image_x, &dst_image_y);
+      /* Inside of the miptree, the x offsets are stored in pixels while
+       * the y offsets are stored in blocks.  We need to scale just the x
+       * offset.
+       */
+      dst_image_x /= bw;
+   }
    dst_x += dst_image_x;
    dst_y += dst_image_y;