[Mesa-dev] [PATCH 9/9] gallium/radeon: add new HUD query num-SDMA-IBs

Nicolai Hähnle nhaehnle at gmail.com
Fri Jan 6 11:46:18 UTC 2017


Apart from the question on patch #2, this series is

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

On 02.01.2017 21:17, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> ---
>  src/gallium/drivers/radeon/r600_query.c           | 4 ++++
>  src/gallium/drivers/radeon/r600_query.h           | 1 +
>  src/gallium/drivers/radeon/radeon_winsys.h        | 1 +
>  src/gallium/winsys/amdgpu/drm/amdgpu_cs.c         | 6 +++++-
>  src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c     | 2 ++
>  src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h     | 1 +
>  src/gallium/winsys/radeon/drm/radeon_drm_cs.c     | 5 ++++-
>  src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 2 ++
>  src/gallium/winsys/radeon/drm/radeon_drm_winsys.h | 1 +
>  9 files changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c
> index 70a2568..3c72f27 100644
> --- a/src/gallium/drivers/radeon/r600_query.c
> +++ b/src/gallium/drivers/radeon/r600_query.c
> @@ -59,20 +59,21 @@ static void r600_query_sw_destroy(struct r600_common_context *rctx,
>
>  static enum radeon_value_id winsys_id_from_type(unsigned type)
>  {
>  	switch (type) {
>  	case R600_QUERY_REQUESTED_VRAM: return RADEON_REQUESTED_VRAM_MEMORY;
>  	case R600_QUERY_REQUESTED_GTT: return RADEON_REQUESTED_GTT_MEMORY;
>  	case R600_QUERY_MAPPED_VRAM: return RADEON_MAPPED_VRAM;
>  	case R600_QUERY_MAPPED_GTT: return RADEON_MAPPED_GTT;
>  	case R600_QUERY_BUFFER_WAIT_TIME: return RADEON_BUFFER_WAIT_TIME_NS;
>  	case R600_QUERY_NUM_GFX_IBS: return RADEON_NUM_GFX_IBS;
> +	case R600_QUERY_NUM_SDMA_IBS: return RADEON_NUM_SDMA_IBS;
>  	case R600_QUERY_NUM_BYTES_MOVED: return RADEON_NUM_BYTES_MOVED;
>  	case R600_QUERY_NUM_EVICTIONS: return RADEON_NUM_EVICTIONS;
>  	case R600_QUERY_VRAM_USAGE: return RADEON_VRAM_USAGE;
>  	case R600_QUERY_GTT_USAGE: return RADEON_GTT_USAGE;
>  	case R600_QUERY_GPU_TEMPERATURE: return RADEON_GPU_TEMPERATURE;
>  	case R600_QUERY_CURRENT_GPU_SCLK: return RADEON_CURRENT_SCLK;
>  	case R600_QUERY_CURRENT_GPU_MCLK: return RADEON_CURRENT_MCLK;
>  	default: unreachable("query type does not correspond to winsys id");
>  	}
>  }
> @@ -129,20 +130,21 @@ static bool r600_query_sw_begin(struct r600_common_context *rctx,
>  	case R600_QUERY_VRAM_USAGE:
>  	case R600_QUERY_GTT_USAGE:
>  	case R600_QUERY_GPU_TEMPERATURE:
>  	case R600_QUERY_CURRENT_GPU_SCLK:
>  	case R600_QUERY_CURRENT_GPU_MCLK:
>  	case R600_QUERY_BACK_BUFFER_PS_DRAW_RATIO:
>  		query->begin_result = 0;
>  		break;
>  	case R600_QUERY_BUFFER_WAIT_TIME:
>  	case R600_QUERY_NUM_GFX_IBS:
> +	case R600_QUERY_NUM_SDMA_IBS:
>  	case R600_QUERY_NUM_BYTES_MOVED:
>  	case R600_QUERY_NUM_EVICTIONS: {
>  		enum radeon_value_id ws_id = winsys_id_from_type(query->b.type);
>  		query->begin_result = rctx->ws->query_value(rctx->ws, ws_id);
>  		break;
>  	}
>  	case R600_QUERY_GPU_LOAD:
>  		query->begin_result = r600_gpu_load_begin(rctx->screen);
>  		break;
>  	case R600_QUERY_NUM_COMPILATIONS:
> @@ -219,20 +221,21 @@ static bool r600_query_sw_end(struct r600_common_context *rctx,
>  	case R600_QUERY_REQUESTED_GTT:
>  	case R600_QUERY_MAPPED_VRAM:
>  	case R600_QUERY_MAPPED_GTT:
>  	case R600_QUERY_VRAM_USAGE:
>  	case R600_QUERY_GTT_USAGE:
>  	case R600_QUERY_GPU_TEMPERATURE:
>  	case R600_QUERY_CURRENT_GPU_SCLK:
>  	case R600_QUERY_CURRENT_GPU_MCLK:
>  	case R600_QUERY_BUFFER_WAIT_TIME:
>  	case R600_QUERY_NUM_GFX_IBS:
> +	case R600_QUERY_NUM_SDMA_IBS:
>  	case R600_QUERY_NUM_BYTES_MOVED:
>  	case R600_QUERY_NUM_EVICTIONS: {
>  		enum radeon_value_id ws_id = winsys_id_from_type(query->b.type);
>  		query->end_result = rctx->ws->query_value(rctx->ws, ws_id);
>  		break;
>  	}
>  	case R600_QUERY_GPU_LOAD:
>  		query->end_result = r600_gpu_load_end(rctx->screen,
>  						      query->begin_result);
>  		query->begin_result = 0;
> @@ -1685,20 +1688,21 @@ static struct pipe_driver_query_info r600_driver_query_list[] = {
>  	X("num-cs-flushes",		NUM_CS_FLUSHES,		UINT64, AVERAGE),
>  	X("num-fb-cache-flushes",	NUM_FB_CACHE_FLUSHES,	UINT64, AVERAGE),
>  	X("num-L2-invalidates",		NUM_L2_INVALIDATES,	UINT64, AVERAGE),
>  	X("num-L2-writebacks",		NUM_L2_WRITEBACKS,	UINT64, AVERAGE),
>  	X("requested-VRAM",		REQUESTED_VRAM,		BYTES, AVERAGE),
>  	X("requested-GTT",		REQUESTED_GTT,		BYTES, AVERAGE),
>  	X("mapped-VRAM",		MAPPED_VRAM,		BYTES, AVERAGE),
>  	X("mapped-GTT",			MAPPED_GTT,		BYTES, AVERAGE),
>  	X("buffer-wait-time",		BUFFER_WAIT_TIME,	MICROSECONDS, CUMULATIVE),
>  	X("num-GFX-IBs",		NUM_GFX_IBS,		UINT64, AVERAGE),
> +	X("num-SDMA-IBs",		NUM_SDMA_IBS,		UINT64, AVERAGE),
>  	X("num-bytes-moved",		NUM_BYTES_MOVED,	BYTES, CUMULATIVE),
>  	X("num-evictions",		NUM_EVICTIONS,		UINT64, CUMULATIVE),
>  	X("VRAM-usage",			VRAM_USAGE,		BYTES, AVERAGE),
>  	X("GTT-usage",			GTT_USAGE,		BYTES, AVERAGE),
>  	X("back-buffer-ps-draw-ratio",	BACK_BUFFER_PS_DRAW_RATIO, UINT64, AVERAGE),
>
>  	/* GPIN queries are for the benefit of old versions of GPUPerfStudio,
>  	 * which use it as a fallback path to detect the GPU type.
>  	 *
>  	 * Note: The names of these queries are significant for GPUPerfStudio
> diff --git a/src/gallium/drivers/radeon/r600_query.h b/src/gallium/drivers/radeon/r600_query.h
> index fffd9fe..3791ec6 100644
> --- a/src/gallium/drivers/radeon/r600_query.h
> +++ b/src/gallium/drivers/radeon/r600_query.h
> @@ -54,20 +54,21 @@ enum {
>  	R600_QUERY_NUM_CS_FLUSHES,
>  	R600_QUERY_NUM_FB_CACHE_FLUSHES,
>  	R600_QUERY_NUM_L2_INVALIDATES,
>  	R600_QUERY_NUM_L2_WRITEBACKS,
>  	R600_QUERY_REQUESTED_VRAM,
>  	R600_QUERY_REQUESTED_GTT,
>  	R600_QUERY_MAPPED_VRAM,
>  	R600_QUERY_MAPPED_GTT,
>  	R600_QUERY_BUFFER_WAIT_TIME,
>  	R600_QUERY_NUM_GFX_IBS,
> +	R600_QUERY_NUM_SDMA_IBS,
>  	R600_QUERY_NUM_BYTES_MOVED,
>  	R600_QUERY_NUM_EVICTIONS,
>  	R600_QUERY_VRAM_USAGE,
>  	R600_QUERY_GTT_USAGE,
>  	R600_QUERY_GPU_TEMPERATURE,
>  	R600_QUERY_CURRENT_GPU_SCLK,
>  	R600_QUERY_CURRENT_GPU_MCLK,
>  	R600_QUERY_GPU_LOAD,
>  	R600_QUERY_NUM_COMPILATIONS,
>  	R600_QUERY_NUM_SHADERS_CREATED,
> diff --git a/src/gallium/drivers/radeon/radeon_winsys.h b/src/gallium/drivers/radeon/radeon_winsys.h
> index 6c886cf..e6fb2d5 100644
> --- a/src/gallium/drivers/radeon/radeon_winsys.h
> +++ b/src/gallium/drivers/radeon/radeon_winsys.h
> @@ -76,20 +76,21 @@ 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_GFX_IBS,
> +    RADEON_NUM_SDMA_IBS,
>      RADEON_NUM_BYTES_MOVED,
>      RADEON_NUM_EVICTIONS,
>      RADEON_VRAM_USAGE,
>      RADEON_GTT_USAGE,
>      RADEON_GPU_TEMPERATURE, /* DRM 2.42.0 */
>      RADEON_CURRENT_SCLK,
>      RADEON_CURRENT_MCLK,
>      RADEON_GPU_RESET_COUNTER, /* DRM 2.43.0 */
>  };
>
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> index adb46c5..95402bf 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
> @@ -1197,21 +1197,25 @@ static int amdgpu_cs_flush(struct radeon_winsys_cs *rcs,
>
>     amdgpu_get_new_ib(&ws->base, cs, IB_MAIN);
>     if (cs->const_ib.ib_mapped)
>        amdgpu_get_new_ib(&ws->base, cs, IB_CONST);
>     if (cs->const_preamble_ib.ib_mapped)
>        amdgpu_get_new_ib(&ws->base, cs, IB_CONST_PREAMBLE);
>
>     cs->main.base.used_gart = 0;
>     cs->main.base.used_vram = 0;
>
> -   ws->num_gfx_IBs++;
> +   if (cs->ring_type == RING_GFX)
> +      ws->num_gfx_IBs++;
> +   else if (cs->ring_type == RING_DMA)
> +      ws->num_sdma_IBs++;
> +
>     return error_code;
>  }
>
>  static void amdgpu_cs_destroy(struct radeon_winsys_cs *rcs)
>  {
>     struct amdgpu_cs *cs = amdgpu_cs(rcs);
>
>     amdgpu_cs_sync_flush(rcs);
>     util_queue_fence_destroy(&cs->flush_completed);
>     p_atomic_dec(&cs->ctx->ws->num_cs);
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
> index 2ccc8e5..b950d37 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
> @@ -422,20 +422,22 @@ static uint64_t amdgpu_query_value(struct radeon_winsys *rws,
>        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:
>        amdgpu_query_info(ws->dev, AMDGPU_INFO_TIMESTAMP, 8, &retval);
>        return retval;
>     case RADEON_NUM_GFX_IBS:
>        return ws->num_gfx_IBs;
> +   case RADEON_NUM_SDMA_IBS:
> +      return ws->num_sdma_IBs;
>     case RADEON_NUM_BYTES_MOVED:
>        amdgpu_query_info(ws->dev, AMDGPU_INFO_NUM_BYTES_MOVED, 8, &retval);
>        return retval;
>     case RADEON_NUM_EVICTIONS:
>        amdgpu_query_info(ws->dev, AMDGPU_INFO_NUM_EVICTIONS, 8, &retval);
>        return retval;
>     case RADEON_VRAM_USAGE:
>        amdgpu_query_heap_info(ws->dev, AMDGPU_GEM_DOMAIN_VRAM, 0, &heap);
>        return heap.heap_usage;
>     case RADEON_GTT_USAGE:
> diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h
> index 6746079..2a7900a 100644
> --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h
> +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.h
> @@ -55,20 +55,21 @@ struct amdgpu_winsys {
>     pipe_mutex bo_fence_lock;
>
>     int num_cs; /* The number of command streams created. */
>     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_gfx_IBs;
> +   uint64_t num_sdma_IBs;
>
>     struct radeon_info info;
>
>     /* multithreaded IB submission */
>     struct util_queue cs_queue;
>
>     struct amdgpu_gpu_info amdinfo;
>     ADDR_HANDLE addrlib;
>     uint32_t rev_id;
>     unsigned family;
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> index ab1ca06..8f9e8a6 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> @@ -684,21 +684,24 @@ static int radeon_drm_cs_flush(struct radeon_winsys_cs *rcs,
>      } else {
>          radeon_cs_context_cleanup(cs->cst);
>      }
>
>      /* Prepare a new CS. */
>      cs->base.current.buf = cs->csc->buf;
>      cs->base.current.cdw = 0;
>      cs->base.used_vram = 0;
>      cs->base.used_gart = 0;
>
> -    cs->ws->num_gfx_IBs++;
> +    if (cs->ring_type == RING_GFX)
> +        cs->ws->num_gfx_IBs++;
> +    else if (cs->ring_type == RING_DMA)
> +        cs->ws->num_sdma_IBs++;
>      return 0;
>  }
>
>  static void radeon_drm_cs_destroy(struct radeon_winsys_cs *rcs)
>  {
>      struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
>
>      radeon_drm_cs_sync_flush(rcs);
>      util_queue_fence_destroy(&cs->flush_completed);
>      radeon_cs_context_cleanup(&cs->csc1);
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> index 1b2f9b1..c85e427 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
> @@ -618,20 +618,22 @@ static uint64_t radeon_query_value(struct radeon_winsys *rws,
>          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);
>          return retval;
>      case RADEON_NUM_GFX_IBS:
>          return ws->num_gfx_IBs;
> +    case RADEON_NUM_SDMA_IBS:
> +        return ws->num_sdma_IBs;
>      case RADEON_NUM_BYTES_MOVED:
>          radeon_get_drm_value(ws->fd, RADEON_INFO_NUM_BYTES_MOVED,
>                               "num-bytes-moved", (uint32_t*)&retval);
>          return retval;
>      case RADEON_NUM_EVICTIONS:
>          return 0; /* unimplemented */
>      case RADEON_VRAM_USAGE:
>          radeon_get_drm_value(ws->fd, RADEON_INFO_VRAM_USAGE,
>                               "vram-usage", (uint32_t*)&retval);
>          return retval;
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
> index 137a9f4..ac623a1 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
> @@ -73,20 +73,21 @@ struct radeon_drm_winsys {
>      struct pb_slabs bo_slabs;
>
>      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_gfx_IBs;
> +    uint64_t num_sdma_IBs;
>      uint32_t next_bo_hash;
>
>      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. */
>      struct util_hash_table *bo_names;
>


More information about the mesa-dev mailing list