summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/i965/brw_performance_query.c18
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++;
}
}