mesa: Track whether a performance monitor has ever ended.
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 14 Nov 2013 01:12:37 +0000 (17:12 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 18 Nov 2013 02:51:07 +0000 (18:51 -0800)
If a monitor has ended, it means a result should eventually become
available, pending some flushing.

This is distinct from !m->Active; if a monitor has not been started,
then m->Active == false and m->Ended == false.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/mtypes.h
src/mesa/main/performance_monitor.c

index 926d94860994c6c09e5da2e1f6b16ec4d44fb6d4..8801d6f61523762cf0b71e9b3f3bc4086d3954a7 100644 (file)
@@ -1848,8 +1848,16 @@ struct gl_perf_monitor_object
 {
    GLuint Name;
 
+   /** True if the monitor is currently active (Begin called but not End). */
    GLboolean Active;
 
+   /**
+    * True if the monitor has ended.
+    *
+    * This is distinct from !Active because it may never have began.
+    */
+   GLboolean Ended;
+
    /**
     * A list of groups with currently active counters.
     *
index 5a295b170fdd044e039ad7e0e8cbdcbc5fdf5b3a..c168bf5d423e80643a82896eaddee3327d17f43e 100644 (file)
@@ -359,8 +359,10 @@ _mesa_DeletePerfMonitorsAMD(GLsizei n, GLuint *monitors)
 
       if (m) {
          /* Give the driver a chance to stop the monitor if it's active. */
-         if (m->Active)
+         if (m->Active) {
             ctx->Driver.ResetPerfMonitor(ctx, m);
+            m->Ended = false;
+         }
 
          _mesa_HashRemove(ctx->PerfMonitor.Monitors, monitors[i]);
          ralloc_free(m->ActiveGroups);
@@ -478,6 +480,7 @@ _mesa_BeginPerfMonitorAMD(GLuint monitor)
     */
    if (ctx->Driver.BeginPerfMonitor(ctx, m)) {
       m->Active = true;
+      m->Ended = false;
    } else {
       _mesa_error(ctx, GL_INVALID_OPERATION,
                   "glBeginPerfMonitor(driver unable to begin monitoring)");
@@ -507,6 +510,7 @@ _mesa_EndPerfMonitorAMD(GLuint monitor)
    ctx->Driver.EndPerfMonitor(ctx, m);
 
    m->Active = false;
+   m->Ended = true;
 }
 
 /**