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