Merge branch 'master' of goat:git/laserbrain_demo
[laserbrain_demo] / src / opengl.c
1 #include "opengl.h"
2 #include "logger.h"
3
4
5 static void GLAPIENTRY gldebug_logger(GLenum src, GLenum type, GLuint id, GLenum severity,
6                 GLsizei len, const char *msg, const void *cls);
7
8 static const char *gldebug_srcstr(unsigned int src);
9 static const char *gldebug_typestr(unsigned int type);
10 static const char *gldebug_sevstr(unsigned int sev);
11
12 struct GLCaps glcaps;
13
14 int init_opengl(void)
15 {
16         glewInit();
17
18         glcaps.debug = GLEW_ARB_debug_output;
19
20 #ifndef NDEBUG
21         if(glcaps.debug) {
22                 info_log("Installing OpenGL debug callback\n");
23                 glDebugMessageCallback(gldebug_logger, 0);
24         }
25 #endif
26
27         return 0;
28 }
29
30
31 static void GLAPIENTRY gldebug_logger(GLenum src, GLenum type, GLuint id, GLenum severity,
32                 GLsizei len, const char *msg, const void *cls)
33 {
34         static const char *fmt = "[GLDEBUG] (%s) %s: %s\n";
35         switch(type) {
36         case GL_DEBUG_TYPE_ERROR:
37                 error_log(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
38                 break;
39
40         case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
41         case GL_DEBUG_TYPE_PORTABILITY:
42         case GL_DEBUG_TYPE_PERFORMANCE:
43                 warning_log(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
44                 break;
45
46         default:
47                 debug_log(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
48         }
49 }
50
51 static const char *gldebug_srcstr(unsigned int src)
52 {
53         switch(src) {
54         case GL_DEBUG_SOURCE_API:
55                 return "api";
56         case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
57                 return "wsys";
58         case GL_DEBUG_SOURCE_SHADER_COMPILER:
59                 return "sdrc";
60         case GL_DEBUG_SOURCE_THIRD_PARTY:
61                 return "3rdparty";
62         case GL_DEBUG_SOURCE_APPLICATION:
63                 return "app";
64         case GL_DEBUG_SOURCE_OTHER:
65                 return "other";
66         default:
67                 break;
68         }
69         return "unknown";
70 }
71
72 static const char *gldebug_typestr(unsigned int type)
73 {
74         switch(type) {
75         case GL_DEBUG_TYPE_ERROR:
76                 return "error";
77         case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
78                 return "deprecated";
79         case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
80                 return "undefined behavior";
81         case GL_DEBUG_TYPE_PORTABILITY:
82                 return "portability warning";
83         case GL_DEBUG_TYPE_PERFORMANCE:
84                 return "performance warning";
85         case GL_DEBUG_TYPE_OTHER:
86                 return "other";
87         default:
88                 break;
89         }
90         return "unknown";
91 }
92
93 static const char *gldebug_sevstr(unsigned int sev)
94 {
95         switch(sev) {
96         case GL_DEBUG_SEVERITY_HIGH:
97                 return "high";
98         case GL_DEBUG_SEVERITY_MEDIUM:
99                 return "medium";
100         case GL_DEBUG_SEVERITY_LOW:
101                 return "low";
102         default:
103                 break;
104         }
105         return "unknown";
106 }