glDrawRangeElements in dbg_gui to shut the intel performance warnings up
[laserbrain_demo] / src / opengl.c
1 #include <stdlib.h>
2 #include "opengl.h"
3 #include "logger.h"
4
5
6 static void GLAPIENTRY gldebug_logger(GLenum src, GLenum type, GLuint id, GLenum severity,
7                 GLsizei len, const char *msg, const void *cls);
8
9 static const char *gldebug_srcstr(unsigned int src);
10 static const char *gldebug_typestr(unsigned int type);
11 static const char *gldebug_sevstr(unsigned int sev);
12
13 struct GLCaps glcaps;
14
15 int init_opengl(void)
16 {
17         glewInit();
18
19         glcaps.debug = GLEW_ARB_debug_output;
20         glcaps.draw_range = GLEW_EXT_draw_range_elements;
21
22 #ifndef NDEBUG
23         if(glcaps.debug) {
24                 info_log("Installing OpenGL debug callback\n");
25                 glDebugMessageCallback(gldebug_logger, 0);
26         }
27 #endif
28
29         return 0;
30 }
31
32 void dump_gl_texture(unsigned int tex, const char *fname)
33 {
34         FILE *fp;
35         int i, width, height;
36         unsigned char *pixels;
37
38         glBindTexture(GL_TEXTURE_2D, tex);
39         glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
40         glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
41
42         if(!(pixels = malloc(width * height * 3))) {
43                 return;
44         }
45         glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
46
47         if(!(fp = fopen(fname, "wb"))) {
48                 free(pixels);
49                 return;
50         }
51         fprintf(fp, "P6\n%d %d\n255\n", width, height);
52         for(i=0; i<width * height * 3; i++) {
53                 fputc(pixels[i], fp);
54         }
55         fclose(fp);
56         free(pixels);
57 }
58
59
60 static void GLAPIENTRY gldebug_logger(GLenum src, GLenum type, GLuint id, GLenum severity,
61                 GLsizei len, const char *msg, const void *cls)
62 {
63         static const char *fmt = "[GLDEBUG] (%s) %s: %s\n";
64         switch(type) {
65         case GL_DEBUG_TYPE_ERROR:
66                 error_log(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
67                 break;
68
69         case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
70         case GL_DEBUG_TYPE_PORTABILITY:
71         case GL_DEBUG_TYPE_PERFORMANCE:
72                 warning_log(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
73                 break;
74
75         default:
76                 debug_log(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
77         }
78 }
79
80 static const char *gldebug_srcstr(unsigned int src)
81 {
82         switch(src) {
83         case GL_DEBUG_SOURCE_API:
84                 return "api";
85         case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
86                 return "wsys";
87         case GL_DEBUG_SOURCE_SHADER_COMPILER:
88                 return "sdrc";
89         case GL_DEBUG_SOURCE_THIRD_PARTY:
90                 return "3rdparty";
91         case GL_DEBUG_SOURCE_APPLICATION:
92                 return "app";
93         case GL_DEBUG_SOURCE_OTHER:
94                 return "other";
95         default:
96                 break;
97         }
98         return "unknown";
99 }
100
101 static const char *gldebug_typestr(unsigned int type)
102 {
103         switch(type) {
104         case GL_DEBUG_TYPE_ERROR:
105                 return "error";
106         case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
107                 return "deprecated";
108         case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
109                 return "undefined behavior";
110         case GL_DEBUG_TYPE_PORTABILITY:
111                 return "portability warning";
112         case GL_DEBUG_TYPE_PERFORMANCE:
113                 return "performance warning";
114         case GL_DEBUG_TYPE_OTHER:
115                 return "other";
116         default:
117                 break;
118         }
119         return "unknown";
120 }
121
122 static const char *gldebug_sevstr(unsigned int sev)
123 {
124         switch(sev) {
125         case GL_DEBUG_SEVERITY_HIGH:
126                 return "high";
127         case GL_DEBUG_SEVERITY_MEDIUM:
128                 return "medium";
129         case GL_DEBUG_SEVERITY_LOW:
130                 return "low";
131         default:
132                 break;
133         }
134         return "unknown";
135 }