gallium/radeon: add GPIN driver query group
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 11 Dec 2015 20:39:23 +0000 (15:39 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 5 Feb 2016 14:24:59 +0000 (09:24 -0500)
This group was used by older versions of AMD GPUPerfStudio (via
AMD_performance_monitor) to identify the GPU family, and GPUPerfStudio
still complains when it isn't available.

Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
Acked-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeon/r600_query.c
src/gallium/drivers/radeon/r600_query.h

index 0aa19cd54fec66821e98b7b3a050ced7e594faac..f2094c693cb60ff15545f7f55bbdf69d9d480649 100644 (file)
@@ -100,6 +100,12 @@ static boolean r600_query_sw_begin(struct r600_common_context *rctx,
        case R600_QUERY_NUM_SHADERS_CREATED:
                query->begin_result = p_atomic_read(&rctx->screen->num_shaders_created);
                break;
+       case R600_QUERY_GPIN_ASIC_ID:
+       case R600_QUERY_GPIN_NUM_SIMD:
+       case R600_QUERY_GPIN_NUM_RB:
+       case R600_QUERY_GPIN_NUM_SPI:
+       case R600_QUERY_GPIN_NUM_SE:
+               break;
        default:
                unreachable("r600_query_sw_begin: bad query type");
        }
@@ -146,6 +152,12 @@ static void r600_query_sw_end(struct r600_common_context *rctx,
        case R600_QUERY_NUM_SHADERS_CREATED:
                query->end_result = p_atomic_read(&rctx->screen->num_shaders_created);
                break;
+       case R600_QUERY_GPIN_ASIC_ID:
+       case R600_QUERY_GPIN_NUM_SIMD:
+       case R600_QUERY_GPIN_NUM_RB:
+       case R600_QUERY_GPIN_NUM_SPI:
+       case R600_QUERY_GPIN_NUM_SE:
+               break;
        default:
                unreachable("r600_query_sw_end: bad query type");
        }
@@ -171,6 +183,22 @@ static boolean r600_query_sw_get_result(struct r600_common_context *rctx,
                                                 wait ? PIPE_TIMEOUT_INFINITE : 0);
                return result->b;
        }
+
+       case R600_QUERY_GPIN_ASIC_ID:
+               result->u32 = 0;
+               return TRUE;
+       case R600_QUERY_GPIN_NUM_SIMD:
+               result->u32 = rctx->screen->info.num_good_compute_units;
+               return TRUE;
+       case R600_QUERY_GPIN_NUM_RB:
+               result->u32 = rctx->screen->info.r600_num_backends;
+               return TRUE;
+       case R600_QUERY_GPIN_NUM_SPI:
+               result->u32 = 1; /* all supported chips have one SPI per SE */
+               return TRUE;
+       case R600_QUERY_GPIN_NUM_SE:
+               result->u32 = rctx->screen->info.max_se;
+               return TRUE;
        }
 
        result->u64 = query->end_result - query->begin_result;
@@ -1096,15 +1124,21 @@ err:
        return;
 }
 
-#define X(name_, query_type_, type_, result_type_) \
+#define XFULL(name_, query_type_, type_, result_type_, group_id_) \
        { \
                .name = name_, \
                .query_type = R600_QUERY_##query_type_, \
                .type = PIPE_DRIVER_QUERY_TYPE_##type_, \
                .result_type = PIPE_DRIVER_QUERY_RESULT_TYPE_##result_type_, \
-               .group_id = ~(unsigned)0 \
+               .group_id = group_id_ \
        }
 
+#define X(name_, query_type_, type_, result_type_) \
+       XFULL(name_, query_type_, type_, result_type_, ~(unsigned)0)
+
+#define XG(group_, name_, query_type_, type_, result_type_) \
+       XFULL(name_, query_type_, type_, result_type_, R600_QUERY_GROUP_##group_)
+
 static struct pipe_driver_query_info r600_driver_query_list[] = {
        X("num-compilations",           NUM_COMPILATIONS,       UINT64, CUMULATIVE),
        X("num-shaders-created",        NUM_SHADERS_CREATED,    UINT64, CUMULATIVE),
@@ -1116,6 +1150,20 @@ static struct pipe_driver_query_info r600_driver_query_list[] = {
        X("num-bytes-moved",            NUM_BYTES_MOVED,        BYTES, CUMULATIVE),
        X("VRAM-usage",                 VRAM_USAGE,             BYTES, AVERAGE),
        X("GTT-usage",                  GTT_USAGE,              BYTES, 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
+        * (and possibly their order as well). */
+       XG(GPIN, "GPIN_000",            GPIN_ASIC_ID,           UINT, AVERAGE),
+       XG(GPIN, "GPIN_001",            GPIN_NUM_SIMD,          UINT, AVERAGE),
+       XG(GPIN, "GPIN_002",            GPIN_NUM_RB,            UINT, AVERAGE),
+       XG(GPIN, "GPIN_003",            GPIN_NUM_SPI,           UINT, AVERAGE),
+       XG(GPIN, "GPIN_004",            GPIN_NUM_SE,            UINT, AVERAGE),
+
+       /* The following queries must be at the end of the list because their
+        * availability is adjusted dynamically based on the DRM version. */
        X("GPU-load",                   GPU_LOAD,               UINT64, AVERAGE),
        X("temperature",                GPU_TEMPERATURE,        UINT64, AVERAGE),
        X("shader-clock",               CURRENT_GPU_SCLK,       HZ, AVERAGE),
@@ -1123,6 +1171,8 @@ static struct pipe_driver_query_info r600_driver_query_list[] = {
 };
 
 #undef X
+#undef XG
+#undef XFULL
 
 static unsigned r600_get_num_queries(struct r600_common_screen *rscreen)
 {
@@ -1167,16 +1217,40 @@ static int r600_get_driver_query_info(struct pipe_screen *screen,
                break;
        }
 
+       if (info->group_id != ~(unsigned)0 && rscreen->perfcounters)
+               info->group_id += rscreen->perfcounters->num_groups;
+
        return 1;
 }
 
+/* Note: Unfortunately, GPUPerfStudio hardcodes the order of hardware
+ * performance counter groups, so be careful when changing this and related
+ * functions.
+ */
 static int r600_get_driver_query_group_info(struct pipe_screen *screen,
                                            unsigned index,
                                            struct pipe_driver_query_group_info *info)
 {
        struct r600_common_screen *rscreen = (struct r600_common_screen *)screen;
+       unsigned num_pc_groups = 0;
 
-       return r600_get_perfcounter_group_info(rscreen, index, info);
+       if (rscreen->perfcounters)
+               num_pc_groups = rscreen->perfcounters->num_groups;
+
+       if (!info)
+               return num_pc_groups + R600_NUM_SW_QUERY_GROUPS;
+
+       if (index < num_pc_groups)
+               return r600_get_perfcounter_group_info(rscreen, index, info);
+
+       index -= num_pc_groups;
+       if (index >= R600_NUM_SW_QUERY_GROUPS)
+               return 0;
+
+       info->name = "GPIN";
+       info->max_active_queries = 5;
+       info->num_queries = 5;
+       return 1;
 }
 
 void r600_query_init(struct r600_common_context *rctx)
index e5a98bfe5bd101aa61d0e493a955fe2c8f89016a..dbc950fed43e670df0fd34e6ec037ea15fd3d1c9 100644 (file)
@@ -54,8 +54,18 @@ struct r600_resource;
 #define R600_QUERY_GPU_LOAD            (PIPE_QUERY_DRIVER_SPECIFIC + 11)
 #define R600_QUERY_NUM_COMPILATIONS    (PIPE_QUERY_DRIVER_SPECIFIC + 12)
 #define R600_QUERY_NUM_SHADERS_CREATED (PIPE_QUERY_DRIVER_SPECIFIC + 13)
+#define R600_QUERY_GPIN_ASIC_ID                (PIPE_QUERY_DRIVER_SPECIFIC + 14)
+#define R600_QUERY_GPIN_NUM_SIMD       (PIPE_QUERY_DRIVER_SPECIFIC + 15)
+#define R600_QUERY_GPIN_NUM_RB         (PIPE_QUERY_DRIVER_SPECIFIC + 16)
+#define R600_QUERY_GPIN_NUM_SPI                (PIPE_QUERY_DRIVER_SPECIFIC + 17)
+#define R600_QUERY_GPIN_NUM_SE         (PIPE_QUERY_DRIVER_SPECIFIC + 18)
 #define R600_QUERY_FIRST_PERFCOUNTER   (PIPE_QUERY_DRIVER_SPECIFIC + 100)
 
+enum {
+       R600_QUERY_GROUP_GPIN = 0,
+       R600_NUM_SW_QUERY_GROUPS
+};
+
 struct r600_query_ops {
        void (*destroy)(struct r600_common_context *, struct r600_query *);
        boolean (*begin)(struct r600_common_context *, struct r600_query *);