[Mesa-dev] gallium/hud: control visibility at startup and runtime.

Brian Paul brianp at vmware.com
Tue Nov 3 07:43:18 PST 2015


On 11/03/2015 03:43 AM, boombatower wrote:
> - env GALLIUM_HUD_VISIBLE: control default visibility
> - env GALLIUM_HUD_SIGNAL_TOGGLE: toggle visibility via signal
> ---
>   docs/envvars.html                       |  6 ++++++
>   src/gallium/auxiliary/hud/hud_context.c | 23 +++++++++++++++++++++++
>   2 files changed, 29 insertions(+)
>
> diff --git a/docs/envvars.html b/docs/envvars.html
> index bdfe999..530bbb7 100644
> --- a/docs/envvars.html
> +++ b/docs/envvars.html
> @@ -179,6 +179,12 @@ Mesa EGL supports different sets of environment variables.  See the
>   <li>GALLIUM_HUD - draws various information on the screen, like framerate,
>       cpu load, driver statistics, performance counters, etc.
>       Set GALLIUM_HUD=help and run e.g. glxgears for more info.
> +<li>GALLIUM_HUD_VISIBLE - control default visibility, defaults to true.
> +<li>GALLIUM_HUD_TOGGLE_SIGNAL - toggle visibility via user specified signal.
> +    Especially useful to toggle hud at specific points of application and
> +    disable for unencumbered viewing the rest of the time. For example, set
> +    GALLIUM_HUD_VISIBLE to false and GALLIUM_HUD_SIGNAL_TOGGLE to 10 (SIGUSR1).
> +    Use kill -10 <pid> to toggle the hud as desired.
>   <li>GALLIUM_LOG_FILE - specifies a file for logging all errors, warnings, etc.
>       rather than stderr.
>   <li>GALLIUM_PRINT_OPTIONS - if non-zero, print all the Gallium environment
> diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c
> index ffe30b8..f6bfa80 100644
> --- a/src/gallium/auxiliary/hud/hud_context.c
> +++ b/src/gallium/auxiliary/hud/hud_context.c
> @@ -33,6 +33,7 @@
>    * Set GALLIUM_HUD=help for more info.
>    */
>
> +#include <signal.h>
>   #include <stdio.h>
>
>   #include "hud/hud_context.h"
> @@ -51,8 +52,10 @@
>   #include "tgsi/tgsi_text.h"
>   #include "tgsi/tgsi_dump.h"
>
> +static boolean __visible_toggle = false;

There's no need for the double underscore prefix.  Maybe "toggle_hud" 
would be a better name.  And there should probably be a comment on it 
explaining how it works.  It's not obvious.

Let's either use gallium's boolean/TRUE/FALSE or stdbool's 
bool/true/false rather than mix them.


>
>   struct hud_context {
> +   boolean visible;
>      struct pipe_context *pipe;
>      struct cso_context *cso;
>      struct u_upload_mgr *uploader;
> @@ -95,6 +98,11 @@ struct hud_context {
>      } text, bg, whitelines;
>   };
>
> +static void
> +signal_visible_handler(int signo)
> +{
> +   __visible_toggle = true;
> +}
>
>   static void
>   hud_draw_colored_prims(struct hud_context *hud, unsigned prim,
> @@ -431,8 +439,15 @@ hud_alloc_vertices(struct hud_context *hud, struct vertex_queue *v,
>   void
>   hud_draw(struct hud_context *hud, struct pipe_resource *tex)
>   {
> +   if (__visible_toggle) {
> +      hud->visible = !hud->visible;
> +      __visible_toggle = false;
> +   }
> +   if (!hud->visible) return;

Please put 'return' on the next line.

I keep forgetting, but I think some compilers complain about 
declarations after code, so this should be moved after the declarations 
below.


> +
>      struct cso_context *cso = hud->cso;
>      struct pipe_context *pipe = hud->pipe;
> +

No need to introduce a new empty line here.

>      struct pipe_framebuffer_state fb;
>      struct pipe_surface surf_templ, *surf;
>      struct pipe_viewport_state viewport;
> @@ -1124,7 +1139,9 @@ hud_create(struct pipe_context *pipe, struct cso_context *cso)
>      struct hud_context *hud;
>      struct pipe_sampler_view view_templ;
>      unsigned i;
> +   boolean visible = debug_get_bool_option("GALLIUM_HUD_VISIBLE", true);
>      const char *env = debug_get_option("GALLIUM_HUD", NULL);
> +   long signo = debug_get_num_option("GALLIUM_HUD_TOGGLE_SIGNAL", 0);

Can we avoid calling debug_get_bool/num_option() for every draw call? 
Wouldn't hud_create() be a better place for this?


>
>      if (!env || !*env)
>         return NULL;
> @@ -1138,6 +1155,7 @@ hud_create(struct pipe_context *pipe, struct cso_context *cso)
>      if (!hud)
>         return NULL;
>
> +   hud->visible = visible;
>      hud->pipe = pipe;
>      hud->cso = cso;
>      hud->uploader = u_upload_create(pipe, 256 * 1024, 16,
> @@ -1267,6 +1285,11 @@ hud_create(struct pipe_context *pipe, struct cso_context *cso)
>
>      LIST_INITHEAD(&hud->pane_list);
>
> +   if (signo < 1 || signo >= NSIG)
> +      fprintf(stderr, "gallium_hud: invalid signal %ld\n", signo);
> +   else if (signal(signo, signal_visible_handler) == SIG_ERR)
> +      fprintf(stderr, "gallium_hud: unable to set handler for signal %ld\n", signo);

Can that go into hud_create() too?

Finally, I'll need to check if any of this can work on Windows.  If not, 
we'll need some #ifndef PIPE_OS_WINDOWS tests...

-Brian

> +
>      hud_parse_env_var(hud, env);
>      return hud;
>   }
>



More information about the mesa-dev mailing list