+#include <stdio.h>
+#include <unistd.h>
#include "opengl.h"
+static void GLAPIENTRY gldebug_logger(GLenum src, GLenum type, GLuint id, GLenum severity,
+ GLsizei len, const char *msg, const void *cls);
+
+static const char *gldebug_srcstr(unsigned int src);
+static const char *gldebug_typestr(unsigned int type);
+static const char *gldebug_sevstr(unsigned int sev);
+
+
int init_gl(void)
{
+ glewInit();
+
+ glDebugMessageCallbackARB(gldebug_logger, 0);
return 0;
}
+
+static void textcolor(FILE *fp, int col)
+{
+ if(!isatty(fileno(fp))) return;
+
+ if(col) {
+ fprintf(fp, "\033[;%dm", col);
+ } else {
+ fputs("\033[0m", fp);
+ }
+}
+
+
+static void GLAPIENTRY gldebug_logger(GLenum src, GLenum type, GLuint id, GLenum severity,
+ GLsizei len, const char *msg, const void *cls)
+{
+ static const char *fmt = "[GLDEBUG]%s (%s) %s: %s\n";
+ switch(type) {
+ case GL_DEBUG_TYPE_ERROR:
+ textcolor(stderr, 31);
+ fprintf(stderr, fmt, gldebug_sevstr(severity), gldebug_srcstr(src),
+ gldebug_typestr(type), msg);
+ textcolor(stderr, 0);
+ break;
+
+ case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
+ case GL_DEBUG_TYPE_PORTABILITY:
+ case GL_DEBUG_TYPE_PERFORMANCE:
+ textcolor(stderr, 33);
+ fprintf(stderr, fmt, gldebug_sevstr(severity), gldebug_srcstr(src),
+ gldebug_typestr(type), msg);
+ textcolor(stderr, 0);
+ break;
+
+ default:
+ fprintf(stderr, fmt, gldebug_sevstr(severity), gldebug_srcstr(src),
+ gldebug_typestr(type), msg);
+ }
+}
+
+static const char *gldebug_srcstr(unsigned int src)
+{
+ switch(src) {
+ case GL_DEBUG_SOURCE_API:
+ return "api";
+ case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
+ return "wsys";
+ case GL_DEBUG_SOURCE_SHADER_COMPILER:
+ return "sdrc";
+ case GL_DEBUG_SOURCE_THIRD_PARTY:
+ return "3rdparty";
+ case GL_DEBUG_SOURCE_APPLICATION:
+ return "app";
+ case GL_DEBUG_SOURCE_OTHER:
+ return "other";
+ default:
+ break;
+ }
+ return "unknown";
+}
+
+static const char *gldebug_typestr(unsigned int type)
+{
+ switch(type) {
+ case GL_DEBUG_TYPE_ERROR:
+ return "error";
+ case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
+ return "deprecated";
+ case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
+ return "undefined behavior";
+ case GL_DEBUG_TYPE_PORTABILITY:
+ return "portability warning";
+ case GL_DEBUG_TYPE_PERFORMANCE:
+ return "performance warning";
+ case GL_DEBUG_TYPE_OTHER:
+ return "other";
+ default:
+ break;
+ }
+ return "unknown";
+}
+
+static const char *gldebug_sevstr(unsigned int sev)
+{
+ switch(sev) {
+ case GL_DEBUG_SEVERITY_HIGH:
+ return "!!";
+ case GL_DEBUG_SEVERITY_MEDIUM:
+ return "!";
+ case GL_DEBUG_SEVERITY_LOW:
+ default:
+ break;
+ }
+ return "";
+}