evolving the basic gfx abstractions
[nexus3d] / src / gl / opengl.c
index ca7fb6b..06fedef 100644 (file)
@@ -1,6 +1,114 @@
+#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 "";
+}