gallium/hud: add glthread counters
[mesa.git] / src / gallium / auxiliary / hud / hud_private.h
1 /**************************************************************************
2 *
3 * Copyright 2013 Marek Olšák <maraeo@gmail.com>
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #ifndef HUD_PRIVATE_H
29 #define HUD_PRIVATE_H
30
31 #include "pipe/p_context.h"
32 #include "pipe/p_state.h"
33 #include "util/list.h"
34 #include "hud/font.h"
35
36 enum hud_counter {
37 HUD_COUNTER_OFFLOADED,
38 HUD_COUNTER_DIRECT,
39 HUD_COUNTER_SYNCS,
40 };
41
42 struct hud_context {
43 struct pipe_context *pipe;
44 struct cso_context *cso;
45
46 struct hud_batch_query_context *batch_query;
47 struct list_head pane_list;
48
49 struct util_queue_monitoring *monitored_queue;
50
51 /* states */
52 struct pipe_blend_state no_blend, alpha_blend;
53 struct pipe_depth_stencil_alpha_state dsa;
54 void *fs_color, *fs_text;
55 struct pipe_rasterizer_state rasterizer, rasterizer_aa_lines;
56 void *vs;
57 struct pipe_vertex_element velems[2];
58
59 /* font */
60 struct util_font font;
61 struct pipe_sampler_view *font_sampler_view;
62 struct pipe_sampler_state font_sampler_state;
63
64 /* VS constant buffer */
65 struct {
66 float color[4];
67 float two_div_fb_width;
68 float two_div_fb_height;
69 float translate[2];
70 float scale[2];
71 float padding[2];
72 } constants;
73 struct pipe_constant_buffer constbuf;
74
75 unsigned fb_width, fb_height;
76
77 /* vertices for text and background drawing are accumulated here and then
78 * drawn all at once */
79 struct vertex_queue {
80 float *vertices;
81 struct pipe_vertex_buffer vbuf;
82 unsigned max_num_vertices;
83 unsigned num_vertices;
84 unsigned buffer_size;
85 } text, bg, whitelines, color_prims;
86
87 bool has_srgb;
88 };
89
90 struct hud_graph {
91 /* initialized by common code */
92 struct list_head head;
93 struct hud_pane *pane;
94 float color[3];
95 float *vertices; /* ring buffer of vertices */
96
97 /* name and query */
98 char name[128];
99 void *query_data;
100 void (*begin_query)(struct hud_graph *gr);
101 void (*query_new_value)(struct hud_graph *gr);
102 void (*free_query_data)(void *ptr); /**< do not use ordinary free() */
103
104 /* mutable variables */
105 unsigned num_vertices;
106 unsigned index; /* vertex index being updated */
107 uint64_t current_value;
108 FILE *fd;
109 };
110
111 struct hud_pane {
112 struct list_head head;
113 struct hud_context *hud;
114 unsigned x1, y1, x2, y2;
115 unsigned inner_x1;
116 unsigned inner_y1;
117 unsigned inner_x2;
118 unsigned inner_y2;
119 unsigned inner_width;
120 unsigned inner_height;
121 float yscale;
122 unsigned max_num_vertices;
123 unsigned last_line; /* index of the last describing line in the graph */
124 uint64_t max_value;
125 uint64_t initial_max_value;
126 uint64_t ceiling;
127 unsigned dyn_ceil_last_ran;
128 boolean dyn_ceiling;
129 boolean sort_items;
130 enum pipe_driver_query_type type;
131 uint64_t period; /* in microseconds */
132
133 struct list_head graph_list;
134 unsigned num_graphs;
135 unsigned next_color;
136 };
137
138
139 /* core */
140 void hud_pane_add_graph(struct hud_pane *pane, struct hud_graph *gr);
141 void hud_pane_set_max_value(struct hud_pane *pane, uint64_t value);
142 void hud_graph_add_value(struct hud_graph *gr, uint64_t value);
143
144 /* graphs/queries */
145 struct hud_batch_query_context;
146
147 #define ALL_CPUS ~0 /* optionally set as cpu_index */
148
149 int hud_get_num_cpus(void);
150
151 void hud_fps_graph_install(struct hud_pane *pane);
152 void hud_cpu_graph_install(struct hud_pane *pane, unsigned cpu_index);
153 void hud_thread_busy_install(struct hud_pane *pane, const char *name, bool main);
154 void hud_thread_counter_install(struct hud_pane *pane, const char *name,
155 enum hud_counter counter);
156 void hud_pipe_query_install(struct hud_batch_query_context **pbq,
157 struct hud_pane *pane, struct pipe_context *pipe,
158 const char *name, unsigned query_type,
159 unsigned result_index,
160 uint64_t max_value,
161 enum pipe_driver_query_type type,
162 enum pipe_driver_query_result_type result_type,
163 unsigned flags);
164 boolean hud_driver_query_install(struct hud_batch_query_context **pbq,
165 struct hud_pane *pane,
166 struct pipe_context *pipe, const char *name);
167 void hud_batch_query_begin(struct hud_batch_query_context *bq);
168 void hud_batch_query_update(struct hud_batch_query_context *bq);
169 void hud_batch_query_cleanup(struct hud_batch_query_context **pbq);
170
171 #if HAVE_GALLIUM_EXTRA_HUD
172 int hud_get_num_nics(bool displayhelp);
173 #define NIC_DIRECTION_RX 1
174 #define NIC_DIRECTION_TX 2
175 #define NIC_RSSI_DBM 3
176 void hud_nic_graph_install(struct hud_pane *pane, const char *nic_index,
177 unsigned int mode);
178
179 int hud_get_num_disks(bool displayhelp);
180 #define DISKSTAT_RD 1
181 #define DISKSTAT_WR 2
182 void hud_diskstat_graph_install(struct hud_pane *pane, const char *dev_name,
183 unsigned int mode);
184
185 int hud_get_num_cpufreq(bool displayhelp);
186 #define CPUFREQ_MINIMUM 1
187 #define CPUFREQ_CURRENT 2
188 #define CPUFREQ_MAXIMUM 3
189 void hud_cpufreq_graph_install(struct hud_pane *pane, int cpu_index, unsigned int mode);
190 #endif
191
192 #if HAVE_LIBSENSORS
193 int hud_get_num_sensors(bool displayhelp);
194 #define SENSORS_TEMP_CURRENT 1
195 #define SENSORS_TEMP_CRITICAL 2
196 #define SENSORS_VOLTAGE_CURRENT 3
197 #define SENSORS_CURRENT_CURRENT 4
198 #define SENSORS_POWER_CURRENT 5
199 void hud_sensors_temp_graph_install(struct hud_pane *pane, const char *dev_name,
200 unsigned int mode);
201 #endif
202
203 #endif