summaryrefslogtreecommitdiff
path: root/overlay/overlay.c
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2013-08-17 20:04:11 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2013-08-17 20:04:11 +0100
commitcbbd55af154f88fdd2c58c0398408f242124b005 (patch)
tree737cb01bce34240647617aa33d71b6f14c248458 /overlay/overlay.c
parentbe9937b65cbc7ba06f972b68db2a80c2100c4141 (diff)
overlay: Track requests per-process
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'overlay/overlay.c')
-rw-r--r--overlay/overlay.c118
1 files changed, 87 insertions, 31 deletions
diff --git a/overlay/overlay.c b/overlay/overlay.c
index c0790042..0bd57920 100644
--- a/overlay/overlay.c
+++ b/overlay/overlay.c
@@ -1,4 +1,3 @@
-#include <X11/Xlib.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <cairo.h>
@@ -7,6 +6,7 @@
#include <stdbool.h>
#include <string.h>
#include <unistd.h>
+#include <fcntl.h>
#include <errno.h>
#include "overlay.h"
@@ -52,6 +52,11 @@ static void overlay_hide(cairo_surface_t *surface)
}
#endif
+struct overlay_context {
+ cairo_t *cr;
+ int last_y;
+};
+
struct overlay_gpu_top {
struct gpu_top gpu_top;
struct chart busy[MAX_RINGS];
@@ -100,7 +105,7 @@ static void init_gpu_top(struct overlay_gpu_top *gt,
}
}
-static void show_gpu_top(cairo_t *cr, struct overlay_gpu_top *gt)
+static void show_gpu_top(struct overlay_context *ctx, struct overlay_gpu_top *gt)
{
int y, n, update;
@@ -109,16 +114,16 @@ static void show_gpu_top(cairo_t *cr, struct overlay_gpu_top *gt)
if (update)
chart_add_sample(&gt->wait[n],
gt->gpu_top.ring[n].u.u.wait + gt->gpu_top.ring[n].u.u.sema);
- chart_draw(&gt->wait[n], cr);
+ chart_draw(&gt->wait[n], ctx->cr);
}
for (n = 0; n < gt->gpu_top.num_rings; n++) {
if (update)
chart_add_sample(&gt->busy[n],
gt->gpu_top.ring[n].u.u.busy);
- chart_draw(&gt->busy[n], cr);
+ chart_draw(&gt->busy[n], ctx->cr);
}
- cairo_set_source_rgb(cr, 1, 1, 1);
+ cairo_set_source_rgb(ctx->cr, 1, 1, 1);
y = 12;
for (n = 0; n < gt->gpu_top.num_rings; n++) {
@@ -135,10 +140,12 @@ static void show_gpu_top(cairo_t *cr, struct overlay_gpu_top *gt)
len += sprintf(txt + len, ", %d%% sema",
gt->gpu_top.ring[n].u.u.sema);
- cairo_move_to(cr, 12, y);
- cairo_show_text(cr, txt);
+ cairo_move_to(ctx->cr, 12, y);
+ cairo_show_text(ctx->cr, txt);
y += 14;
}
+
+ ctx->last_y = 112;
}
struct overlay_gpu_perf {
@@ -146,29 +153,75 @@ struct overlay_gpu_perf {
};
static void init_gpu_perf(struct overlay_gpu_perf *gp,
- cairo_surface_t *surface)
+ cairo_surface_t *surface)
{
gpu_perf_init(&gp->gpu_perf, 0);
}
-static void show_gpu_perf(cairo_t *cr, struct overlay_gpu_perf *gp)
+static char *get_comm(pid_t pid, char *comm, int len)
+{
+ char filename[1024];
+ int fd;
+
+ *comm = '\0';
+ snprintf(filename, sizeof(filename), "/proc/%d/comm", pid);
+
+ fd = open(filename, 0);
+ if (fd >= 0) {
+ len = read(fd, comm, len-1);
+ if (len >= 0)
+ comm[len-1] = '\0';
+ close(fd);
+ }
+
+ return comm;
+}
+
+static void show_gpu_perf(struct overlay_context *ctx, struct overlay_gpu_perf *gp)
{
+ struct gpu_perf_comm *comm, **prev;
+ const char *ring_name[] = {
+ "render",
+ "video",
+ "blt",
+ };
char buf[1024];
- int y;
+ int y, n;
gpu_perf_update(&gp->gpu_perf);
- y = 130;
+ y = ctx->last_y + 18;
+
+ for (prev = &gp->gpu_perf.comm; (comm = *prev) != NULL; ) {
+ cairo_move_to(ctx->cr, 12, y);
+ sprintf(buf, "%s:", comm->name);
+ cairo_show_text(ctx->cr, buf);
+ for (n = 0; n < 3; n++) {
+ if (comm->nr_requests[n] == 0)
+ continue;
+ sprintf(buf, " %d %s", comm->nr_requests[n], ring_name[n]);
+ cairo_show_text(ctx->cr, buf);
+ }
+ y += 14;
+
+ memset(comm->nr_requests, 0, sizeof(comm->nr_requests));
+ if (strcmp(comm->name, get_comm(comm->pid, buf, sizeof(buf)))) {
+ *prev = comm->next;
+ free(comm);
+ } else
+ prev = &comm->next;
+ }
sprintf(buf, "Flips: %d", gp->gpu_perf.flip_complete);
- cairo_move_to(cr, 12, y);
- cairo_show_text(cr, buf);
+ gp->gpu_perf.flip_complete = 0;
+ cairo_move_to(ctx->cr, 12, y);
+ cairo_show_text(ctx->cr, buf);
y += 14;
- gp->gpu_perf.flip_complete = 0;
+ ctx->last_y = y;
}
-static void show_gem_objects(cairo_t *cr)
+static void show_gem_objects(struct overlay_context *ctx)
{
char gem_objects[1024], *s, *t, *end;
int len, y;
@@ -177,7 +230,7 @@ static void show_gem_objects(cairo_t *cr)
if (len <= 0)
return;
- y = 150;
+ y = ctx->last_y + 18;
s = gem_objects;
end = s + len - 1;
@@ -187,12 +240,14 @@ static void show_gem_objects(cairo_t *cr)
t = end;
*t = '\0';
- cairo_move_to(cr, 12, y);
- cairo_show_text(cr, s);
+ cairo_move_to(ctx->cr, 12, y);
+ cairo_show_text(ctx->cr, s);
y += 14;
s = t+1;
}
+
+ ctx->last_y = y;
}
int main(int argc, char **argv)
@@ -215,32 +270,33 @@ int main(int argc, char **argv)
init_gpu_perf(&gpu_perf, surface);
while (1) {
- cairo_t *cr;
+ struct overlay_context ctx;
usleep(500*1000);
- cr = cairo_create(surface);
- cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
- cairo_paint(cr);
- cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
+ ctx.cr = cairo_create(surface);
+ cairo_set_operator(ctx.cr, CAIRO_OPERATOR_CLEAR);
+ cairo_paint(ctx.cr);
+ cairo_set_operator(ctx.cr, CAIRO_OPERATOR_OVER);
+ ctx.last_y = 6;
{
char buf[80];
cairo_text_extents_t extents;
sprintf(buf, "%d", i++);
- cairo_set_source_rgb(cr, .5, .5, .5);
- cairo_text_extents(cr, buf, &extents);
- cairo_move_to(cr,
+ cairo_set_source_rgb(ctx.cr, .5, .5, .5);
+ cairo_text_extents(ctx.cr, buf, &extents);
+ cairo_move_to(ctx.cr,
cairo_image_surface_get_width(surface)-extents.width-6,
6+extents.height);
- cairo_show_text(cr, buf);
+ cairo_show_text(ctx.cr, buf);
}
- show_gpu_top(cr, &gpu_top);
- show_gpu_perf(cr, &gpu_perf);
- show_gem_objects(cr);
+ show_gpu_top(&ctx, &gpu_top);
+ show_gpu_perf(&ctx, &gpu_perf);
+ show_gem_objects(&ctx);
- cairo_destroy(cr);
+ cairo_destroy(ctx.cr);
overlay_show(surface);
}