gallium/hud: add API-thread-busy for monitoring the thread load
authorMarek Olšák <marek.olsak@amd.com>
Wed, 21 Jun 2017 19:12:26 +0000 (21:12 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 26 Jun 2017 00:17:03 +0000 (02:17 +0200)
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/gallium/auxiliary/hud/hud_context.c
src/gallium/auxiliary/hud/hud_cpu.c
src/gallium/auxiliary/hud/hud_private.h

index ae2e0fb1bee2030d852bf274e20ef3dac9d7a9f6..9ab782236621d7ce5b8c1a70b83873fed833cde6 100644 (file)
@@ -1150,8 +1150,11 @@ 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_thread_busy_install(pane, name, false);
+      }
       else if (strcmp(name, "main-thread-busy") == 0) {
-         hud_main_thread_busy_install(pane, name);
+         hud_thread_busy_install(pane, name, true);
       }
 #if HAVE_GALLIUM_EXTRA_HUD
       else if (sscanf(name, "nic-rx-%s", arg_name) == 1) {
index 26f9fa78ee24ee3863be0fc92610d4c6b0d269da..38403f9f78ab7613dd99762fe572c4fe0c9fec62 100644 (file)
@@ -32,6 +32,7 @@
 #include "os/os_time.h"
 #include "os/os_thread.h"
 #include "util/u_memory.h"
+#include "util/u_queue.h"
 #include <stdio.h>
 #include <inttypes.h>
 #ifdef PIPE_OS_WINDOWS
@@ -231,6 +232,7 @@ hud_get_num_cpus(void)
 }
 
 struct thread_info {
+   bool main_thread;
    int64_t last_time;
    int64_t last_thread_time;
 };
@@ -243,7 +245,19 @@ query_api_thread_busy_status(struct hud_graph *gr)
 
    if (info->last_time) {
       if (info->last_time + gr->pane->period*1000 <= now) {
-         int64_t thread_now = pipe_current_thread_get_time_nano();
+         int64_t thread_now;
+
+         if (info->main_thread) {
+            thread_now = pipe_current_thread_get_time_nano();
+         } else {
+            struct util_queue_monitoring *mon = gr->pane->hud->monitored_queue;
+
+            if (mon && mon->queue)
+               thread_now = util_queue_get_thread_time_nano(mon->queue, 0);
+            else
+               thread_now = 0;
+         }
+
          unsigned percent = (thread_now - info->last_thread_time) * 100 /
                             (now - info->last_time);
 
@@ -266,7 +280,7 @@ query_api_thread_busy_status(struct hud_graph *gr)
 }
 
 void
-hud_main_thread_busy_install(struct hud_pane *pane, const char *name)
+hud_thread_busy_install(struct hud_pane *pane, const char *name, bool main)
 {
    struct hud_graph *gr;
 
@@ -282,6 +296,7 @@ hud_main_thread_busy_install(struct hud_pane *pane, const char *name)
       return;
    }
 
+   ((struct thread_info*)gr->query_data)->main_thread = main;
    gr->query_new_value = query_api_thread_busy_status;
 
    /* Don't use free() as our callback as that messes up Gallium's
index 580ceb3af8c4e4d107cfec0e78c9e2a0c4f96e25..b8726da7342ed325133ca2d798cdd5aa985de546 100644 (file)
@@ -144,7 +144,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_main_thread_busy_install(struct hud_pane *pane, const char *name);
+void hud_thread_busy_install(struct hud_pane *pane, const char *name, bool main);
 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,