1c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák/**************************************************************************
2c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák *
3c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Copyright 2013 Marek Olšák <maraeo@gmail.com>
4c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * All Rights Reserved.
5c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák *
6c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Permission is hereby granted, free of charge, to any person obtaining a
7c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * copy of this software and associated documentation files (the
8c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * "Software"), to deal in the Software without restriction, including
9c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * without limitation the rights to use, copy, modify, merge, publish,
10c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * distribute, sub license, and/or sell copies of the Software, and to
11c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * permit persons to whom the Software is furnished to do so, subject to
12c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * the following conditions:
13c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák *
14c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * The above copyright notice and this permission notice (including the
15c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * next paragraph) shall be included in all copies or substantial portions
16c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * of the Software.
17c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák *
18c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
22c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák *
26c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák **************************************************************************/
27c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
28c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák/* This head-up display module can draw transparent graphs on top of what
29c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * the app is rendering, visualizing various data like framerate, cpu load,
30c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * performance counters, etc. It can be hook up into any state tracker.
31c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák *
32c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * The HUD is controlled with the GALLIUM_HUD environment variable.
33c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Set GALLIUM_HUD=help for more info.
34c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák */
35c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
3622cd9040da75cac6e1c61b821e1ac6906ac4a8acEdmondo Tommasina#include <inttypes.h>
3756a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry#include <signal.h>
3887d5a169273908b9c267f7aaca58ed9fc2a68ef1Brian Paul#include <stdio.h>
3987d5a169273908b9c267f7aaca58ed9fc2a68ef1Brian Paul
40c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "hud/hud_context.h"
41c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "hud/hud_private.h"
42c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "hud/font.h"
43c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
44c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "cso_cache/cso_context.h"
45c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "util/u_draw_quad.h"
46b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák#include "util/u_format.h"
47c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "util/u_inlines.h"
48c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "util/u_memory.h"
49c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "util/u_math.h"
50786f01c492bb6a90a4835389666dd0c5c984ea6aIlia Mirkin#include "util/u_sampler.h"
51c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "util/u_simple_shaders.h"
52c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "util/u_string.h"
53c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "util/u_upload_mgr.h"
54c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "tgsi/tgsi_text.h"
55c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák#include "tgsi/tgsi_dump.h"
56c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
5756a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry/* Control the visibility of all HUD contexts */
5856a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berrystatic boolean huds_visible = TRUE;
59c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
60c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstruct hud_context {
61c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_context *pipe;
62c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct cso_context *cso;
63c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct u_upload_mgr *uploader;
64c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
65424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle   struct hud_batch_query_context *batch_query;
66c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct list_head pane_list;
67c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
68c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* states */
696902f9e82a1d4c4ff12ac6b55b96d2ef5feb26e3Marek Olšák   struct pipe_blend_state no_blend, alpha_blend;
70c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_depth_stencil_alpha_state dsa;
71f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák   void *fs_color, *fs_text;
726ffde82083e07d86d1e60b00d245af436752fd5eMarek Olšák   struct pipe_rasterizer_state rasterizer, rasterizer_aa_lines;
73c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   void *vs;
74c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_vertex_element velems[2];
75c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
76c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* font */
77c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct util_font font;
78c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_sampler_view *font_sampler_view;
79c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_sampler_state font_sampler_state;
80c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
81c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* VS constant buffer */
82c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct {
83c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      float color[4];
84c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      float two_div_fb_width;
85c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      float two_div_fb_height;
86c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      float translate[2];
87c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      float scale[2];
88c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      float padding[2];
89c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   } constants;
90c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_constant_buffer constbuf;
91c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
92c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned fb_width, fb_height;
93c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
94c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* vertices for text and background drawing are accumulated here and then
95c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák    * drawn all at once */
96c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct vertex_queue {
97c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      float *vertices;
98c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      struct pipe_vertex_buffer vbuf;
99c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned max_num_vertices;
100c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned num_vertices;
101c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   } text, bg, whitelines;
102b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák
103b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák   bool has_srgb;
104c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák};
105c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1061cfffb95ebf49a8342d4799e68ecc0009300cb2fBrian Paul#ifdef PIPE_OS_UNIX
10756a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berrystatic void
10856a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berrysignal_visible_handler(int sig, siginfo_t *siginfo, void *context)
10956a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry{
11056a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   huds_visible = !huds_visible;
11156a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry}
1121cfffb95ebf49a8342d4799e68ecc0009300cb2fBrian Paul#endif
113c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
114c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
115c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_draw_colored_prims(struct hud_context *hud, unsigned prim,
116c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                       float *buffer, unsigned num_vertices,
117c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                       float r, float g, float b, float a,
118c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                       int xoffset, int yoffset, float yscale)
119c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
120c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct cso_context *cso = hud->cso;
121c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_vertex_buffer vbuffer = {0};
122c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
123c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[0] = r;
124c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[1] = g;
125c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[2] = b;
126c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[3] = a;
1272285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   hud->constants.translate[0] = (float) xoffset;
1282285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   hud->constants.translate[1] = (float) yoffset;
129c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.scale[0] = 1;
130c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.scale[1] = yscale;
131c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_constant_buffer(cso, PIPE_SHADER_VERTEX, 0, &hud->constbuf);
132c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
133c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   vbuffer.user_buffer = buffer;
134c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   vbuffer.stride = 2 * sizeof(float);
135c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
136c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_vertex_buffers(cso, cso_get_aux_vertex_buffer_slot(cso),
137c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          1, &vbuffer);
138c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_fragment_shader_handle(hud->cso, hud->fs_color);
139c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_draw_arrays(cso, prim, 0, num_vertices);
140c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
141c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
142c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
143c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_draw_colored_quad(struct hud_context *hud, unsigned prim,
144c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                      unsigned x1, unsigned y1, unsigned x2, unsigned y2,
145c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                      float r, float g, float b, float a)
146c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
147c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   float buffer[] = {
1482285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      (float) x1, (float) y1,
1492285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      (float) x1, (float) y2,
1502285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      (float) x2, (float) y2,
1512285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      (float) x2, (float) y1,
152c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   };
153c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
154c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_draw_colored_prims(hud, prim, buffer, 4, r, g, b, a, 0, 0, 1);
155c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
156c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
157c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
158c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_draw_background_quad(struct hud_context *hud,
159c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                         unsigned x1, unsigned y1, unsigned x2, unsigned y2)
160c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
161c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   float *vertices = hud->bg.vertices + hud->bg.num_vertices*2;
162c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned num = 0;
163c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
164c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   assert(hud->bg.num_vertices + 4 <= hud->bg.max_num_vertices);
165c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1662285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) x1;
1672285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) y1;
168c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1692285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) x1;
1702285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) y2;
171c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1722285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) x2;
1732285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) y2;
174c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1752285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) x2;
1762285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   vertices[num++] = (float) y1;
177c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
178c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->bg.num_vertices += num/2;
179c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
180c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
181c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
182c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_draw_string(struct hud_context *hud, unsigned x, unsigned y,
183c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                const char *str, ...)
184c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
185c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   char buf[256];
186c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   char *s = buf;
187c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   float *vertices = hud->text.vertices + hud->text.num_vertices*4;
188c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned num = 0;
189c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
190c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   va_list ap;
191c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   va_start(ap, str);
192c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   util_vsnprintf(buf, sizeof(buf), str, ap);
193c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   va_end(ap);
194c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
195c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (!*s)
196c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return;
197c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
198c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_draw_background_quad(hud,
199c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                            x, y,
200c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                            x + strlen(buf)*hud->font.glyph_width,
201c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                            y + hud->font.glyph_height);
202c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
203c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   while (*s) {
204c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned x1 = x;
205c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned y1 = y;
206c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned x2 = x + hud->font.glyph_width;
207c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned y2 = y + hud->font.glyph_height;
208c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned tx1 = (*s % 16) * hud->font.glyph_width;
209c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned ty1 = (*s / 16) * hud->font.glyph_height;
210c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned tx2 = tx1 + hud->font.glyph_width;
211c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned ty2 = ty1 + hud->font.glyph_height;
212c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
213c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      if (*s == ' ') {
214c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         x += hud->font.glyph_width;
215c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         s++;
216c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         continue;
217c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
218c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
219c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      assert(hud->text.num_vertices + num/4 + 4 <= hud->text.max_num_vertices);
220c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
2212285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) x1;
2222285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) y1;
2232285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) tx1;
2242285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) ty1;
225c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
2262285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) x1;
2272285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) y2;
2282285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) tx1;
2292285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) ty2;
230c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
2312285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) x2;
2322285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) y2;
2332285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) tx2;
2342285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) ty2;
235c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
2362285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) x2;
2372285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) y1;
2382285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) tx2;
2392285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul      vertices[num++] = (float) ty1;
240c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
241c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      x += hud->font.glyph_width;
242c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      s++;
243c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
244c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
245c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->text.num_vertices += num/4;
246c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
247c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
248c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
2497b87190d2b778952713a02a075fb05f8b5803ca9Marek Olšáknumber_to_human_readable(uint64_t num, enum pipe_driver_query_type type,
2507b87190d2b778952713a02a075fb05f8b5803ca9Marek Olšák                         char *out)
251c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
252c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   static const char *byte_units[] =
253130a03e360e6aebe93e86b1d522ebf22371aa2d4Marek Olšák      {" B", " KB", " MB", " GB", " TB", " PB", " EB"};
254c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   static const char *metric_units[] =
255c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      {"", " k", " M", " G", " T", " P", " E"};
256a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul   static const char *time_units[] =
257a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul      {" us", " ms", " s"};  /* based on microseconds */
2586b47b8978101897cc0dab8f2017e3aa25d31582dMarek Olšák   static const char *hz_units[] =
2596b47b8978101897cc0dab8f2017e3aa25d31582dMarek Olšák      {" Hz", " KHz", " MHz", " GHz"};
260cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák   static const char *percent_units[] = {"%"};
2618c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   static const char *dbm_units[] = {" (-dBm)"};
2628c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   static const char *temperature_units[] = {" C"};
2638c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   static const char *volt_units[] = {" mV", " V"};
2648c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   static const char *amp_units[] = {" mA", " A"};
2651d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth   static const char *watt_units[] = {" mW", " W"};
266cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák
267cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák   const char **units;
268cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák   unsigned max_unit;
26986ebd31c672f389f354e11b7aef4513dc8b76f13Brian Paul   double divisor = (type == PIPE_DRIVER_QUERY_TYPE_BYTES) ? 1024 : 1000;
270cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák   unsigned unit = 0;
271c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   double d = num;
272c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
273a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul   switch (type) {
274a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul   case PIPE_DRIVER_QUERY_TYPE_MICROSECONDS:
275cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      max_unit = ARRAY_SIZE(time_units)-1;
276cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      units = time_units;
277a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul      break;
2788c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   case PIPE_DRIVER_QUERY_TYPE_VOLTS:
2798c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      max_unit = ARRAY_SIZE(volt_units)-1;
2808c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      units = volt_units;
2818c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      break;
2828c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   case PIPE_DRIVER_QUERY_TYPE_AMPS:
2838c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      max_unit = ARRAY_SIZE(amp_units)-1;
2848c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      units = amp_units;
2858c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      break;
2868c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   case PIPE_DRIVER_QUERY_TYPE_DBM:
2878c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      max_unit = ARRAY_SIZE(dbm_units)-1;
2888c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      units = dbm_units;
2898c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      break;
2908c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   case PIPE_DRIVER_QUERY_TYPE_TEMPERATURE:
2918c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      max_unit = ARRAY_SIZE(temperature_units)-1;
2928c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      units = temperature_units;
2938c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      break;
29410cff5e1ae55406799f4b0ad6b327d4c45dbca11Brian Paul   case PIPE_DRIVER_QUERY_TYPE_PERCENTAGE:
295cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      max_unit = ARRAY_SIZE(percent_units)-1;
296cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      units = percent_units;
29710cff5e1ae55406799f4b0ad6b327d4c45dbca11Brian Paul      break;
298a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul   case PIPE_DRIVER_QUERY_TYPE_BYTES:
299cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      max_unit = ARRAY_SIZE(byte_units)-1;
300cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      units = byte_units;
301a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul      break;
3026b47b8978101897cc0dab8f2017e3aa25d31582dMarek Olšák   case PIPE_DRIVER_QUERY_TYPE_HZ:
303cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      max_unit = ARRAY_SIZE(hz_units)-1;
304cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      units = hz_units;
3056b47b8978101897cc0dab8f2017e3aa25d31582dMarek Olšák      break;
3061d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth   case PIPE_DRIVER_QUERY_TYPE_WATTS:
3071d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth      max_unit = ARRAY_SIZE(watt_units)-1;
3081d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth      units = watt_units;
3091d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth      break;
310a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul   default:
3117b87190d2b778952713a02a075fb05f8b5803ca9Marek Olšák      max_unit = ARRAY_SIZE(metric_units)-1;
3127b87190d2b778952713a02a075fb05f8b5803ca9Marek Olšák      units = metric_units;
313cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák   }
314cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák
315cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák   while (d > divisor && unit < max_unit) {
316cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      d /= divisor;
317cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      unit++;
318a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul   }
319a804f5824352e4f714779bd9445c09b66d54bc4aBrian Paul
320a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák   /* Round to 3 decimal places so as not to print trailing zeros. */
321a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák   if (d*1000 != (int)(d*1000))
322a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák      d = round(d * 1000) / 1000;
323a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák
324a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák   /* Show at least 4 digits with at most 3 decimal places, but not zeros. */
325a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák   if (d >= 1000 || d == (int)d)
326cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      sprintf(out, "%.0f%s", d, units[unit]);
327a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák   else if (d >= 100 || d*10 == (int)(d*10))
328cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      sprintf(out, "%.1f%s", d, units[unit]);
329a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák   else if (d >= 10 || d*100 == (int)(d*100))
330cbad30344d6e0b1ccc9fc8d5a8e6560e97dd9188Marek Olšák      sprintf(out, "%.2f%s", d, units[unit]);
331a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák   else
332a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák      sprintf(out, "%.3f%s", d, units[unit]);
333c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
334c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
335c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
336c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_draw_graph_line_strip(struct hud_context *hud, const struct hud_graph *gr,
337c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          unsigned xoffset, unsigned yoffset, float yscale)
338c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
339c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (gr->num_vertices <= 1)
340c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return;
341c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
342c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   assert(gr->index <= gr->num_vertices);
343c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
344c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_draw_colored_prims(hud, PIPE_PRIM_LINE_STRIP,
345c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          gr->vertices, gr->index,
346c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          gr->color[0], gr->color[1], gr->color[2], 1,
347c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          xoffset + (gr->pane->max_num_vertices - gr->index - 1) * 2 - 1,
348c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          yoffset, yscale);
349c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
350c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (gr->num_vertices <= gr->index)
351c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return;
352c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
353c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_draw_colored_prims(hud, PIPE_PRIM_LINE_STRIP,
354c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          gr->vertices + gr->index*2,
355c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          gr->num_vertices - gr->index,
356c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          gr->color[0], gr->color[1], gr->color[2], 1,
357c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                          xoffset - gr->index*2 - 1, yoffset, yscale);
358c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
359c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
360c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
361c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_pane_accumulate_vertices(struct hud_context *hud,
362c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                             const struct hud_pane *pane)
363c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
364c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_graph *gr;
365c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   float *line_verts = hud->whitelines.vertices + hud->whitelines.num_vertices*2;
366c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned i, num = 0;
367c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   char str[32];
3680328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   const unsigned last_line = pane->last_line;
369c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
370c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw background */
371c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_draw_background_quad(hud,
372c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                            pane->x1, pane->y1,
373c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                            pane->x2, pane->y2);
374c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
375c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw numbers on the right-hand side */
3760f1befe926e793040f73b884c9b4f1b8a4bd25a6Marek Olšák   for (i = 0; i <= last_line; i++) {
377c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned x = pane->x2 + 2;
3780f1befe926e793040f73b884c9b4f1b8a4bd25a6Marek Olšák      unsigned y = pane->inner_y1 +
3790f1befe926e793040f73b884c9b4f1b8a4bd25a6Marek Olšák                   pane->inner_height * (last_line - i) / last_line -
380c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                   hud->font.glyph_height / 2;
381c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
3827b87190d2b778952713a02a075fb05f8b5803ca9Marek Olšák      number_to_human_readable(pane->max_value * i / last_line,
38386ebd31c672f389f354e11b7aef4513dc8b76f13Brian Paul                               pane->type, str);
3844e2a3e0376ca4fe39ca05e80557edfaa12e93e2bMarek Olšák      hud_draw_string(hud, x, y, "%s", str);
385c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
386c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
387c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw info below the pane */
388c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   i = 0;
389c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
390c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned x = pane->x1 + 2;
391c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned y = pane->y2 + 2 + i*hud->font.glyph_height;
392c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
3937b87190d2b778952713a02a075fb05f8b5803ca9Marek Olšák      number_to_human_readable(gr->current_value, pane->type, str);
394c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud_draw_string(hud, x, y, "  %s: %s", gr->name, str);
395c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      i++;
396c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
397c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
398c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw border */
399c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   assert(hud->whitelines.num_vertices + num/2 + 8 <= hud->whitelines.max_num_vertices);
4002285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x1;
4012285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y1;
4022285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x2;
4032285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y1;
4042285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul
4052285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x2;
4062285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y1;
4072285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x2;
4082285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y2;
4092285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul
4102285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x1;
4112285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y2;
4122285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x2;
4132285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y2;
4142285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul
4152285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x1;
4162285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y1;
4172285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->x1;
4182285645aa26662bb0aa68c8b15e04a406f3c77f6Brian Paul   line_verts[num++] = (float) pane->y2;
419c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
420c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw horizontal lines inside the graph */
4210f1befe926e793040f73b884c9b4f1b8a4bd25a6Marek Olšák   for (i = 0; i <= last_line; i++) {
4220f1befe926e793040f73b884c9b4f1b8a4bd25a6Marek Olšák      float y = round((pane->max_value * i / (double)last_line) *
4230f1befe926e793040f73b884c9b4f1b8a4bd25a6Marek Olšák                      pane->yscale + pane->inner_y2);
424c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
425c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      assert(hud->whitelines.num_vertices + num/2 + 2 <= hud->whitelines.max_num_vertices);
426c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      line_verts[num++] = pane->x1;
427c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      line_verts[num++] = y;
428c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      line_verts[num++] = pane->x2;
429c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      line_verts[num++] = y;
430c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
431c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
432c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->whitelines.num_vertices += num/2;
433c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
434c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
435c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
436c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_pane_draw_colored_objects(struct hud_context *hud,
437c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                              const struct hud_pane *pane)
438c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
439c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_graph *gr;
440c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned i;
441c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
442c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw colored quads below the pane */
443c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   i = 0;
444c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
445c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned x = pane->x1 + 2;
446c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      unsigned y = pane->y2 + 2 + i*hud->font.glyph_height;
447c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
448c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud_draw_colored_quad(hud, PIPE_PRIM_QUADS, x + 1, y + 1, x + 12, y + 13,
449c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                            gr->color[0], gr->color[1], gr->color[2], 1);
450c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      i++;
451c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
452c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
453c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw the line strips */
454c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
455c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud_draw_graph_line_strip(hud, gr, pane->inner_x1, pane->inner_y2, pane->yscale);
456c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
457c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
458c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
459c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
460c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_alloc_vertices(struct hud_context *hud, struct vertex_queue *v,
461c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                   unsigned num_vertices, unsigned stride)
462c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
463c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   v->num_vertices = 0;
464c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   v->max_num_vertices = num_vertices;
465c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   v->vbuf.stride = stride;
466c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   u_upload_alloc(hud->uploader, 0, v->vbuf.stride * v->max_num_vertices,
467020009f7ccdffa84c6e1649c4e915954f5fd7cc0Marek Olšák                  16, &v->vbuf.buffer_offset, &v->vbuf.buffer,
468c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                  (void**)&v->vertices);
469c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
470c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
471c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák/**
472c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Draw the HUD to the texture \p tex.
473c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * The texture is usually the back buffer being displayed.
474c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák */
475c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákvoid
476c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_draw(struct hud_context *hud, struct pipe_resource *tex)
477c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
478c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct cso_context *cso = hud->cso;
479c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_context *pipe = hud->pipe;
480c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_framebuffer_state fb;
481c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_surface surf_templ, *surf;
482c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_viewport_state viewport;
483c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   const struct pipe_sampler_state *sampler_states[] =
484c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         { &hud->font_sampler_state };
485c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_pane *pane;
4866d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák   struct hud_graph *gr, *next;
487c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
48856a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   if (!huds_visible)
48956a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry      return;
49056a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry
491c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->fb_width = tex->width0;
492c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->fb_height = tex->height0;
49376666b93946e03f032d45f20206be675215f6d40Brian Paul   hud->constants.two_div_fb_width = 2.0f / hud->fb_width;
49476666b93946e03f032d45f20206be675215f6d40Brian Paul   hud->constants.two_div_fb_height = 2.0f / hud->fb_height;
495c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
49670e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul   cso_save_state(cso, (CSO_BIT_FRAMEBUFFER |
49770e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_SAMPLE_MASK |
49870e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_MIN_SAMPLES |
49970e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_BLEND |
50070e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_DEPTH_STENCIL_ALPHA |
50170e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_FRAGMENT_SHADER |
50270e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_FRAGMENT_SAMPLER_VIEWS |
50370e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_FRAGMENT_SAMPLERS |
50470e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_RASTERIZER |
50570e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_VIEWPORT |
50670e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_STREAM_OUTPUTS |
50770e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_GEOMETRY_SHADER |
50870e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_TESSCTRL_SHADER |
50970e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_TESSEVAL_SHADER |
51070e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_VERTEX_SHADER |
51170e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_VERTEX_ELEMENTS |
51270e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_AUX_VERTEX_BUFFER_SLOT |
513e599b8f384b4fc48b450ed848d93e27e876de53fMarek Olšák                        CSO_BIT_PAUSE_QUERIES |
51470e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul                        CSO_BIT_RENDER_CONDITION));
515c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_save_constant_buffer_slot0(cso, PIPE_SHADER_VERTEX);
516c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
517c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* set states */
518c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   memset(&surf_templ, 0, sizeof(surf_templ));
519c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   surf_templ.format = tex->format;
520b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák
521b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák   /* Without this, AA lines look thinner if they are between 2 pixels
522b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák    * because the alpha is 0.5 on both pixels. (it's ugly)
523b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák    *
524b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák    * sRGB makes the width of all AA lines look the same.
525b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák    */
526b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák   if (hud->has_srgb) {
527b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák      enum pipe_format srgb_format = util_format_srgb(tex->format);
528b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák
529b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák      if (srgb_format != PIPE_FORMAT_NONE)
530b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák         surf_templ.format = srgb_format;
531b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák   }
532c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   surf = pipe->create_surface(pipe, tex, &surf_templ);
533c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
534c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   memset(&fb, 0, sizeof(fb));
535c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   fb.nr_cbufs = 1;
536c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   fb.cbufs[0] = surf;
537c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   fb.zsbuf = NULL;
538c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   fb.width = hud->fb_width;
539c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   fb.height = hud->fb_height;
540c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
541c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   viewport.scale[0] = 0.5f * hud->fb_width;
542c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   viewport.scale[1] = 0.5f * hud->fb_height;
543c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   viewport.scale[2] = 1.0f;
544c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   viewport.translate[0] = 0.5f * hud->fb_width;
545c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   viewport.translate[1] = 0.5f * hud->fb_height;
546c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   viewport.translate[2] = 0.0f;
547c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
548c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_framebuffer(cso, &fb);
549c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_sample_mask(cso, ~0);
550c5d822dad902b19f06c9be3c6863a51e1881ec5bIlia Mirkin   cso_set_min_samples(cso, 1);
551c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_depth_stencil_alpha(cso, &hud->dsa);
552c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_rasterizer(cso, &hud->rasterizer);
553c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_viewport(cso, &viewport);
554dfa25ea5cd19d5a050a1c94bd7370a2259b9f007Zack Rusin   cso_set_stream_outputs(cso, 0, NULL, NULL);
5552420ee497a14ca36ea05b275ea74e5c3a4432a59Marek Olšák   cso_set_tessctrl_shader_handle(cso, NULL);
5562420ee497a14ca36ea05b275ea74e5c3a4432a59Marek Olšák   cso_set_tesseval_shader_handle(cso, NULL);
557c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_geometry_shader_handle(cso, NULL);
558c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_vertex_shader_handle(cso, hud->vs);
559c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_vertex_elements(cso, 2, hud->velems);
560793e8e3d7ed816cc9a066245dde798afdcf8b581Roland Scheidegger   cso_set_render_condition(cso, NULL, FALSE, 0);
561c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_sampler_views(cso, PIPE_SHADER_FRAGMENT, 1,
562c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                         &hud->font_sampler_view);
563c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_samplers(cso, PIPE_SHADER_FRAGMENT, 1, sampler_states);
564c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_constant_buffer(cso, PIPE_SHADER_VERTEX, 0, &hud->constbuf);
565c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
566c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* prepare vertex buffers */
5675b2eddc40f141f40b9c152f6e45180932288b38eMarek Olšák   hud_alloc_vertices(hud, &hud->bg, 16 * 256, 2 * sizeof(float));
568c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_alloc_vertices(hud, &hud->whitelines, 4 * 256, 2 * sizeof(float));
569431742dbba46b66e61a22f7186ec82a818685a31Marek Olšák   hud_alloc_vertices(hud, &hud->text, 16 * 1024, 4 * sizeof(float));
570c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
571c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* prepare all graphs */
572424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle   hud_batch_query_update(hud->batch_query);
573424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle
574c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_FOR_EACH_ENTRY(pane, &hud->pane_list, head) {
575c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
576c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         gr->query_new_value(gr);
577c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
578c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
5796d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák      if (pane->sort_items) {
5806d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák         LIST_FOR_EACH_ENTRY_SAFE(gr, next, &pane->graph_list, head) {
5816d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák            /* ignore the last one */
5826d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák            if (&gr->head == pane->graph_list.prev)
5836d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák               continue;
5846d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák
5856d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák            /* This is an incremental bubble sort, because we only do one pass
5866d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák             * per frame. It will eventually reach an equilibrium.
5876d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák             */
5886d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák            if (gr->current_value <
5896d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák                LIST_ENTRY(struct hud_graph, next, head)->current_value) {
5906d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák               LIST_DEL(&gr->head);
5916d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák               LIST_ADD(&gr->head, &next->head);
5926d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák            }
5936d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák         }
5946d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák      }
5956d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák
596c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud_pane_accumulate_vertices(hud, pane);
597c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
598c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
59998b64cc20f676a167a4d8d5ea29602f8842a6cf4Brian Paul   /* unmap the uploader's vertex buffer before drawing */
6000c20bff4b626413804486444ad239af620722e2fMarek Olšák   u_upload_unmap(hud->uploader);
60198b64cc20f676a167a4d8d5ea29602f8842a6cf4Brian Paul
602c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw accumulated vertices for background quads */
6036902f9e82a1d4c4ff12ac6b55b96d2ef5feb26e3Marek Olšák   cso_set_blend(cso, &hud->alpha_blend);
604c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_fragment_shader_handle(hud->cso, hud->fs_color);
605c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
606c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (hud->bg.num_vertices) {
607c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->constants.color[0] = 0;
608c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->constants.color[1] = 0;
609c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->constants.color[2] = 0;
61076666b93946e03f032d45f20206be675215f6d40Brian Paul      hud->constants.color[3] = 0.666f;
611c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->constants.translate[0] = 0;
612c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->constants.translate[1] = 0;
613c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->constants.scale[0] = 1;
614c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->constants.scale[1] = 1;
615c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
616c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_set_constant_buffer(cso, PIPE_SHADER_VERTEX, 0, &hud->constbuf);
617c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_set_vertex_buffers(cso, cso_get_aux_vertex_buffer_slot(cso), 1,
618c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                             &hud->bg.vbuf);
619c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_draw_arrays(cso, PIPE_PRIM_QUADS, 0, hud->bg.num_vertices);
620c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
621c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe_resource_reference(&hud->bg.vbuf.buffer, NULL);
622c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
623c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw accumulated vertices for white lines */
6246902f9e82a1d4c4ff12ac6b55b96d2ef5feb26e3Marek Olšák   cso_set_blend(cso, &hud->no_blend);
6256902f9e82a1d4c4ff12ac6b55b96d2ef5feb26e3Marek Olšák
626c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[0] = 1;
627c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[1] = 1;
628c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[2] = 1;
629c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.color[3] = 1;
630c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.translate[0] = 0;
631c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.translate[1] = 0;
632c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.scale[0] = 1;
633c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constants.scale[1] = 1;
634c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_set_constant_buffer(cso, PIPE_SHADER_VERTEX, 0, &hud->constbuf);
635c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
636c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (hud->whitelines.num_vertices) {
637c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_set_vertex_buffers(cso, cso_get_aux_vertex_buffer_slot(cso), 1,
638c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                             &hud->whitelines.vbuf);
639c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_set_fragment_shader_handle(hud->cso, hud->fs_color);
640c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_draw_arrays(cso, PIPE_PRIM_LINES, 0, hud->whitelines.num_vertices);
641c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
642c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe_resource_reference(&hud->whitelines.vbuf.buffer, NULL);
643c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
644c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw accumulated vertices for text */
6456902f9e82a1d4c4ff12ac6b55b96d2ef5feb26e3Marek Olšák   cso_set_blend(cso, &hud->alpha_blend);
646c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (hud->text.num_vertices) {
647c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_set_vertex_buffers(cso, cso_get_aux_vertex_buffer_slot(cso), 1,
648c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                             &hud->text.vbuf);
649f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák      cso_set_fragment_shader_handle(hud->cso, hud->fs_text);
650c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      cso_draw_arrays(cso, PIPE_PRIM_QUADS, 0, hud->text.num_vertices);
651c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
652c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe_resource_reference(&hud->text.vbuf.buffer, NULL);
653c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
654c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* draw the rest */
6556ffde82083e07d86d1e60b00d245af436752fd5eMarek Olšák   cso_set_rasterizer(cso, &hud->rasterizer_aa_lines);
656c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_FOR_EACH_ENTRY(pane, &hud->pane_list, head) {
657c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      if (pane)
658c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         hud_pane_draw_colored_objects(hud, pane);
659c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
660c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
66170e8a4f734dff7afb2a0b1cd10813938343c6551Brian Paul   cso_restore_state(cso);
662c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   cso_restore_constant_buffer_slot0(cso, PIPE_SHADER_VERTEX);
663c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
664c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe_surface_reference(&surf, NULL);
6651fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák
6661fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák   /* Start queries. */
6671fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák   hud_batch_query_begin(hud->batch_query);
6681fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák
6691fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák   LIST_FOR_EACH_ENTRY(pane, &hud->pane_list, head) {
6701fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák      LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
6711fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák         if (gr->begin_query)
6721fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák            gr->begin_query(gr);
6731fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák      }
6741fe7c8d3c9f7ace602627d9574117d5b447accd3Marek Olšák   }
675c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
676c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
6770328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšákstatic void
6780328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšákfixup_bytes(enum pipe_driver_query_type type, int position, uint64_t *exp10)
6790328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák{
6800328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   if (type == PIPE_DRIVER_QUERY_TYPE_BYTES && position % 3 == 0)
6810328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      *exp10 = (*exp10 / 1000) * 1024;
6820328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák}
6830328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
684c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák/**
685c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Set the maximum value for the Y axis of the graph.
686c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * This scales the graph accordingly.
687c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák */
688c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákvoid
689c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_pane_set_max_value(struct hud_pane *pane, uint64_t value)
690c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
6910328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   double leftmost_digit;
6920328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   uint64_t exp10;
6930328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   int i;
6940328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
6950328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   /* The following code determines the max_value in the graph as well as
6960328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák    * how many describing lines are drawn. The max_value is rounded up,
6970328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák    * so that all drawn numbers are rounded for readability.
6980328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák    * We want to print multiples of a simple number instead of multiples of
6990328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák    * hard-to-read numbers like 1.753.
7000328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák    */
7010328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
7020328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   /* Find the left-most digit. */
7030328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   exp10 = 1;
7040328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   for (i = 0; value > 9 * exp10; i++) {
7050328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      exp10 *= 10;
7060328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      fixup_bytes(pane->type, i + 1, &exp10);
7070328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   }
7080328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
7090328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   leftmost_digit = DIV_ROUND_UP(value, exp10);
7100328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
7110328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   /* Round 9 to 10. */
7120328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   if (leftmost_digit == 9) {
7130328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      leftmost_digit = 1;
7140328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      exp10 *= 10;
7150328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      fixup_bytes(pane->type, i + 1, &exp10);
7160328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   }
7170328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
7180328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   switch ((unsigned)leftmost_digit) {
7190328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 1:
7200328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      pane->last_line = 5; /* lines in +1/5 increments */
7210328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      break;
7220328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 2:
7230328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      pane->last_line = 8; /* lines in +1/4 increments. */
7240328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      break;
7250328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 3:
7260328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 4:
7270328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      pane->last_line = leftmost_digit * 2; /* lines in +1/2 increments */
7280328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      break;
7290328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 5:
7300328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 6:
7310328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 7:
7320328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   case 8:
7330328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      pane->last_line = leftmost_digit; /* lines in +1 increments */
7340328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      break;
7350328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   default:
7360328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      assert(0);
7370328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   }
7380328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
7390328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   /* Truncate {3,4} to {2.5, 3.5} if possible. */
7400328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   for (i = 3; i <= 4; i++) {
7410328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      if (leftmost_digit == i && value <= (i - 0.5) * exp10) {
7420328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák         leftmost_digit = i - 0.5;
7430328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák         pane->last_line = leftmost_digit * 2; /* lines in +1/2 increments. */
7440328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      }
7450328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   }
7460328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
7470328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   /* Truncate 2 to a multiple of 0.2 in (1, 1.6] if possible. */
7480328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   if (leftmost_digit == 2) {
7490328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      for (i = 1; i <= 3; i++) {
7500328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák         if (value <= (1 + i*0.2) * exp10) {
7510328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák            leftmost_digit = 1 + i*0.2;
7520328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák            pane->last_line = 5 + i; /* lines in +1/5 increments. */
7530328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák            break;
7540328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák         }
7550328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák      }
7560328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   }
7570328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák
7580328b20050ef4dba45ae7b03f00dc9112f5ee1eeMarek Olšák   pane->max_value = leftmost_digit * exp10;
75976666b93946e03f032d45f20206be675215f6d40Brian Paul   pane->yscale = -(int)pane->inner_height / (float)pane->max_value;
760c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
761c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
7626fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutisstatic void
7636fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutishud_pane_update_dyn_ceiling(struct hud_graph *gr, struct hud_pane *pane)
7646fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis{
7656fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   unsigned i;
7666fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   float tmp = 0.0f;
7676fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
7686fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   if (pane->dyn_ceil_last_ran != gr->index) {
7696fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      LIST_FOR_EACH_ENTRY(gr, &pane->graph_list, head) {
7706fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         for (i = 0; i <  gr->num_vertices; ++i) {
7716fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis            tmp = gr->vertices[i * 2 + 1] > tmp ?
7726fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis                  gr->vertices[i * 2 + 1] : tmp;
7736fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         }
7746fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      }
7756fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
7766fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      /* Avoid setting it lower than the initial starting height. */
7776fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      tmp = tmp > pane->initial_max_value ? tmp : pane->initial_max_value;
7786fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      hud_pane_set_max_value(pane, tmp);
7796fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   }
7806fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
7816fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   /*
7826fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis    * Mark this adjustment run so we could avoid repeating a full update
7836fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis    * again needlessly in case the pane has more than one graph.
7846fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis    */
7856fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   pane->dyn_ceil_last_ran = gr->index;
7866fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis}
7876fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
788c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic struct hud_pane *
789c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_pane_create(unsigned x1, unsigned y1, unsigned x2, unsigned y2,
7906fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis                unsigned period, uint64_t max_value, uint64_t ceiling,
7916d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák                boolean dyn_ceiling, boolean sort_items)
792c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
793c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_pane *pane = CALLOC_STRUCT(hud_pane);
794c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
795c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (!pane)
796c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return NULL;
797c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
798c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->x1 = x1;
799c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->y1 = y1;
800c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->x2 = x2;
801c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->y2 = y2;
802c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->inner_x1 = x1 + 1;
803c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->inner_x2 = x2 - 1;
804c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->inner_y1 = y1 + 1;
805c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->inner_y2 = y2 - 1;
806c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->inner_width = pane->inner_x2 - pane->inner_x1;
807c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->inner_height = pane->inner_y2 - pane->inner_y1;
808c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->period = period;
809c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->max_num_vertices = (x2 - x1 + 2) / 2;
8106fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   pane->ceiling = ceiling;
8116fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   pane->dyn_ceiling = dyn_ceiling;
8126fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   pane->dyn_ceil_last_ran = 0;
8136d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák   pane->sort_items = sort_items;
8146fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   pane->initial_max_value = max_value;
815c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_pane_set_max_value(pane, max_value);
816c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_INITHEAD(&pane->graph_list);
817c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   return pane;
818c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
819c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
820e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák/* replace '-' with a space */
821e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšákstatic void
822e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšákstrip_hyphens(char *s)
823e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák{
824e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák   while (*s) {
825e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák      if (*s == '-')
826e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         *s = ' ';
827e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák      s++;
828e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák   }
829e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák}
830e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák
831c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák/**
832c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Add a graph to an existing pane.
833c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * One pane can contain multiple graphs over each other.
834c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák */
835c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákvoid
836c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_pane_add_graph(struct hud_pane *pane, struct hud_graph *gr)
837c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
838c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   static const float colors[][3] = {
839c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      {0, 1, 0},
840c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      {1, 0, 0},
841c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      {0, 1, 1},
842c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      {1, 0, 1},
843c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      {1, 1, 0},
844a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {0.5, 1, 0.5},
845a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {1, 0.5, 0.5},
846a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {0.5, 1, 1},
847a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {1, 0.5, 1},
848a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {1, 1, 0.5},
849a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {0, 0.5, 0},
850a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {0.5, 0, 0},
851a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {0, 0.5, 0.5},
852a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {0.5, 0, 0.5},
853a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák      {0.5, 0.5, 0},
854c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   };
85580b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák   unsigned color = pane->next_color % ARRAY_SIZE(colors);
856c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
857a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák   strip_hyphens(gr->name);
858c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
859a408ea96920984ad2c5bf81f799cbb583f264105Brian Paul   gr->vertices = MALLOC(pane->max_num_vertices * sizeof(float) * 2);
860a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák   gr->color[0] = colors[color][0];
861a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák   gr->color[1] = colors[color][1];
862a57e071e9ec341d094df0cdc36d18326b61ffd21Marek Olšák   gr->color[2] = colors[color][2];
863c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   gr->pane = pane;
864c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_ADDTAIL(&gr->head, &pane->graph_list);
865c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pane->num_graphs++;
86680b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák   pane->next_color++;
867c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
868c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
869c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákvoid
870c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_graph_add_value(struct hud_graph *gr, uint64_t value)
871c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
8726fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   gr->current_value = value;
8736fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   value = value > gr->pane->ceiling ? gr->pane->ceiling : value;
8746fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
87522cd9040da75cac6e1c61b821e1ac6906ac4a8acEdmondo Tommasina   if (gr->fd)
87622cd9040da75cac6e1c61b821e1ac6906ac4a8acEdmondo Tommasina      fprintf(gr->fd, "%" PRIu64 "\n", value);
87722cd9040da75cac6e1c61b821e1ac6906ac4a8acEdmondo Tommasina
878c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (gr->index == gr->pane->max_num_vertices) {
879c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      gr->vertices[0] = 0;
880c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      gr->vertices[1] = gr->vertices[(gr->index-1)*2+1];
881c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      gr->index = 1;
882c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
88376666b93946e03f032d45f20206be675215f6d40Brian Paul   gr->vertices[(gr->index)*2+0] = (float) (gr->index * 2);
88476666b93946e03f032d45f20206be675215f6d40Brian Paul   gr->vertices[(gr->index)*2+1] = (float) value;
885c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   gr->index++;
886c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
887c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (gr->num_vertices < gr->pane->max_num_vertices) {
888c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      gr->num_vertices++;
889c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
890c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
8916fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   if (gr->pane->dyn_ceiling == true) {
8926fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      hud_pane_update_dyn_ceiling(gr, gr->pane);
8936fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   }
894c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (value > gr->pane->max_value) {
895c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud_pane_set_max_value(gr->pane, value);
896c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
897c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
898c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
899c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
900c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_graph_destroy(struct hud_graph *graph)
901c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
902c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   FREE(graph->vertices);
903c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (graph->free_query_data)
904c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      graph->free_query_data(graph->query_data);
90522cd9040da75cac6e1c61b821e1ac6906ac4a8acEdmondo Tommasina   if (graph->fd)
90622cd9040da75cac6e1c61b821e1ac6906ac4a8acEdmondo Tommasina      fclose(graph->fd);
907c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   FREE(graph);
908c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
909c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
91057f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasinavoid
91157f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasinahud_graph_set_dump_file(struct hud_graph *gr)
91257f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina{
913cb6f49a902cae1b4df795c0e611526dca467a042Marek Olšák#ifndef PIPE_OS_WINDOWS
91457f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina   const char *hud_dump_dir = getenv("GALLIUM_HUD_DUMP_DIR");
91557f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina   char *dump_file;
91657f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina
91757f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina   if (hud_dump_dir && access(hud_dump_dir, W_OK) == 0) {
918abcaba497d8c90a1e9dcede71261bdee16e2ed4eEdmondo Tommasina      dump_file = malloc(strlen(hud_dump_dir) + sizeof("/") + sizeof(gr->name));
91957f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina      if (dump_file) {
92057f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina         strcpy(dump_file, hud_dump_dir);
921abcaba497d8c90a1e9dcede71261bdee16e2ed4eEdmondo Tommasina         strcat(dump_file, "/");
92257f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina         strcat(dump_file, gr->name);
92357f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina         gr->fd = fopen(dump_file, "w+");
92457f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina         free(dump_file);
92557f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina      }
92657f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina   }
927cb6f49a902cae1b4df795c0e611526dca467a042Marek Olšák#endif
92857f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina}
92957f86fb3a8bde60e8c99a46fdccd0dc12377ffd2Edmondo Tommasina
930c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák/**
931c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Read a string from the environment variable.
932c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * The separators "+", ",", ":", and ";" terminate the string.
933c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák * Return the number of read characters.
934c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák */
935c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic int
936c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákparse_string(const char *s, char *out)
937c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
938c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   int i;
939c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
940e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák   for (i = 0; *s && *s != '+' && *s != ',' && *s != ':' && *s != ';' && *s != '=';
941c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák        s++, out++, i++)
942c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      *out = *s;
943c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
944c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   *out = 0;
945c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
946f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul   if (*s && !i) {
947c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      fprintf(stderr, "gallium_hud: syntax error: unexpected '%c' (%i) while "
948c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák              "parsing a string\n", *s, *s);
949f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul      fflush(stderr);
950f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul   }
951f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul
952c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   return i;
953c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
954c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
9556fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutisstatic char *
9566fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutisread_pane_settings(char *str, unsigned * const x, unsigned * const y,
9576fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis               unsigned * const width, unsigned * const height,
95880b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák               uint64_t * const ceiling, boolean * const dyn_ceiling,
9596d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák               boolean *reset_colors, boolean *sort_items)
9606fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis{
9616fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   char *ret = str;
9626fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   unsigned tmp;
9636fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
9646fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   while (*str == '.') {
9656fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      ++str;
9666fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      switch (*str) {
9676fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      case 'x':
9686fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         ++str;
9696fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         *x = strtoul(str, &ret, 10);
9706fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         str = ret;
9716fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         break;
9726fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
9736fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      case 'y':
9746fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         ++str;
9756fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         *y = strtoul(str, &ret, 10);
9766fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         str = ret;
9776fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         break;
9786fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
9796fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      case 'w':
9806fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         ++str;
9816fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         tmp = strtoul(str, &ret, 10);
9826fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         *width = tmp > 80 ? tmp : 80; /* 80 is chosen arbitrarily */
9836fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         str = ret;
9846fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         break;
9856fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
9866fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      /*
9876fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis       * Prevent setting height to less than 50. If the height is set to less,
9886fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis       * the text of the Y axis labels on the graph will start overlapping.
9896fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis       */
9906fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      case 'h':
9916fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         ++str;
9926fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         tmp = strtoul(str, &ret, 10);
9936fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         *height = tmp > 50 ? tmp : 50;
9946fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         str = ret;
9956fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         break;
9966fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
9976fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      case 'c':
9986fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         ++str;
9996fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         tmp = strtoul(str, &ret, 10);
10006fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         *ceiling = tmp > 10 ? tmp : 10;
10016fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         str = ret;
10026fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         break;
10036fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
10046fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      case 'd':
10056fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         ++str;
10066fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         ret = str;
10076fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         *dyn_ceiling = true;
10086fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         break;
10096fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
101080b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák      case 'r':
101180b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák         ++str;
101280b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák         ret = str;
101380b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák         *reset_colors = true;
101480b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák         break;
101580b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák
10166d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák      case 's':
10176d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák         ++str;
10186d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák         ret = str;
10196d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák         *sort_items = true;
10206d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák         break;
10216d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák
10226fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      default:
10236fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         fprintf(stderr, "gallium_hud: syntax error: unexpected '%c'\n", *str);
1024f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul         fflush(stderr);
10256fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      }
10266fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
10276fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   }
10286fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
10296fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   return ret;
10306fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis}
10316fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
1032c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic boolean
1033c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhas_occlusion_query(struct pipe_screen *screen)
1034c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
1035c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   return screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY) != 0;
1036c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
1037c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1038c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic boolean
1039c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhas_streamout(struct pipe_screen *screen)
1040c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
1041c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   return screen->get_param(screen, PIPE_CAP_MAX_STREAM_OUTPUT_BUFFERS) != 0;
1042c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
1043c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
104430284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšákstatic boolean
104530284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšákhas_pipeline_stats_query(struct pipe_screen *screen)
104630284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák{
104730284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák   return screen->get_param(screen, PIPE_CAP_QUERY_PIPELINE_STATISTICS) != 0;
104830284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák}
104930284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák
1050c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
1051c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_parse_env_var(struct hud_context *hud, const char *env)
1052c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
1053c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned num, i;
10546fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   char name_a[256], s[256];
10556fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   char *name;
1056c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_pane *pane = NULL;
1057c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned x = 10, y = 10;
1058c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned width = 251, height = 100;
1059f5071783c112d516ac3a130e86f689323208b143Brian Paul   unsigned period = 500 * 1000;  /* default period (1/2 second) */
10606fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   uint64_t ceiling = UINT64_MAX;
10616fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   unsigned column_width = 251;
10626fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   boolean dyn_ceiling = false;
106380b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák   boolean reset_colors = false;
10646d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák   boolean sort_items = false;
1065f5071783c112d516ac3a130e86f689323208b143Brian Paul   const char *period_env;
1066f5071783c112d516ac3a130e86f689323208b143Brian Paul
1067f5071783c112d516ac3a130e86f689323208b143Brian Paul   /*
1068f5071783c112d516ac3a130e86f689323208b143Brian Paul    * The GALLIUM_HUD_PERIOD env var sets the graph update rate.
1069f5071783c112d516ac3a130e86f689323208b143Brian Paul    * The env var is in seconds (a float).
1070f5071783c112d516ac3a130e86f689323208b143Brian Paul    * Zero means update after every frame.
1071f5071783c112d516ac3a130e86f689323208b143Brian Paul    */
1072f5071783c112d516ac3a130e86f689323208b143Brian Paul   period_env = getenv("GALLIUM_HUD_PERIOD");
1073f5071783c112d516ac3a130e86f689323208b143Brian Paul   if (period_env) {
107476666b93946e03f032d45f20206be675215f6d40Brian Paul      float p = (float) atof(period_env);
107576666b93946e03f032d45f20206be675215f6d40Brian Paul      if (p >= 0.0f) {
1076f5071783c112d516ac3a130e86f689323208b143Brian Paul         period = (unsigned) (p * 1000 * 1000);
1077f5071783c112d516ac3a130e86f689323208b143Brian Paul      }
1078f5071783c112d516ac3a130e86f689323208b143Brian Paul   }
1079c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
10806fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   while ((num = parse_string(env, name_a)) != 0) {
1081c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      env += num;
1082c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
10836fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      /* check for explicit location, size and etc. settings */
10846fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      name = read_pane_settings(name_a, &x, &y, &width, &height, &ceiling,
10856d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák                                &dyn_ceiling, &reset_colors, &sort_items);
10866fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
10876fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis     /*
10886fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      * Keep track of overall column width to avoid pane overlapping in case
10896fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      * later we create a new column while the bottom pane in the current
10906fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      * column is less wide than the rest of the panes in it.
10916fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      */
10926fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis     column_width = width > column_width ? width : column_width;
10936fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
1094c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      if (!pane) {
10956fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         pane = hud_pane_create(x, y, x + width, y + height, period, 10,
10966d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák                         ceiling, dyn_ceiling, sort_items);
1097c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         if (!pane)
1098c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            return;
1099c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1100c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
110180b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák      if (reset_colors) {
110280b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák         pane->next_color = 0;
110380b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák         reset_colors = false;
110480b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák      }
110580b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák
1106010811461982b6a32329e7666120be27f134a66cMarek Olšák      /* Add a graph. */
11078c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#if HAVE_GALLIUM_EXTRA_HUD || HAVE_LIBSENSORS
11088c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      char arg_name[64];
11098c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#endif
1110010811461982b6a32329e7666120be27f134a66cMarek Olšák      /* IF YOU CHANGE THIS, UPDATE print_help! */
1111c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      if (strcmp(name, "fps") == 0) {
1112c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         hud_fps_graph_install(pane);
1113c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1114c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      else if (strcmp(name, "cpu") == 0) {
1115c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         hud_cpu_graph_install(pane, ALL_CPUS);
1116c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1117c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      else if (sscanf(name, "cpu%u%s", &i, s) == 1) {
1118c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         hud_cpu_graph_install(pane, i);
1119c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
11208c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#if HAVE_GALLIUM_EXTRA_HUD
11218c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "nic-rx-%s", arg_name) == 1) {
11228c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_nic_graph_install(pane, arg_name, NIC_DIRECTION_RX);
11238c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11248c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "nic-tx-%s", arg_name) == 1) {
11258c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_nic_graph_install(pane, arg_name, NIC_DIRECTION_TX);
11268c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11278c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "nic-rssi-%s", arg_name) == 1) {
11288c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_nic_graph_install(pane, arg_name, NIC_RSSI_DBM);
11298c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_DBM;
11308c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11318c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "diskstat-rd-%s", arg_name) == 1) {
11328c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_diskstat_graph_install(pane, arg_name, DISKSTAT_RD);
11338c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_BYTES;
11348c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11358c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "diskstat-wr-%s", arg_name) == 1) {
11368c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_diskstat_graph_install(pane, arg_name, DISKSTAT_WR);
11378c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_BYTES;
11388c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
1139e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth      else if (sscanf(name, "cpufreq-min-cpu%u", &i) == 1) {
1140e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth         hud_cpufreq_graph_install(pane, i, CPUFREQ_MINIMUM);
1141e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_HZ;
1142e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth      }
1143e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth      else if (sscanf(name, "cpufreq-cur-cpu%u", &i) == 1) {
1144e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth         hud_cpufreq_graph_install(pane, i, CPUFREQ_CURRENT);
1145e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_HZ;
1146e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth      }
1147e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth      else if (sscanf(name, "cpufreq-max-cpu%u", &i) == 1) {
1148e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth         hud_cpufreq_graph_install(pane, i, CPUFREQ_MAXIMUM);
1149e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_HZ;
1150e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth      }
11518c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#endif
11528c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#if HAVE_LIBSENSORS
11538c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "sensors_temp_cu-%s", arg_name) == 1) {
11548c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_sensors_temp_graph_install(pane, arg_name,
11558c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth                                        SENSORS_TEMP_CURRENT);
11568c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_TEMPERATURE;
11578c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11588c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "sensors_temp_cr-%s", arg_name) == 1) {
11598c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_sensors_temp_graph_install(pane, arg_name,
11608c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth                                        SENSORS_TEMP_CRITICAL);
11618c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_TEMPERATURE;
11628c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11638c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "sensors_volt_cu-%s", arg_name) == 1) {
11648c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_sensors_temp_graph_install(pane, arg_name,
11658c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth                                        SENSORS_VOLTAGE_CURRENT);
11668c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_VOLTS;
11678c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11688c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      else if (sscanf(name, "sensors_curr_cu-%s", arg_name) == 1) {
11698c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         hud_sensors_temp_graph_install(pane, arg_name,
11708c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth                                        SENSORS_CURRENT_CURRENT);
11718c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_AMPS;
11728c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth      }
11731d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth      else if (sscanf(name, "sensors_pow_cu-%s", arg_name) == 1) {
11741d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth         hud_sensors_temp_graph_install(pane, arg_name,
11751d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth                                        SENSORS_POWER_CURRENT);
11761d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth         pane->type = PIPE_DRIVER_QUERY_TYPE_WATTS;
11771d466b9b04662d41a403ea8fd617a5365750b1deSteven Toth      }
11788c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#endif
11793d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller      else if (strcmp(name, "samples-passed") == 0 &&
1180c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák               has_occlusion_query(hud->pipe->screen)) {
1181424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle         hud_pipe_query_install(&hud->batch_query, pane, hud->pipe,
1182424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                "samples-passed",
118386ebd31c672f389f354e11b7aef4513dc8b76f13Brian Paul                                PIPE_QUERY_OCCLUSION_COUNTER, 0, 0,
118497a65d90fe88e6b4b4a42d866b23e73ce72f6dc2Marek Olšák                                PIPE_DRIVER_QUERY_TYPE_UINT64,
1185424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                PIPE_DRIVER_QUERY_RESULT_TYPE_AVERAGE,
1186424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                0);
1187c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1188c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      else if (strcmp(name, "primitives-generated") == 0 &&
1189c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák               has_streamout(hud->pipe->screen)) {
1190424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle         hud_pipe_query_install(&hud->batch_query, pane, hud->pipe,
1191424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                "primitives-generated",
119286ebd31c672f389f354e11b7aef4513dc8b76f13Brian Paul                                PIPE_QUERY_PRIMITIVES_GENERATED, 0, 0,
119397a65d90fe88e6b4b4a42d866b23e73ce72f6dc2Marek Olšák                                PIPE_DRIVER_QUERY_TYPE_UINT64,
1194424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                PIPE_DRIVER_QUERY_RESULT_TYPE_AVERAGE,
1195424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                0);
11963d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller      }
119730284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák      else {
119830284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák         boolean processed = FALSE;
119930284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák
120030284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák         /* pipeline statistics queries */
120130284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák         if (has_pipeline_stats_query(hud->pipe->screen)) {
12023d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller            static const char *pipeline_statistics_names[] =
12033d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller            {
12043d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "ia-vertices",
12053d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "ia-primitives",
12063d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "vs-invocations",
12073d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "gs-invocations",
12083d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "gs-primitives",
12093d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "clipper-invocations",
12103d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "clipper-primitives-generated",
12113d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "ps-invocations",
12123d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "hs-invocations",
12133d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "ds-invocations",
12143d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller               "cs-invocations"
12153d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller            };
1216d902504a677d39ace99b1f34a7a4d06d644dfb3dBrian Paul            for (i = 0; i < ARRAY_SIZE(pipeline_statistics_names); ++i)
121730284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák               if (strcmp(name, pipeline_statistics_names[i]) == 0)
12183d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller                  break;
1219d902504a677d39ace99b1f34a7a4d06d644dfb3dBrian Paul            if (i < ARRAY_SIZE(pipeline_statistics_names)) {
1220424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle               hud_pipe_query_install(&hud->batch_query, pane, hud->pipe, name,
12213d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller                                      PIPE_QUERY_PIPELINE_STATISTICS, i,
122297a65d90fe88e6b4b4a42d866b23e73ce72f6dc2Marek Olšák                                      0, PIPE_DRIVER_QUERY_TYPE_UINT64,
1223424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                      PIPE_DRIVER_QUERY_RESULT_TYPE_AVERAGE,
1224424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                      0);
122530284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák               processed = TRUE;
122630284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák            }
12273d2790cead7eb744341e8b1708b7a6d03524768dChristoph Bumiller         }
122830284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák
122930284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák         /* driver queries */
123030284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák         if (!processed) {
1231424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle            if (!hud_driver_query_install(&hud->batch_query, pane, hud->pipe,
1232424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle                                          name)) {
123330284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák               fprintf(stderr, "gallium_hud: unknown driver query '%s'\n", name);
1234f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul               fflush(stderr);
123530284f88924dcc1c7eafdc316f09531c46d6e2a8Marek Olšák            }
1236c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         }
1237c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1238c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1239c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      if (*env == ':') {
1240c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         env++;
1241c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1242c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         if (!pane) {
1243c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            fprintf(stderr, "gallium_hud: syntax error: unexpected ':', "
1244c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                    "expected a name\n");
1245f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul            fflush(stderr);
1246c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            break;
1247c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         }
1248c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1249c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         num = parse_string(env, s);
1250c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         env += num;
1251c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1252c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         if (num && sscanf(s, "%u", &i) == 1) {
1253c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            hud_pane_set_max_value(pane, i);
12546fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis            pane->initial_max_value = i;
1255c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         }
1256c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         else {
1257c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            fprintf(stderr, "gallium_hud: syntax error: unexpected '%c' (%i) "
1258e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák                            "after ':'\n", *env, *env);
1259f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul            fflush(stderr);
1260c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         }
1261c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1262c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1263e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák      if (*env == '=') {
1264e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         env++;
1265e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák
1266e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         if (!pane) {
1267e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák            fprintf(stderr, "gallium_hud: syntax error: unexpected '=', "
1268e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák                    "expected a name\n");
1269e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák            fflush(stderr);
1270e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák            break;
1271e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         }
1272e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák
1273e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         num = parse_string(env, s);
1274e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         env += num;
1275e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák
1276e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         strip_hyphens(s);
1277e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         if (!LIST_IS_EMPTY(&pane->graph_list)) {
12788daf6de3deddef8f71f8b1af61b12cd8cb783433Thomas Hindoe Paaboel Andersen            struct hud_graph *graph;
12798daf6de3deddef8f71f8b1af61b12cd8cb783433Thomas Hindoe Paaboel Andersen            graph = LIST_ENTRY(struct hud_graph, pane->graph_list.prev, head);
12808daf6de3deddef8f71f8b1af61b12cd8cb783433Thomas Hindoe Paaboel Andersen            strncpy(graph->name, s, sizeof(graph->name)-1);
12818daf6de3deddef8f71f8b1af61b12cd8cb783433Thomas Hindoe Paaboel Andersen            graph->name[sizeof(graph->name)-1] = 0;
1282e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák         }
1283e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák      }
1284e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák
1285c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      if (*env == 0)
1286c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         break;
1287c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1288c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      /* parse a separator */
1289c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      switch (*env) {
1290c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      case '+':
1291c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         env++;
1292c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         break;
1293c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1294c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      case ',':
1295c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         env++;
1296006fcc0da674ca18ebf07771e3c309997ab32798Marek Olšák         if (!pane)
1297006fcc0da674ca18ebf07771e3c309997ab32798Marek Olšák            break;
1298006fcc0da674ca18ebf07771e3c309997ab32798Marek Olšák
1299c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         y += height + hud->font.glyph_height * (pane->num_graphs + 2);
13006fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         height = 100;
1301c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1302c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         if (pane && pane->num_graphs) {
1303c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            LIST_ADDTAIL(&pane->head, &hud->pane_list);
1304c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            pane = NULL;
1305c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         }
1306c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         break;
1307c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1308c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      case ';':
1309c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         env++;
1310c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         y = 10;
1311a33eb48d6111cb679a5ce8b35c5d7e4854f0045dMarek Olšák         x += column_width + hud->font.glyph_width * 9;
13126fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         height = 100;
1313c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1314c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         if (pane && pane->num_graphs) {
1315c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            LIST_ADDTAIL(&pane->head, &hud->pane_list);
1316c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák            pane = NULL;
1317c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         }
13186fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
13196fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         /* Starting a new column; reset column width. */
13206fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis         column_width = 251;
1321c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         break;
1322c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1323c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      default:
1324c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         fprintf(stderr, "gallium_hud: syntax error: unexpected '%c'\n", *env);
1325f4dd3bde3750c9e677eb916f846b942765febbb7Brian Paul         fflush(stderr);
1326c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
13276fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
13286fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      /* Reset to defaults for the next pane in case these were modified. */
13296fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      width = 251;
13306fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      ceiling = UINT64_MAX;
13316fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis      dyn_ceiling = false;
13326d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák      sort_items = false;
13336fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis
1334c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1335c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1336c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (pane) {
1337c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      if (pane->num_graphs) {
1338c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         LIST_ADDTAIL(&pane->head, &hud->pane_list);
1339c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1340c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      else {
1341c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         FREE(pane);
1342c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1343c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1344c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
1345c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1346c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstatic void
1347c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákprint_help(struct pipe_screen *screen)
1348c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
1349c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   int i, num_queries, num_cpus = hud_get_num_cpus();
1350c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1351c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("Syntax: GALLIUM_HUD=name1[+name2][...][:value1][,nameI...][;nameJ...]");
1352c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("");
1353c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  Names are identifiers of data sources which will be drawn as graphs");
1354c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  in panes. Multiple graphs can be drawn in the same pane.");
1355c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  There can be multiple panes placed in rows and columns.");
1356c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("");
1357c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  '+' separates names which will share a pane.");
1358c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  ':[value]' specifies the initial maximum value of the Y axis");
1359c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("             for the given pane.");
1360c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  ',' creates a new pane below the last one.");
1361c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  ';' creates a new pane at the top of the next column.");
1362e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák   puts("  '=' followed by a string, changes the name of the last data source");
1363e8bb97ce30051b999a4a69c9b27884daeb8d71e6Marek Olšák   puts("      to that string");
1364c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("");
1365c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  Example: GALLIUM_HUD=\"cpu,fps;primitives-generated\"");
1366c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("");
13676fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  Additionally, by prepending '.[identifier][value]' modifiers to");
13686fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  a name, it is possible to explicitly set the location and size");
13696fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  of a pane, along with limiting overall maximum value of the");
13706fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  Y axis and activating dynamic readjustment of the Y axis.");
13716fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  Several modifiers may be applied to the same pane simultaneously.");
13726fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("");
13736fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  'x[value]' sets the location of the pane on the x axis relative");
13746fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("             to the upper-left corner of the viewport, in pixels.");
13756fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  'y[value]' sets the location of the pane on the y axis relative");
13766fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("             to the upper-left corner of the viewport, in pixels.");
13776fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  'w[value]' sets width of the graph pixels.");
13786fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  'h[value]' sets height of the graph in pixels.");
13796fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  'c[value]' sets the ceiling of the value of the Y axis.");
13806fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("             If the graph needs to draw values higher than");
13816fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("             the ceiling allows, the value is clamped.");
13826fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  'd' activates dynamic Y axis readjustment to set the value of");
13836fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("      the Y axis to match the highest value still visible in the graph.");
138480b8b9c8a4557f178d01d98bc88c9b2f944af305Marek Olšák   puts("  'r' resets the color counter (the next color will be green)");
13856d54cd75a893ff643745e711e0c5ba14a465f505Marek Olšák   puts("  's' sort items below graphs in descending order");
13866fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("");
13876fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  If 'c' and 'd' modifiers are used simultaneously, both are in effect:");
13886fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  the Y axis does not go above the restriction imposed by 'c' while");
13896fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  still adjusting the value of the Y axis down when appropriate.");
13906fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("");
13916fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("  Example: GALLIUM_HUD=\".w256.h64.x1600.y520.d.c1000fps+cpu,.datom-count\"");
13926fc0cd2f52ddc4a1e7026c9c46fd6da3968fa439Gediminas Jakutis   puts("");
1393c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("  Available names:");
1394c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("    fps");
1395c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("    cpu");
1396c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1397c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   for (i = 0; i < num_cpus; i++)
1398c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      printf("    cpu%i\n", i);
1399c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1400c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (has_occlusion_query(screen))
1401010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    samples-passed");
1402c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (has_streamout(screen))
1403c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      puts("    primitives-generated");
1404c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1405010811461982b6a32329e7666120be27f134a66cMarek Olšák   if (has_pipeline_stats_query(screen)) {
1406010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    ia-vertices");
1407010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    ia-primitives");
1408010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    vs-invocations");
1409010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    gs-invocations");
1410010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    gs-primitives");
1411010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    clipper-invocations");
1412010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    clipper-primitives-generated");
1413010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    ps-invocations");
1414010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    hs-invocations");
1415010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    ds-invocations");
1416010811461982b6a32329e7666120be27f134a66cMarek Olšák      puts("    cs-invocations");
1417010811461982b6a32329e7666120be27f134a66cMarek Olšák   }
1418010811461982b6a32329e7666120be27f134a66cMarek Olšák
14198c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#if HAVE_GALLIUM_EXTRA_HUD
14208c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   hud_get_num_disks(1);
14218c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   hud_get_num_nics(1);
1422e99b9395befe5b8612df3163b4deec2a0c0cb702Steven Toth   hud_get_num_cpufreq(1);
14238c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#endif
14248c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#if HAVE_LIBSENSORS
14258c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth   hud_get_num_sensors(1);
14268c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth#endif
14278c60bcb4c317026e017a8ecffe303fd4e7f0db33Steven Toth
1428c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (screen->get_driver_query_info){
1429f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle      boolean skipping = false;
1430c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      struct pipe_driver_query_info info;
1431c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      num_queries = screen->get_driver_query_info(screen, 0, NULL);
1432c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1433c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      for (i = 0; i < num_queries; i++){
1434c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         screen->get_driver_query_info(screen, i, &info);
1435f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle         if (info.flags & PIPE_DRIVER_QUERY_FLAG_DONT_LIST) {
1436f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle            if (!skipping)
1437f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle               puts("    ...");
1438f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle            skipping = true;
1439f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle         } else {
1440f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle            printf("    %s\n", info.name);
1441f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle            skipping = false;
1442f36d9857cd35300d23c6be092feb6cd8c8a0e290Nicolai Hähnle         }
1443c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1444c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1445c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1446c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   puts("");
14476447e9dbfad851f700266dda8003b76e172ae92bBrian Paul   fflush(stdout);
1448c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
1449c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1450c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákstruct hud_context *
1451c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_create(struct pipe_context *pipe, struct cso_context *cso)
1452c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
1453b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák   struct pipe_screen *screen = pipe->screen;
1454c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_context *hud;
1455c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_sampler_view view_templ;
1456c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   unsigned i;
1457c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   const char *env = debug_get_option("GALLIUM_HUD", NULL);
14581cfffb95ebf49a8342d4799e68ecc0009300cb2fBrian Paul#ifdef PIPE_OS_UNIX
1459d221a6545cc0778716f1abf45fd096d6cd5a1b8eBrian Paul   unsigned signo = debug_get_num_option("GALLIUM_HUD_TOGGLE_SIGNAL", 0);
146056a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   static boolean sig_handled = FALSE;
146156a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   struct sigaction action = {};
14621cfffb95ebf49a8342d4799e68ecc0009300cb2fBrian Paul#endif
146356a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   huds_visible = debug_get_bool_option("GALLIUM_HUD_VISIBLE", TRUE);
1464c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1465c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (!env || !*env)
1466c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return NULL;
1467c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1468c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (strcmp(env, "help") == 0) {
1469c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      print_help(pipe->screen);
1470c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return NULL;
1471c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1472c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1473c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud = CALLOC_STRUCT(hud_context);
1474c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (!hud)
1475c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return NULL;
1476c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1477c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->pipe = pipe;
1478c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->cso = cso;
147937d0aea772a39f9ae7fe3d791e23c1be03ccf9deMarek Olšák   hud->uploader = u_upload_create(pipe, 256 * 1024,
1480ecb2da1559bcb9a9eec7ac224c8ff47b026c95ffMarek Olšák                                   PIPE_BIND_VERTEX_BUFFER, PIPE_USAGE_STREAM);
1481c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1482c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* font */
1483c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   if (!util_font_create(pipe, UTIL_FONT_FIXED_8X13, &hud->font)) {
1484c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      u_upload_destroy(hud->uploader);
1485c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      FREE(hud);
1486c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      return NULL;
1487c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1488c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1489b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák   hud->has_srgb = screen->is_format_supported(screen,
1490b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák                                               PIPE_FORMAT_B8G8R8A8_SRGB,
1491b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák                                               PIPE_TEXTURE_2D, 0,
1492b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák                                               PIPE_BIND_RENDER_TARGET) != 0;
1493b9c9551c09caac241ea44b618748c133897d59b9Marek Olšák
1494c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* blend state */
14956902f9e82a1d4c4ff12ac6b55b96d2ef5feb26e3Marek Olšák   hud->no_blend.rt[0].colormask = PIPE_MASK_RGBA;
14966902f9e82a1d4c4ff12ac6b55b96d2ef5feb26e3Marek Olšák
1497c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].colormask = PIPE_MASK_RGBA;
1498c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].blend_enable = 1;
1499c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].rgb_func = PIPE_BLEND_ADD;
1500c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_SRC_ALPHA;
1501c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_INV_SRC_ALPHA;
1502c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].alpha_func = PIPE_BLEND_ADD;
1503c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ZERO;
1504c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->alpha_blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ONE;
1505c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1506c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* fragment shader */
1507c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->fs_color =
1508c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         util_make_fragment_passthrough_shader(pipe,
1509c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                                               TGSI_SEMANTIC_COLOR,
1510de1c38299ceb3160ed0c163d4dd8944ec6589a7fMarek Olšák                                               TGSI_INTERPOLATE_CONSTANT,
1511de1c38299ceb3160ed0c163d4dd8944ec6589a7fMarek Olšák                                               TRUE);
1512c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1513f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák   {
1514f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák      /* Read a texture and do .xxxx swizzling. */
1515f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák      static const char *fragment_shader_text = {
1516f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "FRAG\n"
1517f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "DCL IN[0], GENERIC[0], LINEAR\n"
1518f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "DCL SAMP[0]\n"
15195a9f2a2d8957676cdb4843dc9026639381495ae8Brian Paul         "DCL SVIEW[0], RECT, FLOAT\n"
1520f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "DCL OUT[0], COLOR[0]\n"
1521f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "DCL TEMP[0]\n"
1522f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák
1523f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "TEX TEMP[0], IN[0], SAMP[0], RECT\n"
1524f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "MOV OUT[0], TEMP[0].xxxx\n"
1525f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         "END\n"
1526f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák      };
1527f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák
1528f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák      struct tgsi_token tokens[1000];
1529425dc4c4b3663c619634de9f9f00c7765e7d0320Rob Clark      struct pipe_shader_state state;
1530f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák
1531d902504a677d39ace99b1f34a7a4d06d644dfb3dBrian Paul      if (!tgsi_text_translate(fragment_shader_text, tokens, ARRAY_SIZE(tokens))) {
1532f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         assert(0);
1533f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         pipe_resource_reference(&hud->font.texture, NULL);
1534f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         u_upload_destroy(hud->uploader);
1535f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         FREE(hud);
1536f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák         return NULL;
1537f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák      }
1538425dc4c4b3663c619634de9f9f00c7765e7d0320Rob Clark      pipe_shader_state_from_tgsi(&state, tokens);
1539f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák      hud->fs_text = pipe->create_fs_state(pipe, &state);
1540f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák   }
1541c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1542c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* rasterizer */
15432737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   hud->rasterizer.half_pixel_center = 1;
15442737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   hud->rasterizer.bottom_edge_rule = 1;
1545c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->rasterizer.depth_clip = 1;
1546c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->rasterizer.line_width = 1;
1547c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->rasterizer.line_last_pixel = 1;
1548c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
15496ffde82083e07d86d1e60b00d245af436752fd5eMarek Olšák   hud->rasterizer_aa_lines = hud->rasterizer;
15506ffde82083e07d86d1e60b00d245af436752fd5eMarek Olšák   hud->rasterizer_aa_lines.line_smooth = 1;
15516ffde82083e07d86d1e60b00d245af436752fd5eMarek Olšák
1552c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* vertex shader */
1553c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   {
1554c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      static const char *vertex_shader_text = {
1555c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "VERT\n"
1556c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "DCL IN[0..1]\n"
1557c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "DCL OUT[0], POSITION\n"
1558c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "DCL OUT[1], COLOR[0]\n" /* color */
1559c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "DCL OUT[2], GENERIC[0]\n" /* texcoord */
1560c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         /* [0] = color,
1561c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák          * [1] = (2/fb_width, 2/fb_height, xoffset, yoffset)
1562c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák          * [2] = (xscale, yscale, 0, 0) */
1563c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "DCL CONST[0..2]\n"
1564c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "DCL TEMP[0]\n"
1565c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "IMM[0] FLT32 { -1, 0, 0, 1 }\n"
1566c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1567c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         /* v = in * (xscale, yscale) + (xoffset, yoffset) */
1568c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "MAD TEMP[0].xy, IN[0], CONST[2].xyyy, CONST[1].zwww\n"
1569c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         /* pos = v * (2 / fb_width, 2 / fb_height) - (1, 1) */
1570c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "MAD OUT[0].xy, TEMP[0], CONST[1].xyyy, IMM[0].xxxx\n"
1571c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "MOV OUT[0].zw, IMM[0]\n"
1572c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1573c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "MOV OUT[1], CONST[0]\n"
1574c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "MOV OUT[2], IN[1]\n"
1575c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         "END\n"
1576c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      };
1577c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1578c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      struct tgsi_token tokens[1000];
1579425dc4c4b3663c619634de9f9f00c7765e7d0320Rob Clark      struct pipe_shader_state state;
1580d902504a677d39ace99b1f34a7a4d06d644dfb3dBrian Paul      if (!tgsi_text_translate(vertex_shader_text, tokens, ARRAY_SIZE(tokens))) {
1581c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         assert(0);
1582c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         pipe_resource_reference(&hud->font.texture, NULL);
1583c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         u_upload_destroy(hud->uploader);
1584c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         FREE(hud);
1585c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         return NULL;
1586c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1587425dc4c4b3663c619634de9f9f00c7765e7d0320Rob Clark      pipe_shader_state_from_tgsi(&state, tokens);
1588c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->vs = pipe->create_vs_state(pipe, &state);
1589c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1590c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1591c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* vertex elements */
1592c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   for (i = 0; i < 2; i++) {
1593c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->velems[i].src_offset = i * 2 * sizeof(float);
1594c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->velems[i].src_format = PIPE_FORMAT_R32G32_FLOAT;
1595c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      hud->velems[i].vertex_buffer_index = cso_get_aux_vertex_buffer_slot(cso);
1596c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1597c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1598c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* sampler view */
1599786f01c492bb6a90a4835389666dd0c5c984ea6aIlia Mirkin   u_sampler_view_default_template(
1600786f01c492bb6a90a4835389666dd0c5c984ea6aIlia Mirkin         &view_templ, hud->font.texture, hud->font.texture->format);
1601c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->font_sampler_view = pipe->create_sampler_view(pipe, hud->font.texture,
1602c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák                                                      &view_templ);
1603c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
16046211c45186745e58e7722f33562c028d4fe2cee3Brian Paul   /* sampler state (for font drawing) */
16056211c45186745e58e7722f33562c028d4fe2cee3Brian Paul   hud->font_sampler_state.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
16066211c45186745e58e7722f33562c028d4fe2cee3Brian Paul   hud->font_sampler_state.wrap_t = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
16076211c45186745e58e7722f33562c028d4fe2cee3Brian Paul   hud->font_sampler_state.wrap_r = PIPE_TEX_WRAP_CLAMP_TO_EDGE;
16086211c45186745e58e7722f33562c028d4fe2cee3Brian Paul   hud->font_sampler_state.normalized_coords = 0;
16096211c45186745e58e7722f33562c028d4fe2cee3Brian Paul
1610c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   /* constants */
1611c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constbuf.buffer_size = sizeof(hud->constants);
1612c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud->constbuf.user_buffer = &hud->constants;
1613c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1614c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_INITHEAD(&hud->pane_list);
1615c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
161656a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   /* setup sig handler once for all hud contexts */
16171cfffb95ebf49a8342d4799e68ecc0009300cb2fBrian Paul#ifdef PIPE_OS_UNIX
161856a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   if (!sig_handled && signo != 0) {
161956a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry      action.sa_sigaction = &signal_visible_handler;
162056a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry      action.sa_flags = SA_SIGINFO;
162156a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry
162256a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry      if (signo >= NSIG)
162356a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry         fprintf(stderr, "gallium_hud: invalid signal %u\n", signo);
162456a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry      else if (sigaction(signo, &action, NULL) < 0)
162556a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry         fprintf(stderr, "gallium_hud: unable to set handler for signal %u\n", signo);
162656a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry      fflush(stderr);
162756a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry
162856a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry      sig_handled = TRUE;
162956a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry   }
16301cfffb95ebf49a8342d4799e68ecc0009300cb2fBrian Paul#endif
163156a1c10bb8cc957caa9ebc3723b4692a522a02f5Jimmy Berry
1632c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   hud_parse_env_var(hud, env);
1633c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   return hud;
1634c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
1635c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1636c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákvoid
1637c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšákhud_destroy(struct hud_context *hud)
1638c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák{
1639c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct pipe_context *pipe = hud->pipe;
1640c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_pane *pane, *pane_tmp;
1641c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   struct hud_graph *graph, *graph_tmp;
1642c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1643c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   LIST_FOR_EACH_ENTRY_SAFE(pane, pane_tmp, &hud->pane_list, head) {
1644c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      LIST_FOR_EACH_ENTRY_SAFE(graph, graph_tmp, &pane->graph_list, head) {
1645c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         LIST_DEL(&graph->head);
1646c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák         hud_graph_destroy(graph);
1647c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      }
1648c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      LIST_DEL(&pane->head);
1649c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák      FREE(pane);
1650c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   }
1651c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák
1652424a614ff1105dcb5195178cb8f04ac46b8c0d8aNicolai Hähnle   hud_batch_query_cleanup(&hud->batch_query);
1653c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe->delete_fs_state(pipe, hud->fs_color);
1654f8502b7e719ca62930b90192fadfe696ebf3cd97Marek Olšák   pipe->delete_fs_state(pipe, hud->fs_text);
1655c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe->delete_vs_state(pipe, hud->vs);
1656c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe_sampler_view_reference(&hud->font_sampler_view, NULL);
1657c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   pipe_resource_reference(&hud->font.texture, NULL);
1658c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   u_upload_destroy(hud->uploader);
1659c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák   FREE(hud);
1660c91cf7d7d2c8cc377945c79be87799c31ce9ae59Marek Olšák}
1661