aboutsummaryrefslogtreecommitdiff
path: root/shader.c
diff options
context:
space:
mode:
Diffstat (limited to 'shader.c')
-rw-r--r--shader.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/shader.c b/shader.c
new file mode 100644
index 0000000..df17d5d
--- /dev/null
+++ b/shader.c
@@ -0,0 +1,48 @@
+#include "shader.h"
+
+#include "die.h"
+
+void check_shader(GLuint shader) {
+ int success;
+ char debug[LOG_MAX];
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
+ if (success) return;
+ glGetShaderInfoLog(shader, LOG_MAX, NULL, debug);
+ die("error: shader compilation failed:\n%s\n", debug);
+}
+
+void check_program(GLuint program) {
+ int success;
+ char debug[LOG_MAX];
+ glGetProgramiv(program, GL_LINK_STATUS, &success);
+ if (success) return;
+ glGetProgramInfoLog(program, LOG_MAX, NULL, debug);
+ die("error: shader linking failed:\n%s\n", debug);
+}
+
+GLuint load_shader(GLenum type, const char* const src, size_t src_size) {
+ GLuint shader = glCreateShader(type);
+ glShaderSource(shader, 1, &src, (const int*) &src_size);
+ glCompileShader(shader);
+ check_shader(shader);
+ return shader;
+}
+
+GLuint frag_shader(const char* const src, size_t src_size) {
+ return load_shader(GL_FRAGMENT_SHADER, src, src_size);
+}
+GLuint vert_shader(const char* const src, size_t src_size) {
+ return load_shader(GL_VERTEX_SHADER, src, src_size);
+}
+
+GLuint link_shaders(GLuint vert, GLuint frag) {
+ GLuint shader = glCreateProgram();
+ glAttachShader(shader, vert);
+ glAttachShader(shader, frag);
+ glLinkProgram(shader);
+ check_program(shader);
+ glDeleteShader(vert);
+ glDeleteShader(frag);
+ return shader;
+}
+