[Mesa-dev] [PATCH] r600g: fix abysmal performance in Reaction Quake

Alex Deucher alexdeucher at gmail.com
Wed Oct 31 18:13:23 PDT 2012


On Wed, Oct 31, 2012 at 8:05 PM, Marek Olšák <maraeo at gmail.com> wrote:
> The problem was we set VRAM|GTT for relocations of STATIC resources.
> Setting just VRAM increases the framerate 4 times on my machine.
>
> I rewrote the switch statement and adjusted the domains for window
> framebuffers too.

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

Stable branches?


> ---
>  src/gallium/drivers/r600/r600_buffer.c  |   42 ++++++++++++++++---------------
>  src/gallium/drivers/r600/r600_texture.c |    3 ++-
>  2 files changed, 24 insertions(+), 21 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_buffer.c b/src/gallium/drivers/r600/r600_buffer.c
> index f4566ee..116ab51 100644
> --- a/src/gallium/drivers/r600/r600_buffer.c
> +++ b/src/gallium/drivers/r600/r600_buffer.c
> @@ -206,29 +206,31 @@ bool r600_init_resource(struct r600_screen *rscreen,
>  {
>         uint32_t initial_domain, domains;
>
> -       /* Staging resources particpate in transfers and blits only
> -        * and are used for uploads and downloads from regular
> -        * resources.  We generate them internally for some transfers.
> -        */
> -       if (usage == PIPE_USAGE_STAGING) {
> +       switch(usage) {
> +       case PIPE_USAGE_STAGING:
> +               /* Staging resources participate in transfers, i.e. are used
> +                * for uploads and downloads from regular resources.
> +                * We generate them internally for some transfers.
> +                */
> +               initial_domain = RADEON_DOMAIN_GTT;
>                 domains = RADEON_DOMAIN_GTT;
> +               break;
> +       case PIPE_USAGE_DYNAMIC:
> +       case PIPE_USAGE_STREAM:
> +               /* Default to GTT, but allow the memory manager to move it to VRAM. */
>                 initial_domain = RADEON_DOMAIN_GTT;
> -       } else {
>                 domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM;
> -
> -               switch(usage) {
> -               case PIPE_USAGE_DYNAMIC:
> -               case PIPE_USAGE_STREAM:
> -               case PIPE_USAGE_STAGING:
> -                       initial_domain = RADEON_DOMAIN_GTT;
> -                       break;
> -               case PIPE_USAGE_DEFAULT:
> -               case PIPE_USAGE_STATIC:
> -               case PIPE_USAGE_IMMUTABLE:
> -               default:
> -                       initial_domain = RADEON_DOMAIN_VRAM;
> -                       break;
> -               }
> +               break;
> +       case PIPE_USAGE_DEFAULT:
> +       case PIPE_USAGE_STATIC:
> +       case PIPE_USAGE_IMMUTABLE:
> +       default:
> +               /* Don't list GTT here, because the memory manager would put some
> +                * resources to GTT no matter what the initial domain is.
> +                * Not listing GTT in the domains improves performance a lot. */
> +               initial_domain = RADEON_DOMAIN_VRAM;
> +               domains = RADEON_DOMAIN_VRAM;
> +               break;
>         }
>
>         res->buf = rscreen->ws->buffer_create(rscreen->ws, size, alignment, bind, initial_domain);
> diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c
> index 785eeff..2df390d 100644
> --- a/src/gallium/drivers/r600/r600_texture.c
> +++ b/src/gallium/drivers/r600/r600_texture.c
> @@ -421,9 +421,10 @@ r600_texture_create_object(struct pipe_screen *screen,
>                         return NULL;
>                 }
>         } else if (buf) {
> +               /* This is usually the window framebuffer. We want it in VRAM, always. */
>                 resource->buf = buf;
>                 resource->cs_buf = rscreen->ws->buffer_get_cs_handle(buf);
> -               resource->domains = RADEON_DOMAIN_GTT | RADEON_DOMAIN_VRAM;
> +               resource->domains = RADEON_DOMAIN_VRAM;
>         }
>
>         if (rtex->cmask_size) {
> --
> 1.7.9.5
>
> _______________________________________________
> 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