r300g: Rudimentary stats, printed on exit.
authorCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 26 Apr 2010 14:13:15 +0000 (07:13 -0700)
committerCorbin Simpson <MostAwesomeDude@gmail.com>
Mon, 26 Apr 2010 14:13:51 +0000 (07:13 -0700)
Whoo!

src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_cs.h
src/gallium/drivers/r300/r300_emit.c

index deaa03e1f616e44c346358f543900ca15e7abf2e..43a42490a0471ed47bc98f9d3ffb3c8402d419dc 100644 (file)
@@ -41,10 +41,21 @@ static void r300_destroy_context(struct pipe_context* context)
 {
     struct r300_context* r300 = r300_context(context);
     struct r300_query* query, * temp;
+    struct r300_atom *atom;
 
     util_blitter_destroy(r300->blitter);
     draw_destroy(r300->draw);
 
+    /* Print stats, if enabled. */
+    if (SCREEN_DBG_ON(r300->screen, DBG_STATS)) {
+        fprintf(stderr, "r300: Stats for context %p:\n", r300);
+        fprintf(stderr, "    : Flushes: %llu\n", r300->flush_counter);
+        foreach(atom, &r300->atom_list) {
+            fprintf(stderr, "    : %s: %llu emits\n",
+                atom->name, atom->counter);
+        }
+    }
+
     /* Free the OQ BO. */
     context->screen->resource_destroy(context->screen, r300->oqbo);
 
index 1e4fd9e5edd7d73b8e20cd279e47dfde43a927d3..b6e20591eda682c42469c028f17b32af454f4f93 100644 (file)
@@ -45,6 +45,8 @@ struct r300_atom {
     struct r300_atom *prev, *next;
     /* Name, for debugging. */
     const char* name;
+    /* Stat counter. */
+    uint64_t counter;
     /* Opaque state. */
     void* state;
     /* Emit the state to the context. */
@@ -435,6 +437,9 @@ struct r300_context {
     /* upload managers */
     struct u_upload_mgr *upload_vb;
     struct u_upload_mgr *upload_ib;
+
+    /* Stat counter. */
+    uint64_t flush_counter;
 };
 
 /* Convenience cast wrapper. */
index 96f2825b6d6deb624bc1df22f91db9367a9b9f3a..996a4f491e7c5c6ecdb493a05c4cf66c056a01a3 100644 (file)
         DBG(cs_context_copy, DBG_CS, "r300: FLUSH_CS in %s (%s:%d)\n\n", __FUNCTION__, \
                 __FILE__, __LINE__); \
     } \
+    if (SCREEN_DBG_ON(r300->screen, DBG_STATS)) { \
+        r300->flush_counter++; \
+    } \
     cs_winsys->flush_cs(cs_winsys); \
 } while (0)
 
index a6716db8dea4ba7513acc5919e2913d4acc6b0e0..2816c35fd30733e795a806f8533a67d82b1f69db 100644 (file)
@@ -1187,6 +1187,9 @@ void r300_emit_dirty_state(struct r300_context* r300)
     foreach(atom, &r300->atom_list) {
         if (atom->dirty) {
             atom->emit(r300, atom->size, atom->state);
+            if (SCREEN_DBG_ON(r300->screen, DBG_STATS)) {
+                atom->counter++;
+            }
             atom->dirty = FALSE;
         }
     }