diff options
author | Mark Janes <[email protected]> | 2019-06-28 15:11:20 -0700 |
---|---|---|
committer | Mark Janes <[email protected]> | 2019-08-07 21:33:56 -0700 |
commit | 3ecb23092e179a84acbe51c9a11988fa8ff30f34 (patch) | |
tree | 07882ee150bd1152a62c0c1c78929ce99dc5d1c4 /src/intel/perf | |
parent | 018f9b81e57f735d699706c94b532a46d5667e28 (diff) |
intel/perf: refactor gen_perf_end_query into gen_perf
Reviewed-by: Kenneth Graunke <[email protected]>
Diffstat (limited to 'src/intel/perf')
-rw-r--r-- | src/intel/perf/gen_perf.c | 54 | ||||
-rw-r--r-- | src/intel/perf/gen_perf.h | 2 |
2 files changed, 56 insertions, 0 deletions
diff --git a/src/intel/perf/gen_perf.c b/src/intel/perf/gen_perf.c index 26f6da88d90..76caefe6bd0 100644 --- a/src/intel/perf/gen_perf.c +++ b/src/intel/perf/gen_perf.c @@ -44,6 +44,8 @@ #define FILE_DEBUG_FLAG DEBUG_PERFMON #define MI_RPC_BO_SIZE 4096 #define MI_FREQ_START_OFFSET_BYTES (3072) +#define MI_RPC_BO_END_OFFSET_BYTES (MI_RPC_BO_SIZE / 2) +#define MI_FREQ_END_OFFSET_BYTES (3076) #define MAP_READ (1 << 0) #define MAP_WRITE (1 << 1) @@ -1283,3 +1285,55 @@ gen_perf_begin_query(struct gen_perf_context *perf_ctx, return true; } + +void +gen_perf_end_query(struct gen_perf_context *perf_ctx, + struct gen_perf_query_object *query) +{ + struct gen_perf_config *perf_cfg = perf_ctx->perf; + + /* Ensure that the work associated with the queried commands will have + * finished before taking our query end counter readings. + * + * For more details see comment in brw_begin_perf_query for + * corresponding flush. + */ + perf_cfg->vtbl.emit_mi_flush(perf_ctx->ctx); + + switch (query->queryinfo->kind) { + case GEN_PERF_QUERY_TYPE_OA: + case GEN_PERF_QUERY_TYPE_RAW: + + /* NB: It's possible that the query will have already been marked + * as 'accumulated' if an error was seen while reading samples + * from perf. In this case we mustn't try and emit a closing + * MI_RPC command in case the OA unit has already been disabled + */ + if (!query->oa.results_accumulated) { + /* Take an ending OA counter snapshot. */ + perf_cfg->vtbl.capture_frequency_stat_register(perf_ctx->ctx, query->oa.bo, + MI_FREQ_END_OFFSET_BYTES); + perf_cfg->vtbl.emit_mi_report_perf_count(perf_ctx->ctx, query->oa.bo, + MI_RPC_BO_END_OFFSET_BYTES, + query->oa.begin_report_id + 1); + } + + --perf_ctx->n_active_oa_queries; + + /* NB: even though the query has now ended, it can't be accumulated + * until the end MI_REPORT_PERF_COUNT snapshot has been written + * to query->oa.bo + */ + break; + + case GEN_PERF_QUERY_TYPE_PIPELINE: + gen_perf_snapshot_statistics_registers(perf_ctx->ctx, perf_cfg, query, + STATS_BO_END_OFFSET_BYTES); + --perf_ctx->n_active_pipeline_stats_queries; + break; + + default: + unreachable("Unknown query type"); + break; + } +} diff --git a/src/intel/perf/gen_perf.h b/src/intel/perf/gen_perf.h index 212a4094620..4ca449c36a7 100644 --- a/src/intel/perf/gen_perf.h +++ b/src/intel/perf/gen_perf.h @@ -619,5 +619,7 @@ void gen_perf_dec_n_users(struct gen_perf_context *perfquery); bool gen_perf_begin_query(struct gen_perf_context *perf_ctx, struct gen_perf_query_object *query); +void gen_perf_end_query(struct gen_perf_context *perf_ctx, + struct gen_perf_query_object *query); #endif /* GEN_PERF_H */ |