[Mesa-dev] [PATCH 5/5] gallium/radeon: implement query_memory_info (v2)

Alex Deucher alexdeucher at gmail.com
Thu Feb 4 20:51:13 UTC 2016


On Thu, Feb 4, 2016 at 3:42 PM, Marek Olšák <maraeo at gmail.com> wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> v2: don't use DIV_ROUND_UP (no so useful)
>     also return eviction stats

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

> ---
>  src/gallium/drivers/r600/r600_pipe.c          |  2 +-
>  src/gallium/drivers/radeon/r600_pipe_common.c | 37 +++++++++++++++++++++++++++
>  src/gallium/drivers/radeonsi/si_pipe.c        |  2 +-
>  3 files changed, 39 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
> index cee87ed..0cf43b8 100644
> --- a/src/gallium/drivers/r600/r600_pipe.c
> +++ b/src/gallium/drivers/r600/r600_pipe.c
> @@ -286,6 +286,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>         case PIPE_CAP_COPY_BETWEEN_COMPRESSED_AND_PLAIN_FORMATS:
>         case PIPE_CAP_INVALIDATE_BUFFER:
>         case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
> +       case PIPE_CAP_QUERY_MEMORY_INFO:
>                 return 1;
>
>         case PIPE_CAP_DEVICE_RESET_STATUS_QUERY:
> @@ -368,7 +369,6 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>         case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
>         case PIPE_CAP_GENERATE_MIPMAP:
>         case PIPE_CAP_STRING_MARKER:
> -       case PIPE_CAP_QUERY_MEMORY_INFO:
>                 return 0;
>
>         case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
> index 0620a9a..35bd2a3 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
> @@ -799,6 +799,42 @@ static boolean r600_fence_finish(struct pipe_screen *screen,
>         return rws->fence_wait(rws, rfence->gfx, timeout);
>  }
>
> +static void r600_query_memory_info(struct pipe_screen *screen,
> +                                  struct pipe_memory_info *info)
> +{
> +       struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
> +       struct radeon_winsys *ws = rscreen->ws;
> +       unsigned vram_usage, gtt_usage;
> +
> +       info->total_device_memory = rscreen->info.vram_size / 1024;
> +       info->total_staging_memory = rscreen->info.gart_size / 1024;
> +
> +       /* The real TTM memory usage is somewhat random, because:
> +        *
> +        * 1) TTM delays freeing memory, because it can only free it after
> +        *    fences expire.
> +        *
> +        * 2) The memory usage can be really low if big VRAM evictions are
> +        *    taking place, but the real usage is well above the size of VRAM.
> +        *
> +        * Instead, return statistics of this process.
> +        */
> +       vram_usage = ws->query_value(ws, RADEON_REQUESTED_VRAM_MEMORY) / 1024;
> +       gtt_usage =  ws->query_value(ws, RADEON_REQUESTED_GTT_MEMORY) / 1024;
> +
> +       info->avail_device_memory =
> +               vram_usage <= info->total_device_memory ?
> +                               info->total_device_memory - vram_usage : 0;
> +       info->avail_staging_memory =
> +               gtt_usage <= info->total_staging_memory ?
> +                               info->total_staging_memory - gtt_usage : 0;
> +
> +       info->device_memory_evicted =
> +               ws->query_value(ws, RADEON_NUM_BYTES_MOVED) / 1024;
> +       /* Just return the number of evicted 64KB pages. */
> +       info->nr_device_memory_evictions = info->device_memory_evicted / 64;
> +}
> +
>  struct pipe_resource *r600_resource_create_common(struct pipe_screen *screen,
>                                                   const struct pipe_resource *templ)
>  {
> @@ -838,6 +874,7 @@ bool r600_common_screen_init(struct r600_common_screen *rscreen,
>         rscreen->b.fence_reference = r600_fence_reference;
>         rscreen->b.resource_destroy = u_resource_destroy_vtbl;
>         rscreen->b.resource_from_user_memory = r600_buffer_from_user_memory;
> +       rscreen->b.query_memory_info = r600_query_memory_info;
>
>         if (rscreen->info.has_uvd) {
>                 rscreen->b.get_video_param = rvid_get_video_param;
> diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
> index eb53733..66e5037 100644
> --- a/src/gallium/drivers/radeonsi/si_pipe.c
> +++ b/src/gallium/drivers/radeonsi/si_pipe.c
> @@ -309,6 +309,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>         case PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL:
>         case PIPE_CAP_INVALIDATE_BUFFER:
>         case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
> +       case PIPE_CAP_QUERY_MEMORY_INFO:
>                 return 1;
>
>         case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
> @@ -360,7 +361,6 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
>         case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
>         case PIPE_CAP_GENERATE_MIPMAP:
>         case PIPE_CAP_STRING_MARKER:
> -       case PIPE_CAP_QUERY_MEMORY_INFO:
>                 return 0;
>
>         case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
> --
> 2.1.4
>
> _______________________________________________
> 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