[Mesa-dev] [PATCH 4/6] gallium/radeon: fix performance of buffer readbacks

Marek Olšák maraeo at gmail.com
Thu Feb 9 11:34:24 UTC 2017


Please ignore this patch. There are a bunch of piglit regressions.

Marek

On Thu, Feb 9, 2017 at 12:21 PM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> We want cached GTT for all non-persistent read mappings.
> Set level = 0 on purpose.
>
> Use dma_copy, because resource_copy_region causes a failure in the PBO
> read of piglit/getteximage-luminance.
>
> If Rocket League used the READ flag, it should get cached GTT.
>
> Cc: 13.0 17.0 <mesa-stable at lists.freedesktop.org>
> ---
>  src/gallium/drivers/radeon/r600_buffer_common.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c
> index da6f020..11d2319 100644
> --- a/src/gallium/drivers/radeon/r600_buffer_common.c
> +++ b/src/gallium/drivers/radeon/r600_buffer_common.c
> @@ -374,38 +374,38 @@ static void *r600_buffer_transfer_map(struct pipe_context *ctx,
>                         if (staging) {
>                                 data += box->x % R600_MAP_BUFFER_ALIGNMENT;
>                                 return r600_buffer_get_transfer(ctx, resource, level, usage, box,
>                                                                 ptransfer, data, staging, offset);
>                         }
>                 } else {
>                         /* At this point, the buffer is always idle (we checked it above). */
>                         usage |= PIPE_TRANSFER_UNSYNCHRONIZED;
>                 }
>         }
> -       /* Using a staging buffer in GTT for larger reads is much faster. */
> +       /* Use a staging buffer in cached GTT for reads. */
>         else if ((usage & PIPE_TRANSFER_READ) &&
> -                !(usage & (PIPE_TRANSFER_WRITE |
> -                           PIPE_TRANSFER_PERSISTENT)) &&
> -                rbuffer->domains & RADEON_DOMAIN_VRAM &&
> +                !(usage & PIPE_TRANSFER_PERSISTENT) &&
> +                (rbuffer->domains & RADEON_DOMAIN_VRAM ||
> +                 rbuffer->flags & RADEON_FLAG_GTT_WC) &&
>                  r600_can_dma_copy_buffer(rctx, 0, box->x, box->width)) {
>                 struct r600_resource *staging;
>
>                 staging = (struct r600_resource*) pipe_buffer_create(
>                                 ctx->screen, 0, PIPE_USAGE_STAGING,
>                                 box->width + (box->x % R600_MAP_BUFFER_ALIGNMENT));
>                 if (staging) {
>                         /* Copy the VRAM buffer to the staging buffer. */
> -                       ctx->resource_copy_region(ctx, &staging->b.b, 0,
> -                                                 box->x % R600_MAP_BUFFER_ALIGNMENT,
> -                                                 0, 0, resource, level, box);
> +                       rctx->dma_copy(ctx, &staging->b.b, 0,
> +                                      box->x % R600_MAP_BUFFER_ALIGNMENT,
> +                                      0, 0, resource, 0, box);
>
> -                       data = r600_buffer_map_sync_with_rings(rctx, staging, PIPE_TRANSFER_READ);
> +                       data = r600_buffer_map_sync_with_rings(rctx, staging, usage);
>                         if (!data) {
>                                 r600_resource_reference(&staging, NULL);
>                                 return NULL;
>                         }
>                         data += box->x % R600_MAP_BUFFER_ALIGNMENT;
>
>                         return r600_buffer_get_transfer(ctx, resource, level, usage, box,
>                                                         ptransfer, data, staging, 0);
>                 }
>         }
> --
> 2.7.4
>


More information about the mesa-dev mailing list