From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/hud/hud_context.c | 5 ++++- src/gallium/auxiliary/hud/hud_cpu.c | 19 +++++++++++++++++-- src/gallium/auxiliary/hud/hud_private.h | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index ae2e0fb..9ab7822 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -1143,22 +1143,25 @@ hud_parse_env_var(struct hud_context *hud, const char *env) /* IF YOU CHANGE THIS, UPDATE print_help! */ if (strcmp(name, "fps") == 0) { hud_fps_graph_install(pane); } else if (strcmp(name, "cpu") == 0) { hud_cpu_graph_install(pane, ALL_CPUS); } 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) { hud_nic_graph_install(pane, arg_name, NIC_DIRECTION_RX); } else if (sscanf(name, "nic-tx-%s", arg_name) == 1) { hud_nic_graph_install(pane, arg_name, NIC_DIRECTION_TX); } else if (sscanf(name, "nic-rssi-%s", arg_name) == 1) { hud_nic_graph_install(pane, arg_name, NIC_RSSI_DBM); diff --git a/src/gallium/auxiliary/hud/hud_cpu.c b/src/gallium/auxiliary/hud/hud_cpu.c index 26f9fa7..38403f9 100644 --- a/src/gallium/auxiliary/hud/hud_cpu.c +++ b/src/gallium/auxiliary/hud/hud_cpu.c @@ -25,20 +25,21 @@ * **************************************************************************/ /* This file contains code for reading CPU load for displaying on the HUD. */ #include "hud/hud_private.h" #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 #include <windows.h> #endif #ifdef PIPE_OS_WINDOWS static inline uint64_t @@ -224,33 +225,46 @@ hud_get_num_cpus(void) uint64_t busy, total; int i = 0; while (get_cpu_stats(i, &busy, &total)) i++; return i; } struct thread_info { + bool main_thread; 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(); + 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); /* Check if the context changed a thread, so that we don't show * a random value. When a thread is changed, the new thread clock * is different, which can result in "percent" being very high. */ if (percent > 100) percent = 0; hud_graph_add_value(gr, percent); @@ -259,36 +273,37 @@ query_api_thread_busy_status(struct hud_graph *gr) info->last_time = now; } } else { /* initialize */ info->last_time = now; info->last_thread_time = pipe_current_thread_get_time_nano(); } } 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; gr = CALLOC_STRUCT(hud_graph); if (!gr) return; strcpy(gr->name, name); gr->query_data = CALLOC_STRUCT(thread_info); if (!gr->query_data) { FREE(gr); 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 * 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 580ceb3..b8726da 100644 --- a/src/gallium/auxiliary/hud/hud_private.h +++ b/src/gallium/auxiliary/hud/hud_private.h @@ -137,21 +137,21 @@ void hud_graph_add_value(struct hud_graph *gr, uint64_t value); /* graphs/queries */ struct hud_batch_query_context; #define ALL_CPUS ~0 /* optionally set as cpu_index */ 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, unsigned result_index, uint64_t max_value, enum pipe_driver_query_type type, enum pipe_driver_query_result_type result_type, unsigned flags); boolean hud_driver_query_install(struct hud_batch_query_context **pbq, struct hud_pane *pane, -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev