-
Notifications
You must be signed in to change notification settings - Fork 1
/
util.c
93 lines (73 loc) · 1.6 KB
/
util.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
* gogol
* util.c
*/
#include <GL/gl.h>
#include <stdlib.h>
#include <stdio.h>
char *readfile(const char *path)
{
FILE *fp;
char *buffer;
size_t size;
if (! (fp = fopen(path, "rb"))) {
fprintf(stderr, "error reading %s\n", path);
exit(1);
}
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
rewind(fp);
buffer = malloc(size + 1);
fread(buffer, size, 1, fp);
fclose(fp);
buffer[size] = '\0';
return buffer;
}
/*
* Display compilation errors from the OpenGL shader compiler
*/
void printlog(GLuint object)
{
GLint len = 0;
char *log;
if (glIsShader(object)) {
glGetShaderiv(object, GL_INFO_LOG_LENGTH, &len);
} else if (glIsProgram(object)) {
glGetProgramiv(object, GL_INFO_LOG_LENGTH, &len);
} else {
fprintf(stderr, "error: not a shader or a program\n");
return;
}
log = malloc(len);
if (glIsShader(object))
glGetShaderInfoLog(object, len, NULL, log);
else if (glIsProgram(object))
glGetProgramInfoLog(object, len, NULL, log);
fprintf(stderr, "%s", log);
free(log);
}
/*
* Compile the shader from file `filename`
*/
GLuint createShader(const char* filename, GLenum type)
{
GLchar *source = readfile(filename);
if (source == NULL) {
fprintf(stderr, "error opening %s", filename);
return 0;
}
GLuint res = glCreateShader(type);
const GLchar* sources[] = { source };
glShaderSource(res, 1, sources, NULL);
free(source);
glCompileShader(res);
GLint compile_ok = GL_FALSE;
glGetShaderiv(res, GL_COMPILE_STATUS, &compile_ok);
if (compile_ok == GL_FALSE) {
fprintf(stderr, "%s: ", filename);
printlog(res);
glDeleteShader(res);
return 0;
}
return res;
}