[Mesa-dev] [PATCH] st/mesa: make KHR_debug output independent of context creation flags

Ilia Mirkin imirkin at alum.mit.edu
Mon Jan 4 14:40:36 PST 2016


On Mon, Jan 4, 2016 at 5:34 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Instead, keep track of GL_DEBUG_OUTPUT and (un)install the pipe_debug_callback
> accordingly. Hardware drivers can still use the absence of the callback to
> skip more expensive operations in the normal case, and users can no longer be
> surprised by the need to set the debug flag at context creation time.
> ---
>  src/mesa/state_tracker/st_context.c | 18 ++++++++++
>  src/mesa/state_tracker/st_debug.c   | 70 +++++++++++++++++++++++++++++++++++++
>  src/mesa/state_tracker/st_debug.h   |  4 +++
>  src/mesa/state_tracker/st_manager.c | 64 +--------------------------------
>  4 files changed, 93 insertions(+), 63 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index 724c3c5..31cc99d 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -80,6 +80,23 @@ DEBUG_GET_ONCE_BOOL_OPTION(mesa_mvp_dp4, "MESA_MVP_DP4", FALSE)
>
>
>  /**
> + * Called via ctx->Driver.Enable()
> + */
> +static void st_Enable(struct gl_context * ctx, GLenum cap, GLboolean state)
> +{
> +   struct st_context *st = st_context(ctx);
> +
> +   switch (cap) {
> +   case GL_DEBUG_OUTPUT:
> +      st_enable_debug_output(st, state);
> +      break;
> +   default:
> +      break;
> +   }
> +}
> +
> +
> +/**
>   * Called via ctx->Driver.UpdateState()
>   */
>  void st_invalidate_state(struct gl_context * ctx, GLuint new_state)
> @@ -457,5 +474,6 @@ void st_init_driver_functions(struct pipe_screen *screen,
>
>     st_init_vdpau_functions(functions);
>
> +   functions->Enable = st_Enable;
>     functions->UpdateState = st_invalidate_state;
>  }
> diff --git a/src/mesa/state_tracker/st_debug.c b/src/mesa/state_tracker/st_debug.c
> index 6d859c6..ac77558 100644
> --- a/src/mesa/state_tracker/st_debug.c
> +++ b/src/mesa/state_tracker/st_debug.c
> @@ -104,3 +104,73 @@ st_print_current(void)
>  }
>
>
> +/**
> + * Installed as pipe_debug_callback when GL_DEBUG_OUTPUT is enabled.
> + */
> +static void
> +st_debug_message(void *data,
> +                 unsigned *id,
> +                 enum pipe_debug_type ptype,
> +                 const char *fmt,
> +                 va_list args)
> +{
> +   struct st_context *st = data;
> +   enum mesa_debug_source source;
> +   enum mesa_debug_type type;
> +   enum mesa_debug_severity severity;
> +
> +   switch (ptype) {
> +   case PIPE_DEBUG_TYPE_OUT_OF_MEMORY:
> +      source = MESA_DEBUG_SOURCE_API;
> +      type = MESA_DEBUG_TYPE_ERROR;
> +      severity = MESA_DEBUG_SEVERITY_MEDIUM;
> +      break;
> +   case PIPE_DEBUG_TYPE_ERROR:
> +      source = MESA_DEBUG_SOURCE_API;
> +      type = MESA_DEBUG_TYPE_ERROR;
> +      severity = MESA_DEBUG_SEVERITY_MEDIUM;
> +      break;
> +   case PIPE_DEBUG_TYPE_SHADER_INFO:
> +      source = MESA_DEBUG_SOURCE_SHADER_COMPILER;
> +      type = MESA_DEBUG_TYPE_OTHER;
> +      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> +      break;
> +   case PIPE_DEBUG_TYPE_PERF_INFO:
> +      source = MESA_DEBUG_SOURCE_API;
> +      type = MESA_DEBUG_TYPE_PERFORMANCE;
> +      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> +      break;
> +   case PIPE_DEBUG_TYPE_INFO:
> +      source = MESA_DEBUG_SOURCE_API;
> +      type = MESA_DEBUG_TYPE_OTHER;
> +      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> +      break;
> +   case PIPE_DEBUG_TYPE_FALLBACK:
> +      source = MESA_DEBUG_SOURCE_API;
> +      type = MESA_DEBUG_TYPE_PERFORMANCE;
> +      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> +      break;
> +   case PIPE_DEBUG_TYPE_CONFORMANCE:
> +      source = MESA_DEBUG_SOURCE_API;
> +      type = MESA_DEBUG_TYPE_OTHER;
> +      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> +      break;

Perhaps add a

default:
  unreachable("invalid debug type");

to avoid the stupid compiler warning?

> +   }
> +   _mesa_gl_vdebug(st->ctx, id, source, type, severity, fmt, args);
> +}
> +
> +void
> +st_enable_debug_output(struct st_context *st, boolean enable)
> +{
> +   struct pipe_context *pipe = st->pipe;
> +
> +   if (!pipe->set_debug_callback)
> +      return;
> +
> +   if (enable) {
> +      struct pipe_debug_callback cb = { st_debug_message, st };
> +      pipe->set_debug_callback(pipe, &cb);
> +   } else {
> +      pipe->set_debug_callback(pipe, NULL);
> +   }
> +}
> diff --git a/src/mesa/state_tracker/st_debug.h b/src/mesa/state_tracker/st_debug.h
> index 288eccf..ed3ead8 100644
> --- a/src/mesa/state_tracker/st_debug.h
> +++ b/src/mesa/state_tracker/st_debug.h
> @@ -32,6 +32,8 @@
>  #include "pipe/p_compiler.h"
>  #include "util/u_debug.h"
>
> +struct st_context;
> +
>  extern void
>  st_print_current(void);
>
> @@ -59,6 +61,8 @@ extern int ST_DEBUG;
>
>  void st_debug_init( void );
>
> +void st_enable_debug_output(struct st_context *st, boolean enable);
> +
>  static inline void
>  ST_DBG( unsigned flag, const char *fmt, ... )
>  {
> diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
> index d0d261f..525aff7 100644
> --- a/src/mesa/state_tracker/st_manager.c
> +++ b/src/mesa/state_tracker/st_manager.c
> @@ -623,58 +623,6 @@ st_context_destroy(struct st_context_iface *stctxi)
>     st_destroy_context(st);
>  }
>
> -static void
> -st_debug_message(void *data,
> -                 unsigned *id,
> -                 enum pipe_debug_type ptype,
> -                 const char *fmt,
> -                 va_list args)
> -{
> -   struct st_context *st = data;
> -   enum mesa_debug_source source;
> -   enum mesa_debug_type type;
> -   enum mesa_debug_severity severity;
> -
> -   switch (ptype) {
> -   case PIPE_DEBUG_TYPE_OUT_OF_MEMORY:
> -      source = MESA_DEBUG_SOURCE_API;
> -      type = MESA_DEBUG_TYPE_ERROR;
> -      severity = MESA_DEBUG_SEVERITY_MEDIUM;
> -      break;
> -   case PIPE_DEBUG_TYPE_ERROR:
> -      source = MESA_DEBUG_SOURCE_API;
> -      type = MESA_DEBUG_TYPE_ERROR;
> -      severity = MESA_DEBUG_SEVERITY_MEDIUM;
> -      break;
> -   case PIPE_DEBUG_TYPE_SHADER_INFO:
> -      source = MESA_DEBUG_SOURCE_SHADER_COMPILER;
> -      type = MESA_DEBUG_TYPE_OTHER;
> -      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> -      break;
> -   case PIPE_DEBUG_TYPE_PERF_INFO:
> -      source = MESA_DEBUG_SOURCE_API;
> -      type = MESA_DEBUG_TYPE_PERFORMANCE;
> -      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> -      break;
> -   case PIPE_DEBUG_TYPE_INFO:
> -      source = MESA_DEBUG_SOURCE_API;
> -      type = MESA_DEBUG_TYPE_OTHER;
> -      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> -      break;
> -   case PIPE_DEBUG_TYPE_FALLBACK:
> -      source = MESA_DEBUG_SOURCE_API;
> -      type = MESA_DEBUG_TYPE_PERFORMANCE;
> -      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> -      break;
> -   case PIPE_DEBUG_TYPE_CONFORMANCE:
> -      source = MESA_DEBUG_SOURCE_API;
> -      type = MESA_DEBUG_TYPE_OTHER;
> -      severity = MESA_DEBUG_SEVERITY_NOTIFICATION;
> -      break;
> -   }
> -   _mesa_gl_vdebug(st->ctx, id, source, type, severity, fmt, args);
> -}
> -
>  static struct st_context_iface *
>  st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
>                        const struct st_context_attribs *attribs,
> @@ -723,19 +671,9 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
>        return NULL;
>     }
>
> -   if (attribs->flags & ST_CONTEXT_FLAG_DEBUG){
> -      if (!_mesa_set_debug_state_int(st->ctx, GL_DEBUG_OUTPUT, GL_TRUE)) {
> -         *error = ST_CONTEXT_ERROR_NO_MEMORY;
> -         return NULL;
> -      }
> +   if (attribs->flags & ST_CONTEXT_FLAG_DEBUG)
>        st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
>
> -      if (pipe->set_debug_callback) {
> -         struct pipe_debug_callback cb = { st_debug_message, st };
> -         pipe->set_debug_callback(pipe, &cb);
> -      }
> -   }

driContextSetFlags initializes all the GL_DEBUG_OUTPUT stuff to true
for a debug context, I think you should do that too (as was previously
done, but you removed it?).

> -
>     if (attribs->flags & ST_CONTEXT_FLAG_FORWARD_COMPATIBLE)
>        st->ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT;
>     if (attribs->flags & ST_CONTEXT_FLAG_ROBUST_ACCESS)
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list