[Mesa-dev] [PATCH 13/18] mesa: use accessors for struct gl_debug_state
Brian Paul
brianp at vmware.com
Fri Apr 25 07:30:37 PDT 2014
On 04/25/2014 04:42 AM, Chia-I Wu wrote:
> When GL_DEBUG_OUTPUT_SYNCHRONOUS is GL_TRUE, drivers are allowed to log debug
> messages from other threads. That requires gl_debug_state to be protected by
> a mutex, even when it is a context state. While we do not spawn threads in
> Mesa yet, this commit makes it easier to do when we want to.
>
> Since the definition of struct gl_debug_state is no longer needed by the rest
> of the driver, move it to main/errors.c. This should make it even harder to
> use the struct incorrectly.
>
> Signed-off-by: Chia-I Wu <olv at lunarg.com>
> ---
> src/mesa/drivers/dri/common/dri_util.c | 5 +-
> src/mesa/main/enable.c | 35 ++-------
> src/mesa/main/errors.c | 125 ++++++++++++++++++++++++++++++++-
> src/mesa/main/errors.h | 10 ++-
> src/mesa/main/get.c | 16 +----
> src/mesa/main/getstring.c | 17 +----
> src/mesa/main/mtypes.h | 40 +----------
> src/mesa/state_tracker/st_manager.c | 4 +-
> 8 files changed, 144 insertions(+), 108 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
> index aed73c7..c410474 100644
> --- a/src/mesa/drivers/dri/common/dri_util.c
> +++ b/src/mesa/drivers/dri/common/dri_util.c
> @@ -449,10 +449,7 @@ driContextSetFlags(struct gl_context *ctx, uint32_t flags)
> if ((flags & __DRI_CTX_FLAG_FORWARD_COMPATIBLE) != 0)
> ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT;
> if ((flags & __DRI_CTX_FLAG_DEBUG) != 0) {
> - struct gl_debug_state *debug = _mesa_get_debug_state(ctx);
> - if (debug) {
> - debug->DebugOutput = GL_TRUE;
> - }
> + _mesa_set_debug_state_int(ctx, GL_DEBUG_OUTPUT, GL_TRUE);
> ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
> }
> }
> diff --git a/src/mesa/main/enable.c b/src/mesa/main/enable.c
> index edd4751..0f3bcf0 100644
> --- a/src/mesa/main/enable.c
> +++ b/src/mesa/main/enable.c
> @@ -368,26 +368,11 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
> ctx->Depth.Test = state;
> break;
> case GL_DEBUG_OUTPUT:
> - if (!_mesa_is_desktop_gl(ctx)) {
> - goto invalid_enum_error;
> - }
> - else {
> - struct gl_debug_state *debug = _mesa_get_debug_state(ctx);
> - if (debug) {
> - debug->DebugOutput = state;
> - }
> - }
> - break;
> case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
> - if (!_mesa_is_desktop_gl(ctx)) {
> + if (!_mesa_is_desktop_gl(ctx))
> goto invalid_enum_error;
> - }
> - else {
> - struct gl_debug_state *debug = _mesa_get_debug_state(ctx);
> - if (debug) {
> - debug->SyncOutput = state;
> - }
> - }
> + else
> + _mesa_set_debug_state_int(ctx, cap, state);
> break;
> case GL_DITHER:
> if (ctx->Color.DitherFlag == state)
> @@ -1239,21 +1224,11 @@ _mesa_IsEnabled( GLenum cap )
> case GL_CULL_FACE:
> return ctx->Polygon.CullFlag;
> case GL_DEBUG_OUTPUT:
> - if (!_mesa_is_desktop_gl(ctx))
> - goto invalid_enum_error;
> - if (ctx->Debug) {
> - return ctx->Debug->DebugOutput;
> - } else {
> - return GL_FALSE;
> - }
> case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
> if (!_mesa_is_desktop_gl(ctx))
> goto invalid_enum_error;
> - if (ctx->Debug) {
> - return ctx->Debug->SyncOutput;
> - } else {
> - return GL_FALSE;
> - }
> + else
> + return (GLboolean) _mesa_get_debug_state_int(ctx, cap);
> case GL_DEPTH_TEST:
> return ctx->Depth.Test;
> case GL_DITHER:
> diff --git a/src/mesa/main/errors.c b/src/mesa/main/errors.c
> index 277f38c..9258eb6 100644
> --- a/src/mesa/main/errors.c
> +++ b/src/mesa/main/errors.c
> @@ -47,6 +47,45 @@ struct gl_debug_severity
> GLuint ID;
> };
>
> +/**
> + * An error, warning, or other piece of debug information for an application
> + * to consume via GL_ARB_debug_output/GL_KHR_debug.
> + */
> +struct gl_debug_msg
> +{
> + enum mesa_debug_source source;
> + enum mesa_debug_type type;
> + GLuint id;
> + enum mesa_debug_severity severity;
> + GLsizei length;
> + GLcharARB *message;
> +};
> +
> +struct gl_debug_namespace
> +{
> + struct _mesa_HashTable *IDs;
> + unsigned ZeroID; /* a HashTable won't take zero, so store its state here */
> + /** lists of IDs in the hash table at each severity */
> + struct simple_node Severity[MESA_DEBUG_SEVERITY_COUNT];
> +};
> +
> +struct gl_debug_state
> +{
> + GLDEBUGPROC Callback;
> + const void *CallbackData;
> + GLboolean SyncOutput;
> + GLboolean DebugOutput;
> + GLboolean Defaults[MAX_DEBUG_GROUP_STACK_DEPTH][MESA_DEBUG_SEVERITY_COUNT][MESA_DEBUG_SOURCE_COUNT][MESA_DEBUG_TYPE_COUNT];
> + struct gl_debug_namespace Namespaces[MAX_DEBUG_GROUP_STACK_DEPTH][MESA_DEBUG_SOURCE_COUNT][MESA_DEBUG_TYPE_COUNT];
> + struct gl_debug_msg Log[MAX_DEBUG_LOGGED_MESSAGES];
> + struct gl_debug_msg DebugGroupMsgs[MAX_DEBUG_GROUP_STACK_DEPTH];
> + GLint GroupStackDepth;
> + GLint NumMessages;
> + GLint NextMsg;
> + GLint NextMsgLength; /* redundant, but copied here from Log[NextMsg].length
> + for the sake of the offsetof() code in get.c */
> +};
> +
> static char out_of_memory[] = "Debugging error: out of memory";
>
> static const GLenum debug_source_enums[] = {
> @@ -597,7 +636,7 @@ debug_pop_group(struct gl_debug_state *debug)
> * Return debug state for the context. The debug state will be allocated
> * and initialized upon the first call.
> */
> -struct gl_debug_state *
> +static struct gl_debug_state *
> _mesa_get_debug_state(struct gl_context *ctx)
> {
> if (!ctx->Debug) {
> @@ -610,6 +649,90 @@ _mesa_get_debug_state(struct gl_context *ctx)
> return ctx->Debug;
> }
>
I think it would be good to have comments on the following three new
functions to explain their purpose and parameters.
> +bool
> +_mesa_set_debug_state_int(struct gl_context *ctx, GLenum pname, GLint val)
> +{
> + struct gl_debug_state *debug = _mesa_get_debug_state(ctx);
> +
> + if (!debug)
> + return false;
> +
> + switch (pname) {
> + case GL_DEBUG_OUTPUT:
> + debug->DebugOutput = (val != 0);
> + break;
> + case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
> + debug->SyncOutput = (val != 0);
> + break;
> + default:
> + assert(!"unknown debug output param");
> + break;
> + }
> +
> + return true;
> +}
> +
> +GLint
> +_mesa_get_debug_state_int(struct gl_context *ctx, GLenum pname)
> +{
> + struct gl_debug_state *debug;
> + GLint val;
> +
> + debug = ctx->Debug;
> + if (!debug)
> + return 0;
> +
> + switch (pname) {
> + case GL_DEBUG_OUTPUT:
> + val = debug->DebugOutput;
> + break;
> + case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
> + val = debug->SyncOutput;
> + break;
> + case GL_DEBUG_LOGGED_MESSAGES:
> + val = debug->NumMessages;
> + break;
> + case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
> + val = debug->NextMsgLength;
> + break;
> + case GL_DEBUG_GROUP_STACK_DEPTH:
> + val = debug->GroupStackDepth;
> + break;
> + default:
> + assert(!"unknown debug output param");
> + val = 0;
> + break;
> + }
> +
> + return val;
> +}
> +
> +void *
> +_mesa_get_debug_state_ptr(struct gl_context *ctx, GLenum pname)
> +{
> + struct gl_debug_state *debug;
> + void *val;
> +
> + debug = ctx->Debug;
> + if (!debug)
> + return NULL;
> +
> + switch (pname) {
> + case GL_DEBUG_CALLBACK_FUNCTION_ARB:
> + val = (void *) debug->Callback;
> + break;
> + case GL_DEBUG_CALLBACK_USER_PARAM_ARB:
> + val = (void *) debug->CallbackData;
> + break;
> + default:
> + assert(!"unknown debug output param");
> + val = NULL;
> + break;
> + }
> +
> + return val;
> +}
> +
>
> /**
> * Log a client or driver debug message.
More information about the mesa-dev
mailing list