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

Brian Paul brianp at vmware.com
Tue Nov 10 07:34:52 PST 2015


On 11/09/2015 10:20 PM, Jimmy Berry wrote:
> On Mon, Nov 9, 2015 at 11:28 AM, Brian Paul <brianp at vmware.com> wrote:
>> On 11/07/2015 09:05 PM, Jimmy Berry 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 | 28
>>> ++++++++++++++++++++++++++++
>>>    2 files changed, 34 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..31e55cd 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,6 +52,8 @@
>>>    #include "tgsi/tgsi_text.h"
>>>    #include "tgsi/tgsi_dump.h"
>>>
>>> +/* Control the visibility of all HUD contexts */
>>> +static boolean huds_visible = TRUE;
>>>
>>>    struct hud_context {
>>>       struct pipe_context *pipe;
>>> @@ -95,6 +98,11 @@ struct hud_context {
>>>       } text, bg, whitelines;
>>>    };
>>>
>>> +static void
>>> +signal_visible_handler(int sig, siginfo_t *siginfo, void *context)
>>> +{
>>> +   huds_visible = !huds_visible;
>>> +}
>>>
>>>    static void
>>>    hud_draw_colored_prims(struct hud_context *hud, unsigned prim,
>>> @@ -441,6 +449,9 @@ hud_draw(struct hud_context *hud, struct pipe_resource
>>> *tex)
>>>       struct hud_pane *pane;
>>>       struct hud_graph *gr;
>>>
>>> +   if (!huds_visible)
>>> +      return;
>>> +
>>>       hud->fb_width = tex->width0;
>>>       hud->fb_height = tex->height0;
>>>       hud->constants.two_div_fb_width = 2.0f / hud->fb_width;
>>> @@ -1125,6 +1136,10 @@ hud_create(struct pipe_context *pipe, struct
>>> cso_context *cso)
>>>       struct pipe_sampler_view view_templ;
>>>       unsigned i;
>>>       const char *env = debug_get_option("GALLIUM_HUD", NULL);
>>> +   long signo = debug_get_num_option("GALLIUM_HUD_TOGGLE_SIGNAL", 0);
>>> +   boolean sig_handled = FALSE;
>>> +   struct sigaction action = {};
>>> +   huds_visible = debug_get_bool_option("GALLIUM_HUD_VISIBLE", TRUE);
>>>
>>>       if (!env || !*env)
>>>          return NULL;
>>> @@ -1267,6 +1282,19 @@ hud_create(struct pipe_context *pipe, struct
>>> cso_context *cso)
>>>
>>>       LIST_INITHEAD(&hud->pane_list);
>>>
>>> +   /* setup sig handler once for all hud contexts */
>>> +   if (!sig_handled) {
>>> +      action.sa_sigaction = &signal_visible_handler;
>>> +      action.sa_flags = SA_SIGINFO;
>>> +
>>> +      if (signo < 1 || signo >= NSIG)
>>> +         fprintf(stderr, "gallium_hud: invalid signal %ld\n", signo);
>>> +      else if (sigaction(signo, &action, NULL) < 0)
>>> +         fprintf(stderr, "gallium_hud: unable to set handler for signal
>>> %ld\n", signo);
>>
>>
>> Can you put a fflush(stderr) call here?  Windows doesn't always immediately
>> flush stdout/stderr output to the terminal.
>
> Just directly after both of the conditions? See v6.

Sure.

-Brian




More information about the mesa-dev mailing list