summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/hud/hud_context.c3
-rw-r--r--src/gallium/auxiliary/hud/hud_cpu.c60
-rw-r--r--src/gallium/auxiliary/hud/hud_private.h1
3 files changed, 64 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c
index 57d189fbc52..9de260c6cbb 100644
--- a/src/gallium/auxiliary/hud/hud_context.c
+++ b/src/gallium/auxiliary/hud/hud_context.c
@@ -1149,6 +1149,9 @@ hud_parse_env_var(struct hud_context *hud, const char *env)
else if (sscanf(name, "cpu%u%s", &i, s) == 1) {
hud_cpu_graph_install(pane, i);
}
+ else if (strcmp(name, "API-thread-busy") == 0) {
+ hud_api_thread_busy_install(pane);
+ }
#if HAVE_GALLIUM_EXTRA_HUD
else if (sscanf(name, "nic-rx-%s", arg_name) == 1) {
hud_nic_graph_install(pane, arg_name, NIC_DIRECTION_RX);
diff --git a/src/gallium/auxiliary/hud/hud_cpu.c b/src/gallium/auxiliary/hud/hud_cpu.c
index c65444e1e56..a8d97b81f35 100644
--- a/src/gallium/auxiliary/hud/hud_cpu.c
+++ b/src/gallium/auxiliary/hud/hud_cpu.c
@@ -30,6 +30,7 @@
#include "hud/hud_private.h"
#include "os/os_time.h"
+#include "os/os_thread.h"
#include "util/u_memory.h"
#include <stdio.h>
#include <inttypes.h>
@@ -230,3 +231,62 @@ hud_get_num_cpus(void)
return i;
}
+
+struct thread_info {
+ int64_t last_time;
+ int64_t last_thread_time;
+};
+
+static void
+query_api_thread_busy_status(struct hud_graph *gr)
+{
+ struct thread_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) {
+ int64_t thread_now = pipe_current_thread_get_time_nano();
+
+ hud_graph_add_value(gr,
+ (thread_now - info->last_thread_time) * 100 /
+ (now - info->last_time));
+
+ info->last_thread_time = thread_now;
+ info->last_time = now;
+ }
+ } else {
+ /* initialize */
+ info->last_time = now;
+ info->last_thread_time = pipe_current_thread_get_time_nano();
+ }
+}
+
+void
+hud_api_thread_busy_install(struct hud_pane *pane)
+{
+ struct hud_graph *gr;
+
+ gr = CALLOC_STRUCT(hud_graph);
+ if (!gr)
+ return;
+
+ strcpy(gr->name, "API-thread-busy");
+
+ gr->query_data = CALLOC_STRUCT(thread_info);
+ if (!gr->query_data) {
+ FREE(gr);
+ return;
+ }
+
+ gr->query_new_value = query_api_thread_busy_status;
+
+ /* 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_graph_set_dump_file(gr);
+
+ 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 b23439e5c66..1d06e03dbe5 100644
--- a/src/gallium/auxiliary/hud/hud_private.h
+++ b/src/gallium/auxiliary/hud/hud_private.h
@@ -93,6 +93,7 @@ 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_api_thread_busy_install(struct hud_pane *pane);
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,