7042514bc3131b32d8790d1a9a4e98de53398b0a
[ld42_outofspace] / src / opengl.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "opengl.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
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                 printf("Installing OpenGL debug callback\n");
23                 glDebugMessageCallbackARB(gldebug_logger, 0);
24         }
25 #endif
26
27         return 0;
28 }
29
30 int next_pow2(int x)
31 {
32         x--;
33         x = (x >> 1) | x;
34         x = (x >> 2) | x;
35         x = (x >> 4) | x;
36         x = (x >> 8) | x;
37         x = (x >> 16) | x;
38         return x + 1;
39 }
40
41 void dump_gl_texture(unsigned int tex, const char *fname)
42 {
43         FILE *fp;
44         int i, width, height;
45         unsigned char *pixels, *pptr;
46
47         glBindTexture(GL_TEXTURE_2D, tex);
48         glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
49         glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
50
51         if(!(pixels = malloc(width * height * 4))) {
52                 return;
53         }
54         pptr = pixels;
55         glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
56
57         if(!(fp = fopen(fname, "wb"))) {
58                 free(pixels);
59                 return;
60         }
61         fprintf(fp, "P6\n%d %d\n255\n", width, height);
62         for(i=0; i<width * height; i++) {
63                 fputc(*pptr++, fp);
64                 fputc(*pptr++, fp);
65                 fputc(*pptr++, fp);
66                 pptr++;
67         }
68         fclose(fp);
69         free(pixels);
70 }
71
72
73 static void GLAPIENTRY gldebug_logger(GLenum src, GLenum type, GLuint id, GLenum severity,
74                 GLsizei len, const char *msg, const void *cls)
75 {
76         static const char *fmt = "[GLDEBUG] (%s) %s: %s\n";
77         switch(type) {
78         case GL_DEBUG_TYPE_ERROR:
79                 fprintf(stderr, fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
80                 break;
81
82         case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
83         case GL_DEBUG_TYPE_PORTABILITY:
84         case GL_DEBUG_TYPE_PERFORMANCE:
85                 printf(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
86                 break;
87
88         default:
89                 printf(fmt, gldebug_srcstr(src), gldebug_typestr(type), msg);
90         }
91 }
92
93 static const char *gldebug_srcstr(unsigned int src)
94 {
95         switch(src) {
96         case GL_DEBUG_SOURCE_API:
97                 return "api";
98         case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
99                 return "wsys";
100         case GL_DEBUG_SOURCE_SHADER_COMPILER:
101                 return "sdrc";
102         case GL_DEBUG_SOURCE_THIRD_PARTY:
103                 return "3rdparty";
104         case GL_DEBUG_SOURCE_APPLICATION:
105                 return "app";
106         case GL_DEBUG_SOURCE_OTHER:
107                 return "other";
108         default:
109                 break;
110         }
111         return "unknown";
112 }
113
114 static const char *gldebug_typestr(unsigned int type)
115 {
116         switch(type) {
117         case GL_DEBUG_TYPE_ERROR:
118                 return "error";
119         case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
120                 return "deprecated";
121         case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
122                 return "undefined behavior";
123         case GL_DEBUG_TYPE_PORTABILITY:
124                 return "portability warning";
125         case GL_DEBUG_TYPE_PERFORMANCE:
126                 return "performance warning";
127         case GL_DEBUG_TYPE_OTHER:
128                 return "other";
129         default:
130                 break;
131         }
132         return "unknown";
133 }
134
135 /*
136 static const char *gldebug_sevstr(unsigned int sev)
137 {
138         switch(sev) {
139         case GL_DEBUG_SEVERITY_HIGH:
140                 return "high";
141         case GL_DEBUG_SEVERITY_MEDIUM:
142                 return "medium";
143         case GL_DEBUG_SEVERITY_LOW:
144                 return "low";
145         default:
146                 break;
147         }
148         return "unknown";
149 }
150 */