Subastra
Loading...
Searching...
No Matches
shader.h
Go to the documentation of this file.
1#ifndef __H__ENGINE_SHADER__
2#define __H__ENGINE_SHADER__
3
4#include <GL/glew.h>
5
6#include <GL/glext.h>
7#include <GLFW/glfw3.h>
8
9#include "../defs.h"
10#include "../memory.h"
11
15typedef struct {
16 GLuint gl_program;
17} shader_t;
18
19static GLuint shader__compile_opengl_shader_or_panic(const char *src,
20 GLuint kind) {
22
23 GLuint shader = glCreateShader(kind);
24 glShaderSource(shader, 1, &src, NULL);
25 glCompileShader(shader);
26
27 GLint is_ok = GL_TRUE;
28 glGetShaderiv(shader, GL_COMPILE_STATUS, &is_ok);
29 if (is_ok != GL_TRUE) {
30 GLint length = 0;
31 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
32
33 char *out = allocator_alloc_ty(char, alloc, length);
34 glGetShaderInfoLog(shader, length, 0, out);
35 PANIC("Shader Compilation Failed: %s", out);
36 }
37
38 return shader;
39}
40
42static void shader_init(shader_t *shader, const char *vertex_src,
43 const char *fragment_src) {
45
46 ASSERT__(vertex_src);
47 ASSERT__(fragment_src);
48
49 GLuint vs =
50 shader__compile_opengl_shader_or_panic(vertex_src, GL_VERTEX_SHADER);
51 GLuint fs =
52 shader__compile_opengl_shader_or_panic(fragment_src, GL_FRAGMENT_SHADER);
53
54 shader->gl_program = glCreateProgram();
55 glAttachShader(shader->gl_program, vs);
56 glAttachShader(shader->gl_program, fs);
57
58 glLinkProgram(shader->gl_program);
59
60 GLint is_ok = GL_TRUE;
61 glGetShaderiv(shader->gl_program, GL_LINK_STATUS, &is_ok);
62 if (is_ok != GL_TRUE) {
63 GLint length = 0;
64 glGetShaderiv(shader->gl_program, GL_INFO_LOG_LENGTH, &length);
65
66 char *out = allocator_alloc_ty(char, alloc, length);
67 glGetShaderInfoLog(shader->gl_program, length, 0, out);
68 PANIC("Shader Linking Failed: %s", out);
69 }
70
71 glDeleteShader(vs);
72 glDeleteShader(fs);
73}
74
75static void shader_cleanup(shader_t *shader) {
76 glDeleteProgram(shader->gl_program);
77}
78
79#endif
#define ASSERT__(expr)
Definition defs.h:21
#define PANIC(msg,...)
Definition defs.h:15
static allocator_t allocator_new_stack_alloc()
Definition memory.h:113
static void shader_cleanup(shader_t *shader)
Definition shader.h:75
static GLuint shader__compile_opengl_shader_or_panic(const char *src, GLuint kind)
Definition shader.h:19
A generic allocator type passed by value. Contains a fallback allocator and a set of function pointer...
Definition memory.h:30
Small container and wrapper over OpenGL for shader-related things. In actually it is closer to what O...
Definition shader.h:15
GLuint gl_program
Definition shader.h:16
static void shader_init(shader_t *shader, const char *vertex_src, const char *fragment_src)
Definition shader.h:42