r600g: x/y coordinates must be divided by block dim in dma blit
authorChristoph Bumiller <christoph.bumiller@speed.at>
Fri, 5 Jul 2013 18:55:36 +0000 (20:55 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 11 Jul 2013 23:11:44 +0000 (19:11 -0400)
Note: this is a candidate for the 9.1 branch.

Reviewed-by: Marek Olšák <maraeo@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_state.c

index 4166b18e2620c872484dc7889f1f2ab091f8104d..980e75aa7bd10799f2da0f77e0a381d46aa30b24 100644 (file)
@@ -3733,6 +3733,7 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
        struct r600_texture *rdst = (struct r600_texture*)dst;
        unsigned dst_pitch, src_pitch, bpp, dst_mode, src_mode, copy_height;
        unsigned src_w, dst_w;
+       unsigned src_x, src_y;
 
        if (rctx->rings.dma.cs == NULL) {
                return FALSE;
@@ -3741,6 +3742,11 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
                return FALSE;
        }
 
+       src_x = util_format_get_nblocksx(src->format, src_box->x);
+       dst_x = util_format_get_nblocksx(src->format, dst_x);
+       src_y = util_format_get_nblocksy(src->format, src_box->y);
+       dst_y = util_format_get_nblocksy(src->format, dst_y);
+
        bpp = rdst->surface.bpe;
        dst_pitch = rdst->surface.level[dst_level].pitch_bytes;
        src_pitch = rsrc->surface.level[src_level].pitch_bytes;
@@ -3785,7 +3791,7 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
                 */
                src_offset= rsrc->surface.level[src_level].offset;
                src_offset += rsrc->surface.level[src_level].slice_size * src_box->z;
-               src_offset += src_box->y * src_pitch + src_box->x * bpp;
+               src_offset += src_y * src_pitch + src_x * bpp;
                dst_offset = rdst->surface.level[dst_level].offset;
                dst_offset += rdst->surface.level[dst_level].slice_size * dst_z;
                dst_offset += dst_y * dst_pitch + dst_x * bpp;
@@ -3793,7 +3799,7 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
                                        src_box->height * src_pitch);
        } else {
                evergreen_dma_copy_tile(rctx, dst, dst_level, dst_x, dst_y, dst_z,
-                                       src, src_level, src_box->x, src_box->y, src_box->z,
+                                       src, src_level, src_x, src_y, src_box->z,
                                        copy_height, dst_pitch, bpp);
        }
        return TRUE;
index 759f71f97e72c20a94ccfe523d5f77c8d0bb43d0..4590fdddc8048c498cc80137802da3954178ab7a 100644 (file)
@@ -3132,6 +3132,7 @@ boolean r600_dma_blit(struct pipe_context *ctx,
        struct r600_texture *rdst = (struct r600_texture*)dst;
        unsigned dst_pitch, src_pitch, bpp, dst_mode, src_mode, copy_height;
        unsigned src_w, dst_w;
+       unsigned src_x, src_y;
 
        if (rctx->rings.dma.cs == NULL) {
                return FALSE;
@@ -3140,6 +3141,11 @@ boolean r600_dma_blit(struct pipe_context *ctx,
                return FALSE;
        }
 
+       src_x = util_format_get_nblocksx(src->format, src_box->x);
+       dst_x = util_format_get_nblocksx(src->format, dst_x);
+       src_y = util_format_get_nblocksy(src->format, src_box->y);
+       dst_y = util_format_get_nblocksy(src->format, dst_y);
+
        bpp = rdst->surface.bpe;
        dst_pitch = rdst->surface.level[dst_level].pitch_bytes;
        src_pitch = rsrc->surface.level[src_level].pitch_bytes;
@@ -3172,7 +3178,7 @@ boolean r600_dma_blit(struct pipe_context *ctx,
                 */
                src_offset= rsrc->surface.level[src_level].offset;
                src_offset += rsrc->surface.level[src_level].slice_size * src_box->z;
-               src_offset += src_box->y * src_pitch + src_box->x * bpp;
+               src_offset += src_y * src_pitch + src_x * bpp;
                dst_offset = rdst->surface.level[dst_level].offset;
                dst_offset += rdst->surface.level[dst_level].slice_size * dst_z;
                dst_offset += dst_y * dst_pitch + dst_x * bpp;
@@ -3184,7 +3190,7 @@ boolean r600_dma_blit(struct pipe_context *ctx,
                r600_dma_copy(rctx, dst, src, dst_offset, src_offset, size);
        } else {
                return r600_dma_copy_tile(rctx, dst, dst_level, dst_x, dst_y, dst_z,
-                                       src, src_level, src_box->x, src_box->y, src_box->z,
+                                       src, src_level, src_x, src_y, src_box->z,
                                        copy_height, dst_pitch, bpp);
        }
        return TRUE;