On Thu, Feb 4, 2016 at 3:42 PM, Marek Olšák <mar...@gmail.com> wrote: > From: Marek Olšák <marek.ol...@amd.com> > > v2: don't use DIV_ROUND_UP (no so useful) > also return eviction stats
For the series: Reviewed-by: Alex Deucher <alexander.deuc...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev