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);
* 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");
assert(report[2] != ctx_id);
DBG("i915 perf: Continuation OUT\n");
add = false;
+ out_duration++;
}
}