diff options
author | Eric Anholt <eric@anholt.net> | 2010-02-25 12:18:11 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-02-25 12:34:31 -0800 |
commit | 9271e2256d7e86989587b001715fccc30400180e (patch) | |
tree | be2a71b326c2f280c974fd3b23b693c2236ec9de /tools/intel_gpu_top.c | |
parent | c33f64ff955134aef2fc10cee4d48c6da4858549 (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.c | 72 |
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; } } |