From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/winsys/radeon/drm/radeon_drm_bo.c | 13 ++++++++++++- src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 4 ++++ src/gallium/winsys/radeon/drm/radeon_drm_winsys.h | 2 ++ 3 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c index 897b536..56aab48 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_bo.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_bo.c @@ -368,22 +368,27 @@ void *radeon_bo_do_map(struct radeon_bo *bo) ptr = os_mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, bo->rws->fd, args.addr_ptr); if (ptr == MAP_FAILED) { pipe_mutex_unlock(bo->map_mutex); fprintf(stderr, "radeon: mmap failed, errno: %i\n", errno); return NULL; } } bo->ptr = ptr; bo->map_count = 1; - pipe_mutex_unlock(bo->map_mutex); + if (bo->initial_domain & RADEON_DOMAIN_VRAM) + bo->rws->mapped_vram += bo->base.size; + else + bo->rws->mapped_gtt += bo->base.size; + + pipe_mutex_unlock(bo->map_mutex); return bo->ptr; } static void *radeon_bo_map(struct pb_buffer *buf, struct radeon_winsys_cs *rcs, enum pipe_transfer_usage usage) { struct radeon_bo *bo = (struct radeon_bo*)buf; struct radeon_drm_cs *cs = (struct radeon_drm_cs*)rcs; @@ -472,20 +477,26 @@ static void radeon_bo_unmap(struct pb_buffer *_buf) } assert(bo->map_count); if (--bo->map_count) { pipe_mutex_unlock(bo->map_mutex); return; /* it's been mapped multiple times */ } os_munmap(bo->ptr, bo->base.size); bo->ptr = NULL; + + if (bo->initial_domain & RADEON_DOMAIN_VRAM) + bo->rws->mapped_vram -= bo->base.size; + else + bo->rws->mapped_gtt -= bo->base.size; + pipe_mutex_unlock(bo->map_mutex); } static const struct pb_vtbl radeon_bo_vtbl = { radeon_bo_destroy_or_cache /* other functions are never called */ }; #ifndef RADEON_GEM_GTT_WC #define RADEON_GEM_GTT_WC (1 << 2) diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index 1b32c37..b1cc3d5 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -596,20 +596,24 @@ static uint64_t radeon_query_value(struct radeon_winsys *rws, enum radeon_value_id value) { struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)rws; uint64_t retval = 0; switch (value) { case RADEON_REQUESTED_VRAM_MEMORY: return ws->allocated_vram; case RADEON_REQUESTED_GTT_MEMORY: return ws->allocated_gtt; + case RADEON_MAPPED_VRAM: + return ws->mapped_vram; + case RADEON_MAPPED_GTT: + return ws->mapped_gtt; case RADEON_BUFFER_WAIT_TIME_NS: return ws->buffer_wait_time; case RADEON_TIMESTAMP: if (ws->info.drm_minor < 20 || ws->gen < DRV_R600) { assert(0); return 0; } radeon_get_drm_value(ws->fd, RADEON_INFO_TIMESTAMP, "timestamp", (uint32_t*)&retval); diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h index fdbaebe..27fbe90 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h @@ -64,20 +64,22 @@ enum radeon_generation { struct radeon_drm_winsys { struct radeon_winsys base; struct pipe_reference reference; struct pb_cache bo_cache; int fd; /* DRM file descriptor */ int num_cs; /* The number of command streams created. */ uint64_t allocated_vram; uint64_t allocated_gtt; + uint64_t mapped_vram; + uint64_t mapped_gtt; uint64_t buffer_wait_time; /* time spent in buffer_wait in ns */ uint64_t num_cs_flushes; enum radeon_generation gen; struct radeon_info info; uint32_t va_start; uint32_t va_unmap_working; uint32_t accel_working2; /* List of buffer GEM names. Protected by bo_handles_mutex. */ -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev