From f5badf467155599755258e2370845622d2e8c496 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Mon, 26 Aug 2013 16:49:37 +1000 Subject: [PATCH] mesa: Share common code between ARB_debug_output and KHR_debug functions Signed-off-by: Timothy Arceri Reviewed-by: Brian Paul --- src/mesa/main/errors.c | 308 ++++++++++++++++++++++++++++------------- src/mesa/main/errors.h | 15 ++ 2 files changed, 226 insertions(+), 97 deletions(-) diff --git a/src/mesa/main/errors.c b/src/mesa/main/errors.c index eea72910b3b..8e97b524614 100644 --- a/src/mesa/main/errors.c +++ b/src/mesa/main/errors.c @@ -392,13 +392,19 @@ _mesa_get_msg(struct gl_context *ctx, GLenum *source, GLenum *type, * glDebugMessageInsertARB only accepts two values for 'source', * and glDebugMessageControlARB will additionally accept GL_DONT_CARE * in any parameter, so handle those cases specially. + * + * There is also special cases for handling values available in + * GL_KHR_debug that are not avaliable in GL_ARB_debug_output */ static GLboolean validate_params(struct gl_context *ctx, unsigned caller, - GLenum source, GLenum type, GLenum severity) + const char *callerstr, GLenum source, GLenum type, + GLenum severity) { #define INSERT 1 #define CONTROL 2 +#define INSERT_ARB 3 +#define CONTROL_ARB 4 switch(source) { case GL_DEBUG_SOURCE_APPLICATION_ARB: case GL_DEBUG_SOURCE_THIRD_PARTY_ARB: @@ -407,10 +413,10 @@ validate_params(struct gl_context *ctx, unsigned caller, case GL_DEBUG_SOURCE_SHADER_COMPILER_ARB: case GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB: case GL_DEBUG_SOURCE_OTHER_ARB: - if (caller != INSERT) + if (caller != INSERT || caller == INSERT_ARB) break; case GL_DONT_CARE: - if (caller == CONTROL) + if (caller == CONTROL || caller == CONTROL_ARB) break; default: goto error; @@ -424,8 +430,12 @@ validate_params(struct gl_context *ctx, unsigned caller, case GL_DEBUG_TYPE_PORTABILITY_ARB: case GL_DEBUG_TYPE_OTHER_ARB: break; + case GL_DEBUG_TYPE_MARKER: + /* this value is only valid for GL_KHR_debug functions */ + if (caller == CONTROL || caller == INSERT) + break; case GL_DONT_CARE: - if (caller == CONTROL) + if (caller == CONTROL || caller == CONTROL_ARB) break; default: goto error; @@ -436,8 +446,12 @@ validate_params(struct gl_context *ctx, unsigned caller, case GL_DEBUG_SEVERITY_MEDIUM_ARB: case GL_DEBUG_SEVERITY_LOW_ARB: break; + case GL_DEBUG_SEVERITY_NOTIFICATION: + /* this value is only valid for GL_KHR_debug functions */ + if (caller == CONTROL || caller == INSERT) + break; case GL_DONT_CARE: - if (caller == CONTROL) + if (caller == CONTROL || caller == CONTROL_ARB) break; default: goto error; @@ -446,93 +460,13 @@ validate_params(struct gl_context *ctx, unsigned caller, error: { - const char *callerstr; - if (caller == INSERT) - callerstr = "glDebugMessageInsertARB"; - else if (caller == CONTROL) - callerstr = "glDebugMessageControlARB"; - else - return GL_FALSE; - - _mesa_error( ctx, GL_INVALID_ENUM, "bad values passed to %s" + _mesa_error(ctx, GL_INVALID_ENUM, "bad values passed to %s" "(source=0x%x, type=0x%x, severity=0x%x)", callerstr, source, type, severity); } return GL_FALSE; } -void GLAPIENTRY -_mesa_DebugMessageInsertARB(GLenum source, GLenum type, GLuint id, - GLenum severity, GLint length, - const GLcharARB* buf) -{ - GET_CURRENT_CONTEXT(ctx); - - if (!validate_params(ctx, INSERT, source, type, severity)) - return; /* GL_INVALID_ENUM */ - - if (length < 0) - length = strlen(buf); - - if (length >= MAX_DEBUG_MESSAGE_LENGTH) { - _mesa_error(ctx, GL_INVALID_VALUE, "glDebugMessageInsertARB" - "(length=%d, which is not less than " - "GL_MAX_DEBUG_MESSAGE_LENGTH_ARB=%d)", length, - MAX_DEBUG_MESSAGE_LENGTH); - return; - } - - _mesa_log_msg(ctx, - gl_enum_to_debug_source(source), - gl_enum_to_debug_type(type), id, - gl_enum_to_debug_severity(severity), length, buf); -} - -GLuint GLAPIENTRY -_mesa_GetDebugMessageLogARB(GLuint count, GLsizei logSize, GLenum* sources, - GLenum* types, GLenum* ids, GLenum* severities, - GLsizei* lengths, GLcharARB* messageLog) -{ - GET_CURRENT_CONTEXT(ctx); - GLuint ret; - - if (!messageLog) - logSize = 0; - - if (logSize < 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "glGetDebugMessageLogARB" - "(logSize=%d : logSize must not be negative)", logSize); - return 0; - } - - for (ret = 0; ret < count; ret++) { - GLsizei written = _mesa_get_msg(ctx, sources, types, ids, severities, - logSize, messageLog); - if (!written) - break; - - if (messageLog) { - messageLog += written; - logSize -= written; - } - if (lengths) { - *lengths = written; - lengths++; - } - - if (severities) - severities++; - if (sources) - sources++; - if (types) - types++; - if (ids) - ids++; - } - - return ret; -} - /** * Set the state of all message IDs found in the given intersection of * 'source', 'type', and 'severity'. The _COUNT enum can be used for @@ -622,28 +556,36 @@ control_app_messages(struct gl_context *ctx, GLenum esource, GLenum etype, control_messages(ctx, source, type, severity, enabled); } -void GLAPIENTRY -_mesa_DebugMessageControlARB(GLenum gl_source, GLenum gl_type, - GLenum gl_severity, - GLsizei count, const GLuint *ids, - GLboolean enabled) +/** + * This is a generic message control function for use by both + * glDebugMessageControlARB and glDebugMessageControl. + */ +static void +message_control(GLenum gl_source, GLenum gl_type, + GLenum gl_severity, + GLsizei count, const GLuint *ids, + GLboolean enabled, + unsigned caller, const char *callerstr) { GET_CURRENT_CONTEXT(ctx); if (count < 0) { - _mesa_error(ctx, GL_INVALID_VALUE, "glDebugMessageControlARB" - "(count=%d : count must not be negative)", count); + _mesa_error(ctx, GL_INVALID_VALUE, + "%s(count=%d : count must not be negative)", callerstr, + count); return; } - if (!validate_params(ctx, CONTROL, gl_source, gl_type, gl_severity)) + if (!validate_params(ctx, caller, callerstr, gl_source, gl_type, + gl_severity)) return; /* GL_INVALID_ENUM */ if (count && (gl_severity != GL_DONT_CARE || gl_type == GL_DONT_CARE || gl_source == GL_DONT_CARE)) { - _mesa_error(ctx, GL_INVALID_OPERATION, "glDebugMessageControlARB" - "(When passing an array of ids, severity must be" - " GL_DONT_CARE, and source and type must not be GL_DONT_CARE."); + _mesa_error(ctx, GL_INVALID_OPERATION, + "%s(When passing an array of ids, severity must be" + " GL_DONT_CARE, and source and type must not be GL_DONT_CARE.", + callerstr); return; } @@ -651,6 +593,178 @@ _mesa_DebugMessageControlARB(GLenum gl_source, GLenum gl_type, count, ids, enabled); } +/** + * This is a generic message insert function for use by both + * glDebugMessageInsertARB and glDebugMessageInsert. + */ +static void +message_insert(GLenum source, GLenum type, GLuint id, + GLenum severity, GLint length, const GLchar* buf, + unsigned caller, const char *callerstr) +{ + GET_CURRENT_CONTEXT(ctx); + + if (!validate_params(ctx, caller, callerstr, source, type, severity)) + return; /* GL_INVALID_ENUM */ + + if (length < 0) + length = strlen(buf); + + if (length >= MAX_DEBUG_MESSAGE_LENGTH) { + _mesa_error(ctx, GL_INVALID_VALUE, + "%s(length=%d, which is not less than " + "GL_MAX_DEBUG_MESSAGE_LENGTH=%d)", callerstr, length, + MAX_DEBUG_MESSAGE_LENGTH); + return; + } + + _mesa_log_msg(ctx, + gl_enum_to_debug_source(source), + gl_enum_to_debug_type(type), id, + gl_enum_to_debug_severity(severity), length, buf); +} + +/** + * This is a generic message insert function for use by both + * glGetDebugMessageLogARB and glGetDebugMessageLog. + */ +static GLuint +get_message_log(GLuint count, GLsizei logSize, GLenum* sources, + GLenum* types, GLenum* ids, GLenum* severities, + GLsizei* lengths, GLchar* messageLog, + unsigned caller, const char *callerstr) +{ +#define MESSAGE_LOG 1 +#define MESSAGE_LOG_ARB 2 + GET_CURRENT_CONTEXT(ctx); + GLuint ret; + + if (!messageLog) + logSize = 0; + + if (logSize < 0) { + _mesa_error(ctx, GL_INVALID_VALUE, + "%s(logSize=%d : logSize must not be negative)", callerstr, + logSize); + return 0; + } + + for (ret = 0; ret < count; ret++) { + GLsizei written = _mesa_get_msg(ctx, sources, types, ids, severities, + logSize, messageLog); + if (!written) + break; + + if (messageLog) { + messageLog += written; + logSize -= written; + } + if (lengths) { + *lengths = written; + lengths++; + } + + if (severities) + severities++; + if (sources) + sources++; + if (types) + types++; + if (ids) + ids++; + } + + return ret; +} + +void GLAPIENTRY +_mesa_DebugMessageInsert(GLenum source, GLenum type, GLuint id, + GLenum severity, GLint length, + const GLchar* buf) +{ + const char *callerstr = "glDebugMessageInsert"; + + message_insert(source, type, id, severity, length, buf, + INSERT, callerstr); +} + +GLuint GLAPIENTRY +_mesa_GetDebugMessageLog(GLuint count, GLsizei logSize, GLenum* sources, + GLenum* types, GLenum* ids, GLenum* severities, + GLsizei* lengths, GLchar* messageLog) +{ + const char *callerstr = "glGetDebugMessageLog"; + + return get_message_log(count, logSize, sources, types, ids, severities, + lengths, messageLog, MESSAGE_LOG, callerstr); +} + +void GLAPIENTRY +_mesa_DebugMessageControl(GLenum source, GLenum type, GLenum severity, + GLsizei count, const GLuint *ids, + GLboolean enabled) +{ + const char *callerstr = "glDebugMessageControl"; + + message_control(source, type, severity, count, ids, + enabled, CONTROL, callerstr); +} + +void GLAPIENTRY +_mesa_DebugMessageCallback(GLDEBUGPROC callback, const void *userParam) +{ + GET_CURRENT_CONTEXT(ctx); + ctx->Debug.Callback = callback; + ctx->Debug.CallbackData = userParam; +} + +void GLAPIENTRY +_mesa_PushDebugGroup(GLenum source, GLuint id, GLsizei length, + const GLchar *message) +{ + +} + +void GLAPIENTRY +_mesa_PopDebugGroup() +{ + +} + +void GLAPIENTRY +_mesa_DebugMessageInsertARB(GLenum source, GLenum type, GLuint id, + GLenum severity, GLint length, + const GLcharARB* buf) +{ + const char *callerstr = "glDebugMessageInsertARB"; + + message_insert(source, type, id, severity, length, buf, + INSERT_ARB, callerstr); +} + +GLuint GLAPIENTRY +_mesa_GetDebugMessageLogARB(GLuint count, GLsizei logSize, GLenum* sources, + GLenum* types, GLenum* ids, GLenum* severities, + GLsizei* lengths, GLcharARB* messageLog) +{ + const char *callerstr = "glGetDebugMessageLogARB"; + + return get_message_log(count, logSize, sources, types, ids, severities, + lengths, messageLog, MESSAGE_LOG_ARB, callerstr); +} + +void GLAPIENTRY +_mesa_DebugMessageControlARB(GLenum gl_source, GLenum gl_type, + GLenum gl_severity, + GLsizei count, const GLuint *ids, + GLboolean enabled) +{ + const char *callerstr = "glDebugMessageControlARB"; + + message_control(gl_source, gl_type, gl_severity, count, ids, + enabled, CONTROL_ARB, callerstr); +} + void GLAPIENTRY _mesa_DebugMessageCallbackARB(GLDEBUGPROCARB callback, const void *userParam) { diff --git a/src/mesa/main/errors.h b/src/mesa/main/errors.h index 5b4f36f5567..ff6f5c69c08 100644 --- a/src/mesa/main/errors.h +++ b/src/mesa/main/errors.h @@ -102,6 +102,21 @@ _mesa_DebugMessageControlARB(GLenum source, GLenum type, GLenum severity, void GLAPIENTRY _mesa_DebugMessageCallbackARB(GLDEBUGPROCARB callback, const void *userParam); +void GLAPIENTRY +_mesa_DebugMessageInsert(GLenum source, GLenum type, GLuint id, + GLenum severity, GLint length, + const GLchar* buf); +GLuint GLAPIENTRY +_mesa_GetDebugMessageLog(GLuint count, GLsizei logSize, GLenum* sources, + GLenum* types, GLenum* ids, GLenum* severities, + GLsizei* lengths, GLchar* messageLog); +void GLAPIENTRY +_mesa_DebugMessageControl(GLenum source, GLenum type, GLenum severity, + GLsizei count, const GLuint *ids, + GLboolean enabled); +void GLAPIENTRY +_mesa_DebugMessageCallback(GLDEBUGPROC callback, + const void *userParam); #ifdef __cplusplus } -- 2.30.2