winsys/amdgpu: track the amount of mapped memory
authorMarek Olšák <marek.olsak@amd.com>
Thu, 4 Aug 2016 23:28:17 +0000 (01:28 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 9 Aug 2016 23:11:10 +0000 (01:11 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeon/radeon_winsys.h
src/gallium/winsys/amdgpu/drm/amdgpu_bo.c
src/gallium/winsys/amdgpu/drm/amdgpu_bo.h
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h

index cc79d54..72ba830 100644 (file)
@@ -154,6 +154,8 @@ enum ring_type {
 enum radeon_value_id {
     RADEON_REQUESTED_VRAM_MEMORY,
     RADEON_REQUESTED_GTT_MEMORY,
+    RADEON_MAPPED_VRAM,
+    RADEON_MAPPED_GTT,
     RADEON_BUFFER_WAIT_TIME_NS,
     RADEON_TIMESTAMP,
     RADEON_NUM_CS_FLUSHES,
index db2c77f..a4bc474 100644 (file)
@@ -256,8 +256,17 @@ static void *amdgpu_bo_map(struct pb_buffer *buf,
       /* Clear the cache and try again. */
       pb_cache_release_all_buffers(&bo->ws->bo_cache);
       r = amdgpu_bo_cpu_map(bo->bo, &cpu);
+      if (r)
+         return NULL;
+   }
+
+   if (p_atomic_inc_return(&bo->map_count) == 1) {
+      if (bo->initial_domain & RADEON_DOMAIN_VRAM)
+         bo->ws->mapped_vram += bo->base.size;
+      else
+         bo->ws->mapped_gtt += bo->base.size;
    }
-   return r ? NULL : cpu;
+   return cpu;
 }
 
 static void amdgpu_bo_unmap(struct pb_buffer *buf)
@@ -267,6 +276,13 @@ static void amdgpu_bo_unmap(struct pb_buffer *buf)
    if (bo->user_ptr)
       return;
 
+   if (p_atomic_dec_zero(&bo->map_count)) {
+      if (bo->initial_domain & RADEON_DOMAIN_VRAM)
+         bo->ws->mapped_vram -= bo->base.size;
+      else
+         bo->ws->mapped_gtt -= bo->base.size;
+   }
+
    amdgpu_bo_cpu_unmap(bo->bo);
 }
 
index a768771..e2ee049 100644 (file)
@@ -44,6 +44,7 @@ struct amdgpu_winsys_bo {
    void *user_ptr; /* from buffer_from_ptr */
 
    amdgpu_bo_handle bo;
+   int map_count;
    uint32_t unique_id;
    amdgpu_va_handle va_handle;
    uint64_t va;
index 1f24fcd..9556777 100644 (file)
@@ -379,6 +379,10 @@ static uint64_t amdgpu_query_value(struct radeon_winsys *rws,
       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:
index 8489530..96d4e6d 100644 (file)
@@ -53,6 +53,8 @@ struct amdgpu_winsys {
    uint32_t next_bo_unique_id;
    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;