From: Mark Janes Date: Tue, 2 Jul 2019 21:21:57 +0000 (-0700) Subject: intel/perf: create a vtable for low-level driver functions X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=439d5a3eff188b4e0be42fd6da3a4d233fffcbf3;p=mesa.git 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 --- 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);