summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-06-21 21:32:35 +0200
committerMarek Olšák <[email protected]>2017-06-26 02:17:03 +0200
commit09f6915bf89759945fdb05d96473affe5f9ed9fe (patch)
tree7266766b0fbdd0853a453404d016e95c98547a66 /src/gallium/auxiliary
parent8f4bc8a3240de6255ead042704b80a18ebcf0973 (diff)
gallium/hud: add glthread counters
Reviewed-by: Timothy Arceri <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r--src/gallium/auxiliary/hud/hud_context.c9
-rw-r--r--src/gallium/auxiliary/hud/hud_cpu.c74
-rw-r--r--src/gallium/auxiliary/hud/hud_private.h8
3 files changed, 91 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c
index 9ab78223662..8172313605d 100644
--- a/src/gallium/auxiliary/hud/hud_context.c
+++ b/src/gallium/auxiliary/hud/hud_context.c
@@ -1153,6 +1153,15 @@ hud_parse_env_var(struct hud_context *hud, const char *env)
else if (strcmp(name, "API-thread-busy") == 0) {
hud_thread_busy_install(pane, name, false);
}
+ else if (strcmp(name, "API-thread-offloaded-slots") == 0) {
+ hud_thread_counter_install(pane, name, HUD_COUNTER_OFFLOADED);
+ }
+ else if (strcmp(name, "API-thread-direct-slots") == 0) {
+ hud_thread_counter_install(pane, name, HUD_COUNTER_DIRECT);
+ }
+ else if (strcmp(name, "API-thread-num-syncs") == 0) {
+ hud_thread_counter_install(pane, name, HUD_COUNTER_SYNCS);
+ }
else if (strcmp(name, "main-thread-busy") == 0) {
hud_thread_busy_install(pane, name, true);
}
diff --git a/src/gallium/auxiliary/hud/hud_cpu.c b/src/gallium/auxiliary/hud/hud_cpu.c
index 38403f9f78a..4caaab6977e 100644
--- a/src/gallium/auxiliary/hud/hud_cpu.c
+++ b/src/gallium/auxiliary/hud/hud_cpu.c
@@ -307,3 +307,77 @@ hud_thread_busy_install(struct hud_pane *pane, const char *name, bool main)
hud_pane_add_graph(pane, gr);
hud_pane_set_max_value(pane, 100);
}
+
+struct counter_info {
+ enum hud_counter counter;
+ unsigned last_value;
+ int64_t last_time;
+};
+
+static unsigned get_counter(struct hud_graph *gr, enum hud_counter counter)
+{
+ struct util_queue_monitoring *mon = gr->pane->hud->monitored_queue;
+
+ if (!mon || !mon->queue)
+ return 0;
+
+ switch (counter) {
+ case HUD_COUNTER_OFFLOADED:
+ return mon->num_offloaded_items;
+ case HUD_COUNTER_DIRECT:
+ return mon->num_direct_items;
+ case HUD_COUNTER_SYNCS:
+ return mon->num_syncs;
+ default:
+ assert(0);
+ return 0;
+ }
+}
+
+static void
+query_thread_counter(struct hud_graph *gr)
+{
+ struct counter_info *info = gr->query_data;
+ int64_t now = os_time_get_nano();
+
+ if (info->last_time) {
+ if (info->last_time + gr->pane->period*1000 <= now) {
+ unsigned current_value = get_counter(gr, info->counter);
+
+ hud_graph_add_value(gr, current_value - info->last_value);
+ info->last_value = current_value;
+ info->last_time = now;
+ }
+ } else {
+ /* initialize */
+ info->last_value = get_counter(gr, info->counter);
+ info->last_time = now;
+ }
+}
+
+void hud_thread_counter_install(struct hud_pane *pane, const char *name,
+ enum hud_counter counter)
+{
+ struct hud_graph *gr = CALLOC_STRUCT(hud_graph);
+ if (!gr)
+ return;
+
+ strcpy(gr->name, name);
+
+ gr->query_data = CALLOC_STRUCT(counter_info);
+ if (!gr->query_data) {
+ FREE(gr);
+ return;
+ }
+
+ ((struct counter_info*)gr->query_data)->counter = counter;
+ gr->query_new_value = query_thread_counter;
+
+ /* Don't use free() as our callback as that messes up Gallium's
+ * memory debugger. Use simple free_query_data() wrapper.
+ */
+ gr->free_query_data = free_query_data;
+
+ hud_pane_add_graph(pane, gr);
+ hud_pane_set_max_value(pane, 100);
+}
diff --git a/src/gallium/auxiliary/hud/hud_private.h b/src/gallium/auxiliary/hud/hud_private.h
index b8726da7342..2b1717d2c4a 100644
--- a/src/gallium/auxiliary/hud/hud_private.h
+++ b/src/gallium/auxiliary/hud/hud_private.h
@@ -33,6 +33,12 @@
#include "util/list.h"
#include "hud/font.h"
+enum hud_counter {
+ HUD_COUNTER_OFFLOADED,
+ HUD_COUNTER_DIRECT,
+ HUD_COUNTER_SYNCS,
+};
+
struct hud_context {
struct pipe_context *pipe;
struct cso_context *cso;
@@ -145,6 +151,8 @@ int hud_get_num_cpus(void);
void hud_fps_graph_install(struct hud_pane *pane);
void hud_cpu_graph_install(struct hud_pane *pane, unsigned cpu_index);
void hud_thread_busy_install(struct hud_pane *pane, const char *name, bool main);
+void hud_thread_counter_install(struct hud_pane *pane, const char *name,
+ enum hud_counter counter);
void hud_pipe_query_install(struct hud_batch_query_context **pbq,
struct hud_pane *pane, struct pipe_context *pipe,
const char *name, unsigned query_type,