summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMark Janes <[email protected]>2019-07-02 14:21:57 -0700
committerMark Janes <[email protected]>2019-08-07 21:33:55 -0700
commit439d5a3eff188b4e0be42fd6da3a4d233fffcbf3 (patch)
treece7860263b99a1e80828c6a47c001dadec48aafd /src
parentea66484e8604edf75df9f95c9e94b73f1e80639d (diff)
intel/perf: create a vtable for low-level driver functions
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/intel/perf/gen_perf.h4
-rw-r--r--src/mesa/drivers/dri/i965/brw_performance_query.c19
2 files changed, 19 insertions, 4 deletions
diff --git a/src/intel/perf/gen_perf.h b/src/intel/perf/gen_perf.h
index f6de5caf8c9..fa7d7f87c57 100644
--- a/src/intel/perf/gen_perf.h
+++ b/src/intel/perf/gen_perf.h
@@ -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
diff --git a/src/mesa/drivers/dri/i965/brw_performance_query.c b/src/mesa/drivers/dri/i965/brw_performance_query.c
index 5a3794a113e..190769b92cc 100644
--- a/src/mesa/drivers/dri/i965/brw_performance_query.c
+++ b/src/mesa/drivers/dri/i965/brw_performance_query.c
@@ -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);