[Mesa-dev] [PATCH] radeonsi: Fix si_dma_copy(_tile) for compressed formats

Marek Olšák maraeo at gmail.com
Wed Sep 10 15:05:23 PDT 2014


Sorry, the function is too confusing for me to understand it, but it looks good.

I think it would be cleaner to convert all parameters of the
compressed texture copy into a non-compressed texture copy at the
beginning of si_dma_copy, with the box being (x/4, y/4, w/4, h/4),
i.e. blitting whole blocks instead of pixels. Then, all the other DMA
functions don't have to worry about compressed textures in theory.

Marek

On Wed, Sep 10, 2014 at 11:59 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at 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.daenzer at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list