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