mesa: add infrastructure for GL_ARB_debug_output
authornobled <nobled@dreamwidth.org>
Sun, 1 May 2011 15:46:45 +0000 (15:46 +0000)
committerMarek Olšák <maraeo@gmail.com>
Sat, 10 Mar 2012 20:42:05 +0000 (21:42 +0100)
Marek v2: don't add the extension to extensions.c yet

src/mesa/main/config.h
src/mesa/main/context.c
src/mesa/main/enable.c
src/mesa/main/errors.c
src/mesa/main/errors.h
src/mesa/main/get.c
src/mesa/main/getstring.c
src/mesa/main/mtypes.h

index 8bf741f99ac4860e21035142f85ad0c89d08815d..1d5a0622dda1d5fd66584132860c68a7adb6d89c 100644 (file)
 #define MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS         1024
 /*@}*/
 
+/** For GL_ARB_debug_output */
+/*@{*/
+#define MAX_DEBUG_LOGGED_MESSAGES   10
+#define MAX_DEBUG_MESSAGE_LENGTH    4096
+/*@}*/
+
 
 /*
  * Color channel component order
index 8d48904f82fd8c67e9c7a344b2b2b514928cd8c8..6332e07b126601018d3ecce3e17c78f72412601d 100644 (file)
@@ -759,6 +759,7 @@ init_attrib_groups(struct gl_context *ctx)
    _mesa_init_depth( ctx );
    _mesa_init_debug( ctx );
    _mesa_init_display_list( ctx );
+   _mesa_init_errors( ctx );
    _mesa_init_eval( ctx );
    _mesa_init_fbobjects( ctx );
    _mesa_init_feedback( ctx );
index 515dda952434ccaa5e528a40b83287add4473e75..2f0216b018488ae251f2a7546d0b9201c4891b20 100644 (file)
@@ -348,6 +348,9 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
          FLUSH_VERTICES(ctx, _NEW_DEPTH);
          ctx->Depth.Test = state;
          break;
+      case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
+         ctx->Debug.SyncOutput = state;
+         break;
       case GL_DITHER:
          if (ctx->Color.DitherFlag == state)
             return;
@@ -1114,6 +1117,8 @@ _mesa_IsEnabled( GLenum cap )
         return ctx->Light.ColorMaterialEnabled;
       case GL_CULL_FACE:
          return ctx->Polygon.CullFlag;
+      case GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB:
+         return ctx->Debug.SyncOutput;
       case GL_DEPTH_TEST:
          return ctx->Depth.Test;
       case GL_DITHER:
index a571cdfe809c6eccc2716a83e6d7bb9f38ee86d3..906aafcc9e7d5aee117e7aeb82980ac2b6c13c79 100644 (file)
 #include "version.h"
 
 
-#define MAXSTRING 4000  /* for _mesa_vsnprintf() */
+#define MAXSTRING MAX_DEBUG_MESSAGE_LENGTH
+
+void
+_mesa_init_errors(struct gl_context *ctx)
+{
+   ctx->Debug.Callback = NULL;
+   ctx->Debug.SyncOutput = GL_FALSE;
+   ctx->Debug.Log[0].length = 0;
+   ctx->Debug.NumMessages = 0;
+   ctx->Debug.NextMsg = 0;
+   ctx->Debug.NextMsgLength = 0;
+}
 
 /**********************************************************************/
 /** \name Diagnostics */
index 78dd57ae2dc322b4155f4e2f616e8f8b9eb97aa2..e467f5d44f2f7db2a528ef4fc933e919440135f5 100644 (file)
@@ -46,6 +46,9 @@ extern "C" {
 
 struct gl_context;
 
+extern void
+_mesa_init_errors( struct gl_context *ctx );
+
 extern void
 _mesa_warning( struct gl_context *gc, const char *fmtString, ... ) PRINTFLIKE(2, 3);
 
index 5ad601242f476e6a5ff014c8b7d9c33d4b9f350e..9a5ca53345b0dd3bb330453307d567a2eb238195 100644 (file)
@@ -1297,6 +1297,13 @@ static const struct value_desc values[] = {
 
    /* GL_ARB_robustness */
    { GL_RESET_NOTIFICATION_STRATEGY_ARB, CONTEXT_ENUM(Const.ResetStrategy), NO_EXTRA },
+
+   /* GL_ARB_debug_output */
+   { GL_DEBUG_LOGGED_MESSAGES_ARB, CONTEXT_INT(Debug.NumMessages), NO_EXTRA },
+   { GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB, CONTEXT_INT(Debug.NextMsgLength), NO_EXTRA },
+   { GL_MAX_DEBUG_LOGGED_MESSAGES_ARB, CONST(MAX_DEBUG_LOGGED_MESSAGES), NO_EXTRA },
+   { GL_MAX_DEBUG_MESSAGE_LENGTH_ARB, CONST(MAX_DEBUG_MESSAGE_LENGTH), NO_EXTRA },
+
 #endif /* FEATURE_GL */
 };
 
index dbf6c3f5e421432197d83baa8cf33144603a4e73..90e0280552eb91a2cb9ddc3b48500fd8152e31bc 100644 (file)
@@ -224,6 +224,12 @@ _mesa_GetPointerv( GLenum pname, GLvoid **params )
          *params = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Ptr;
          break;
 #endif
+      case GL_DEBUG_CALLBACK_FUNCTION_ARB:
+         *params = (GLvoid *) ctx->Debug.Callback;
+         break;
+      case GL_DEBUG_CALLBACK_USER_PARAM_ARB:
+         *params = ctx->Debug.CallbackData;
+         break;
       default:
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetPointerv" );
          return;
index 480b1cf28e2fc29888b6fcc66d77c95f3e9169ba..03ec30356e9b5d4ab906e2fab85433a3ab63138c 100644 (file)
@@ -3186,6 +3186,32 @@ struct gl_dlist_state
    } Current;
 };
 
+/**
+ * An error, warning, or other piece of debug information for an application
+ * to consume via GL_ARB_debug_output.
+ */
+struct gl_debug_msg
+{
+   GLenum source;
+   GLenum type;
+   GLuint id;
+   GLenum severity;
+   GLsizei length;
+   GLcharARB *message;
+};
+
+/* GL_ARB_debug_output */
+struct gl_debug_state
+{
+   GLDEBUGPROCARB Callback;
+   GLvoid *CallbackData;
+   GLboolean SyncOutput;
+   struct gl_debug_msg Log[MAX_DEBUG_LOGGED_MESSAGES];
+   GLint NumMessages;
+   GLint NextMsg;
+   GLint NextMsgLength; /* redundant, but copied here from Log[NextMsg].length
+                           for the sake of the offsetof() code in get.c */
+};
 
 /**
  * Enum for the OpenGL APIs we know about and may support.
@@ -3351,6 +3377,9 @@ struct gl_context
    const char *ErrorDebugFmtString;
    GLuint ErrorDebugCount;
 
+   /* GL_ARB_debug_output */
+   struct gl_debug_state Debug;
+
    GLenum RenderMode;        /**< either GL_RENDER, GL_SELECT, GL_FEEDBACK */
    GLbitfield NewState;      /**< bitwise-or of _NEW_* flags */