On Mon, Jan 4, 2016 at 5:34 PM, Nicolai Hähnle <nhaeh...@gmail.com> wrote: > From: Nicolai Hähnle <nicolai.haeh...@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@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev