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.

-Brian

+
+      sig_handled = TRUE;
+   }
+
     hud_parse_env_var(hud, env);
     return hud;
  }


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to