summaryrefslogtreecommitdiff
path: root/tools/intel_gpu_top.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-02-25 12:18:11 -0800
committerEric Anholt <eric@anholt.net>2010-02-25 12:34:31 -0800
commit9271e2256d7e86989587b001715fccc30400180e (patch)
treebe2a71b326c2f280c974fd3b23b693c2236ec9de /tools/intel_gpu_top.c
parentc33f64ff955134aef2fc10cee4d48c6da4858549 (diff)
intel_gpu_top: Print the vertex/primitive statistics on gen4+.
This requires that the window be much wider. I'm not sure how we really want to lay out this interface usably, but so far giant windows are working well enough for me.
Diffstat (limited to 'tools/intel_gpu_top.c')
-rw-r--r--tools/intel_gpu_top.c72
1 files changed, 70 insertions, 2 deletions
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c
index b97a4f44..769777b2 100644
--- a/tools/intel_gpu_top.c
+++ b/tools/intel_gpu_top.c
@@ -58,6 +58,46 @@ static const char *bars[] = {
"█"
};
+enum stats_counts {
+ IA_VERTICES,
+ IA_PRIMITIVES,
+ VS_INVOCATION,
+ GS_INVOCATION,
+ GS_PRIMITIVES,
+ CL_INVOCATION,
+ CL_PRIMITIVES,
+ PS_INVOCATION,
+ PS_DEPTH,
+ STATS_COUNT
+};
+
+const uint32_t stats_regs[STATS_COUNT] = {
+ IA_VERTICES_COUNT_QW,
+ IA_PRIMITIVES_COUNT_QW,
+ VS_INVOCATION_COUNT_QW,
+ GS_INVOCATION_COUNT_QW,
+ GS_PRIMITIVES_COUNT_QW,
+ CL_INVOCATION_COUNT_QW,
+ CL_PRIMITIVES_COUNT_QW,
+ PS_INVOCATION_COUNT_QW,
+ PS_DEPTH_COUNT_QW,
+};
+
+const char *stats_reg_names[STATS_COUNT] = {
+ "vert fetch",
+ "prim fetch",
+ "VS invocations",
+ "GS invocations",
+ "GS prims",
+ "CL invocations",
+ "CL prims",
+ "PS invocations",
+ "PS depth pass",
+};
+
+uint64_t stats[STATS_COUNT];
+uint64_t last_stats[STATS_COUNT];
+
static int
top_bits_sort(const void *a, const void *b)
{
@@ -218,7 +258,9 @@ print_clock_info(void)
return -1;
}
-#define PERCENTAGE_BAR_END 79
+#define STATS_LEN (20)
+#define PERCENTAGE_BAR_END (79 - STATS_LEN)
+
static void
print_percentage_bar(float percent, int cur_line_len)
{
@@ -237,7 +279,7 @@ print_percentage_bar(float percent, int cur_line_len)
/* NB: We can't use a field width with utf8 so we manually
* guarantee a field with of 45 chars for any bar. */
- printf("%*s\n", PERCENTAGE_BAR_END - cur_line_len, "");
+ printf("%*s", PERCENTAGE_BAR_END - cur_line_len, "");
}
int main(int argc, char **argv)
@@ -293,6 +335,21 @@ int main(int argc, char **argv)
usleep(1000000 / SAMPLES_PER_SEC);
}
+ if (IS_GEN4(devid) || IS_GEN6(devid)) {
+ for (i = 0; i < STATS_COUNT; i++) {
+ uint32_t stats_high, stats_low, stats_high_2;
+
+ do {
+ stats_high = INREG(stats_regs[i] + 4);
+ stats_low = INREG(stats_regs[i]);
+ stats_high_2 = INREG(stats_regs[i] + 4);
+ } while (stats_high != stats_high_2);
+
+ stats[i] = (uint64_t)stats_high << 32 |
+ stats_low;
+ }
+ }
+
qsort(top_bits_sorted, num_instdone_bits,
sizeof(struct top_bit *), top_bits_sort);
@@ -329,6 +386,17 @@ int main(int argc, char **argv)
print_percentage_bar (percent, len);
}
+
+ if (i < STATS_COUNT &&
+ (IS_GEN4(devid) || IS_GEN6(devid))) {
+ printf("%13s: %llu (%lld/sec)",
+ stats_reg_names[i],
+ stats[i],
+ stats[i] - last_stats[i]);
+ last_stats[i] = stats[i];
+ }
+ printf("\n");
+
top_bits_sorted[i]->count = 0;
}
}