i965: Fix OACONTROL assertion failures on Ironlake.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 27 Nov 2013 00:32:13 +0000 (16:32 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 4 Dec 2013 00:24:49 +0000 (16:24 -0800)
I guarded half of the callers to start/stop_oa_counters with generation
checks, but missed the other half (which were added later).  OACONTROL
doesn't exist on Ironlake, so we better not write it.  Also, there's no
need---Ironlake's performance counters are always running.

This patch moves the generation checks into start/stop_oa_counters,
rather than requiring the caller to do them.

Fixes assertion failures in Piglit's AMD_performance_monitor/measure.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_performance_monitor.c

index 9bddd8edf89bbd567824239f71af4a3846bc6b72..ff3cb97b1e1a4b29af53e6801d49b02e6a53307d 100644 (file)
@@ -642,6 +642,8 @@ start_oa_counters(struct brw_context *brw)
 
    /* Pick the counter format which gives us all the counters. */
    switch (brw->gen) {
+   case 5:
+      return; /* Ironlake counters are always running. */
    case 6:
       counter_format = 1; /* 0b001 */
       break;
@@ -667,6 +669,10 @@ start_oa_counters(struct brw_context *brw)
 static void
 stop_oa_counters(struct brw_context *brw)
 {
+   /* Ironlake counters never stop. */
+   if (brw->gen == 5)
+      return;
+
    BEGIN_BATCH(3);
    OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2));
    OUT_BATCH(OACONTROL);
@@ -1367,8 +1373,7 @@ brw_perf_monitor_new_batch(struct brw_context *brw)
    if (brw->perfmon.oa_users == 0)
       return;
 
-   if (brw->gen >= 6)
-      start_oa_counters(brw);
+   start_oa_counters(brw);
 
    /* Make sure bookend_bo has enough space for a pair of snapshots.
     * If not, "wrap" the BO: gather up any results so far, and start from
@@ -1405,8 +1410,7 @@ brw_perf_monitor_finish_batch(struct brw_context *brw)
 
    emit_bookend_snapshot(brw);
 
-   if (brw->gen >= 6)
-      stop_oa_counters(brw);
+   stop_oa_counters(brw);
 }
 
 /******************************************************************************/