intel/perf: create a vtable for low-level driver functions
authorMark Janes <mark.a.janes@intel.com>
Tue, 2 Jul 2019 21:21:57 +0000 (14:21 -0700)
committerMark Janes <mark.a.janes@intel.com>
Thu, 8 Aug 2019 04:33:55 +0000 (21:33 -0700)
Performance metrics collections requires several actions (eg bo_map())
that have different implementations for Iris and i965.  The perf
subsystem needs a vtable for each of these actions, so it can invoke
the corresponding implementation for each driver.

The first call to be added to the table is bo_alloc.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/intel/perf/gen_perf.h
src/mesa/drivers/dri/i965/brw_performance_query.c

index f6de5caf8c9da954188af644ba3dd1efb8dee546..fa7d7f87c5773cb073c9882db51107f86a06a252 100644 (file)
@@ -188,6 +188,10 @@ struct gen_perf_config {
 
    /* Location of the device's sysfs entry. */
    char sysfs_dev_dir[256];
+
+   struct {
+      void *(*bo_alloc)(void *bufmgr, const char *name, uint64_t size);
+   } vtbl;
 };
 
 static inline size_t
index 5a3794a113e9fc4ac058edfafe92162f1f9831a0..190769b92ccb424aba5010e5feb16c9217ec669a 100644 (file)
@@ -1124,8 +1124,9 @@ brw_begin_perf_query(struct gl_context *ctx,
       }
 
       obj->oa.bo =
-         brw_bo_alloc(brw->bufmgr, "perf. query OA MI_RPC bo", MI_RPC_BO_SIZE,
-                      BRW_MEMZONE_OTHER);
+         brw->perfquery.perf->vtbl.bo_alloc(brw->bufmgr,
+                                            "perf. query OA MI_RPC bo",
+                                            MI_RPC_BO_SIZE);
 #ifdef DEBUG
       /* Pre-filling the BO helps debug whether writes landed. */
       void *map = brw_bo_map(brw, obj->oa.bo, MAP_WRITE);
@@ -1182,8 +1183,9 @@ brw_begin_perf_query(struct gl_context *ctx,
       }
 
       obj->pipeline_stats.bo =
-         brw_bo_alloc(brw->bufmgr, "perf. query pipeline stats bo",
-                      STATS_BO_SIZE, BRW_MEMZONE_OTHER);
+         brw->perfquery.perf->vtbl.bo_alloc(brw->bufmgr,
+                                            "perf. query pipeline stats bo",
+                                            STATS_BO_SIZE);
 
       /* Take starting snapshots. */
       snapshot_statistics_registers(brw, obj, 0);
@@ -1723,6 +1725,12 @@ oa_metrics_kernel_support(int fd, const struct gen_device_info *devinfo)
    return false;
 }
 
+static void *
+brw_oa_bo_alloc(void *bufmgr, const char *name, uint64_t size)
+{
+   return brw_bo_alloc(bufmgr, name, size, BRW_MEMZONE_OTHER);
+}
+
 static unsigned
 brw_init_perf_query_info(struct gl_context *ctx)
 {
@@ -1735,6 +1743,9 @@ brw_init_perf_query_info(struct gl_context *ctx)
 
    brw->perfquery.perf = gen_perf_new(brw);
 
+   struct gen_perf_config *perf_cfg = brw->perfquery.perf;
+   perf_cfg->vtbl.bo_alloc = brw_oa_bo_alloc;
+
    init_pipeline_statistic_query_registers(brw);
    brw_perf_query_register_mdapi_statistic_query(brw);