diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_performance_query.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_performance_query.c b/src/mesa/drivers/dri/i965/brw_performance_query.c index 4af06185680..519c3ec2f99 100644 --- a/src/mesa/drivers/dri/i965/brw_performance_query.c +++ b/src/mesa/drivers/dri/i965/brw_performance_query.c @@ -832,6 +832,7 @@ accumulate_oa_reports(struct brw_context *brw, struct exec_node *first_samples_node; bool in_ctx = true; uint32_t ctx_id; + int out_duration = 0; assert(o->Ready); assert(obj->oa.map != NULL); @@ -903,13 +904,27 @@ accumulate_oa_reports(struct brw_context *brw, * of OA counters while any other context is acctive. */ if (brw->gen >= 8) { + if (in_ctx && report[2] != ctx_id) { DBG("i915 perf: Switch AWAY (observed by ID change)\n"); in_ctx = false; + out_duration = 0; } else if (in_ctx == false && report[2] == ctx_id) { DBG("i915 perf: Switch TO\n"); in_ctx = true; - add = false; + + /* From experimentation in IGT, we found that the OA unit + * might label some report as "idle" (using an invalid + * context ID), right after a report for a given context. + * Deltas generated by those reports actually belong to the + * previous context, even though they're not labelled as + * such. + * + * We didn't *really* Switch AWAY in the case that we e.g. + * saw a single periodic report while idle... + */ + if (out_duration >= 1) + add = false; } else if (in_ctx) { assert(report[2] == ctx_id); DBG("i915 perf: Continuation IN\n"); @@ -917,6 +932,7 @@ accumulate_oa_reports(struct brw_context *brw, assert(report[2] != ctx_id); DBG("i915 perf: Continuation OUT\n"); add = false; + out_duration++; } } |