[Mesa-dev] [PATCH 08/11] gallium/hud: add API-thread-busy for monitoring the thread load
Marek Olšák
maraeo at gmail.com
Thu Jun 22 01:03:03 UTC 2017
From: Marek Olšák <marek.olsak at 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
More information about the mesa-dev
mailing list