summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2018-03-25 15:28:40 +0200
committerTimm Bäder <mail@baedert.org>2018-03-25 21:04:36 +0200
commit98a9f2b3c10c33245396c2c03ef77292846d9cd6 (patch)
treebdc401643207704711d93f489a90c1589907be7d
parent433517fdc914eedf1cee2c955180a5b8953d3f6e (diff)
downloadgtk+-98a9f2b3c10c33245396c2c03ef77292846d9cd6.tar.gz
GdkGLContext: Add a GL debug message callback
If G_ENABLE_CONSISTENCY_CHECKS is defined (i.e. if our buildtype is 'debug'), add a opengl debug callback that prints all debug messages with a severity higher than SEVERITY_NOTIFICATION as a warning to the console.
-rw-r--r--gdk/gdkglcontext.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c
index c31ad1e4c9..b3703eef34 100644
--- a/gdk/gdkglcontext.c
+++ b/gdk/gdkglcontext.c
@@ -106,6 +106,7 @@ typedef struct {
guint has_gl_framebuffer_blit : 1;
guint has_frame_terminator : 1;
guint has_unpack_subimage : 1;
+ guint has_debug_output : 1;
guint extensions_checked : 1;
guint debug_enabled : 1;
guint forward_compatible : 1;
@@ -722,6 +723,99 @@ gdk_gl_context_get_use_es (GdkGLContext *context)
return priv->use_es > 0;
}
+#ifdef G_ENABLE_CONSISTENCY_CHECKS
+static void
+gl_debug_message_callback (GLenum source,
+ GLenum type,
+ GLuint id,
+ GLenum severity,
+ GLsizei length,
+ const GLchar *message,
+ const void *user_data)
+{
+ const char *message_source;
+ const char *message_type;
+ const char *message_severity;
+
+ if (severity == GL_DEBUG_SEVERITY_NOTIFICATION)
+ return;
+
+ switch (source)
+ {
+ case GL_DEBUG_SOURCE_API:
+ message_source = "API";
+ break;
+ case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
+ message_source = "Window System";
+ break;
+ case GL_DEBUG_SOURCE_SHADER_COMPILER:
+ message_source = "Shader Compiler";
+ break;
+ case GL_DEBUG_SOURCE_THIRD_PARTY:
+ message_source = "Third Party";
+ break;
+ case GL_DEBUG_SOURCE_APPLICATION:
+ message_source = "Application";
+ break;
+ case GL_DEBUG_SOURCE_OTHER:
+ default:
+ message_source = "Other";
+ }
+
+ switch (type)
+ {
+ case GL_DEBUG_TYPE_ERROR:
+ message_type = "Error";
+ break;
+ case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
+ message_type = "Deprecated Behavior";
+ break;
+ case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
+ message_type = "Undefined Behavior";
+ break;
+ case GL_DEBUG_TYPE_PORTABILITY:
+ message_type = "Portability";
+ break;
+ case GL_DEBUG_TYPE_PERFORMANCE:
+ message_type = "Performance";
+ break;
+ case GL_DEBUG_TYPE_MARKER:
+ message_type = "Marker";
+ break;
+ case GL_DEBUG_TYPE_PUSH_GROUP:
+ message_type = "Push Group";
+ break;
+ case GL_DEBUG_TYPE_POP_GROUP:
+ message_type = "Pop Group";
+ break;
+ case GL_DEBUG_TYPE_OTHER:
+ default:
+ message_type = "Other";
+ }
+
+ switch (severity)
+ {
+ case GL_DEBUG_SEVERITY_HIGH:
+ message_severity = "High";
+ break;
+ case GL_DEBUG_SEVERITY_MEDIUM:
+ message_severity = "Medium";
+ break;
+ case GL_DEBUG_SEVERITY_LOW:
+ message_severity = "Low";
+ break;
+ case GL_DEBUG_SEVERITY_NOTIFICATION:
+ message_severity = "Notification";
+ break;
+ default:
+ message_severity = "Unknown";
+ }
+
+ g_warning ("OPENGL:\n Source: %s\n Type: %s\n Severity: %s\n Message: %s",
+ message_source, message_type, message_severity, message);
+}
+#endif
+
/**
* gdk_gl_context_realize:
* @context: a #GdkGLContext
@@ -767,6 +861,18 @@ gdk_gl_context_check_extensions (GdkGLContext *context)
if (priv->use_es < 0)
priv->use_es = !epoxy_is_desktop_gl ();
+ priv->has_debug_output = epoxy_has_gl_extension ("GL_ARB_debug_output");
+
+#ifdef G_ENABLE_CONSISTENCY_CHECKS
+ if (priv->has_debug_output)
+ {
+ gdk_gl_context_make_current (context);
+ glEnable (GL_DEBUG_OUTPUT);
+ glEnable (GL_DEBUG_OUTPUT_SYNCHRONOUS);
+ glDebugMessageCallback (gl_debug_message_callback, NULL);
+ }
+#endif
+
if (priv->use_es)
{
has_npot = priv->gl_version >= 20;