i965: Track the number of monitors that need OA counters.
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 3 Nov 2013 02:44:49 +0000 (19:44 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Nov 2013 23:01:14 +0000 (15:01 -0800)
Using the OA counters requires some per-batch work.  When starting and
ending a batch, it's useful to know whether any monitors are actually
interested in OA data.

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

index 43d0bbf7a5e29e8c9609a5166d62abcc2dbf1531..cb92b282324b328a2017114f176afa4d6f8b00e2 100644 (file)
@@ -1403,6 +1403,9 @@ struct brw_context
       /** A map from pipeline statistics counter IDs to MMIO addresses. */
       const int *statistics_registers;
 
+      /** The number of active monitors using OA counters. */
+      unsigned oa_users;
+
       /**
        * Mapping from a uint32_t offset within an OA snapshot to the ID of
        * the counter which MI_REPORT_PERF_COUNT stores there.
index 850dba78abc4d3631396ddcc6040c196cdbbba51..1e04938ad76299ecc20d0126790283ffaab2ac84 100644 (file)
@@ -518,7 +518,7 @@ void
 brw_dump_perf_monitors(struct brw_context *brw)
 {
    struct gl_context *ctx = &brw->ctx;
-   DBG("Monitors:\n");
+   DBG("Monitors: (OA users = %d)\n", brw->perfmon.oa_users);
    _mesa_HashWalk(ctx->PerfMonitor.Monitors, dump_perf_monitor_callback, brw);
 }
 
@@ -588,6 +588,13 @@ gather_statistics_results(struct brw_context *brw,
 
 /******************************************************************************/
 
+static bool
+monitor_needs_oa(struct brw_context *brw,
+                 struct gl_perf_monitor_object *m)
+{
+   return m->ActiveGroups[OA_COUNTERS];
+}
+
 /**
  * Initialize a monitor to sane starting state; throw away old buffers.
  */
@@ -618,6 +625,10 @@ brw_begin_perf_monitor(struct gl_context *ctx,
 
    reinitialize_perf_monitor(brw, monitor);
 
+   if (monitor_needs_oa(brw, m)) {
+      ++brw->perfmon.oa_users;
+   }
+
    if (monitor_needs_statistics_registers(brw, m)) {
       monitor->pipeline_stats_bo =
          drm_intel_bo_alloc(brw->bufmgr, "perf. monitor stats bo", 4096, 64);
@@ -641,6 +652,10 @@ brw_end_perf_monitor(struct gl_context *ctx,
 
    DBG("End(%d)\n", m->Name);
 
+   if (monitor_needs_oa(brw, m)) {
+      --brw->perfmon.oa_users;
+   }
+
    if (monitor_needs_statistics_registers(brw, m)) {
       /* Take ending snapshots. */
       snapshot_statistics_registers(brw, monitor,