st/mesa: make KHR_debug output independent of context creation flags (v2)
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. v2: - re-add the proper initialization of debug contexts (Ilia Mirkin) - silence a potential warning (Ilia Mirkin) Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
@@ -79,6 +79,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()
|
||||
*/
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -104,3 +104,75 @@ 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;
|
||||
default:
|
||||
unreachable("invalid debug type");
|
||||
}
|
||||
_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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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, ... )
|
||||
{
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include "st_texture.h"
|
||||
|
||||
#include "st_context.h"
|
||||
#include "st_debug.h"
|
||||
#include "st_extensions.h"
|
||||
#include "st_format.h"
|
||||
#include "st_cb_fbo.h"
|
||||
@@ -623,58 +624,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,17 +672,15 @@ st_api_create_context(struct st_api *stapi, struct st_manager *smapi,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (attribs->flags & ST_CONTEXT_FLAG_DEBUG){
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
st_enable_debug_output(st, TRUE);
|
||||
}
|
||||
|
||||
if (attribs->flags & ST_CONTEXT_FLAG_FORWARD_COMPATIBLE)
|
||||
|
||||
Reference in New Issue
Block a user