From: Michel Dänzer <michel.daen...@amd.com>

Fixes GPUVM faults when running the piglit test "getteximage-formats
init-by-rendering" with R600_DEBUG=forcedma on SI.

Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
---
 src/gallium/drivers/radeonsi/si_dma.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_dma.c 
b/src/gallium/drivers/radeonsi/si_dma.c
index cd6ff4a..02899c1 100644
--- a/src/gallium/drivers/radeonsi/si_dma.c
+++ b/src/gallium/drivers/radeonsi/si_dma.c
@@ -148,7 +148,6 @@ static void si_dma_copy_tile(struct si_context *ctx,
 
        sub_cmd = SI_DMA_COPY_TILED;
        lbpp = util_logbase2(bpp);
-       pitch_tile_max = ((pitch / bpp) / 8) - 1;
 
        detile = dst_mode == RADEON_SURF_MODE_LINEAR;
        rlinear = detile ? rdst : rsrc;
@@ -165,8 +164,13 @@ static void si_dma_copy_tile(struct si_context *ctx,
        assert(!util_format_is_depth_and_stencil(rtiled->resource.b.b.format));
 
        array_mode = si_array_mode(rtiled->surface.level[tiled_lvl].mode);
-       slice_tile_max = (rtiled->surface.level[tiled_lvl].nblk_x *
-                         rtiled->surface.level[tiled_lvl].nblk_y) / (8*8) - 1;
+       pitch_tile_max =
+               rtiled->surface.level[tiled_lvl].nblk_x * rtiled->surface.blk_w
+               / 8 - 1;
+       slice_tile_max =
+               rtiled->surface.level[tiled_lvl].nblk_x * rtiled->surface.blk_w
+               * rtiled->surface.level[tiled_lvl].nblk_y * 
rtiled->surface.blk_h
+               / (8*8) - 1;
        /* linear height must be the same as the slice tile max height, it's ok 
even
         * if the linear destination/source have smaller heigh as the size of 
the
         * dma packet will be using the copy_height which is always smaller or 
equal
@@ -216,7 +220,7 @@ static void si_dma_copy_tile(struct si_context *ctx,
                cs->buf[cs->cdw++] = (addr >> 32UL) & 0xff;
                copy_height -= cheight;
                addr += cheight * pitch;
-               tiled_y += cheight;
+               tiled_y += cheight * rtiled->surface.blk_h;
        }
 }
 
@@ -302,7 +306,7 @@ void si_dma_copy(struct pipe_context *ctx,
                dst_offset += rdst->surface.level[dst_level].slice_size * dst_z;
                dst_offset += dst_y * dst_pitch + dst_x * bpp;
                si_dma_copy_buffer(sctx, dst, src, dst_offset, src_offset,
-                           src_box->height * src_pitch);
+                                  copy_height * src_pitch);
        } else {
                si_dma_copy_tile(sctx, dst, dst_level, dst_x, dst_y, dst_z,
                                 src, src_level, src_x, src_y, src_box->z,
-- 
2.1.0

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

Reply via email to