$darkmode
Suckless OGL 1.0.0
A lean, high-performance C11 PBR Renderer
shader.h
Go to the documentation of this file.
1 
6 #ifndef SHADER_H
7 #define SHADER_H
8 
9 #include "gl_common.h"
10 #include <stdbool.h>
11 
13 
22 GLuint shader_compile(const char* path, GLenum type);
23 
29 char* shader_read_file(const char* path);
30 
38 char* shader_read_file_with_defines(const char* path, const char** defines,
39  int count);
40 
45 GLuint shader_load_program(const char* vertex_path, const char* fragment_path);
46 
51 GLuint shader_load_compute(const char* compute_path);
52 
53 /* -------------------------------------------------------------------------
54  * NEW GENERIC SHADER API (with automatic Uniform Caching)
55  * ------------------------------------------------------------------------- */
56 
61 typedef struct {
62  char* name;
63  GLint location;
64 } UniformEntry;
65 
71 typedef struct {
72  GLuint program;
73  char* name;
77  bool
80 } Shader;
81 
88 Shader* shader_load(const char* vertex_path, const char* fragment_path);
89 
95 Shader* shader_load_compute_program(const char* compute_path);
96 
105 Shader* shader_load_with_defines(const char* vertex_path,
106  const char* fragment_path,
107  const char** defines, int count);
108 
113 void shader_destroy(Shader* shader);
114 
119 void shader_use(Shader* shader);
120 
127 GLint shader_get_uniform_location(Shader* shader, const char* name);
128 
129 /* --- FAST UNIFORM SETTERS (O(log N)) --- */
130 
131 void shader_set_int(Shader* shader, const char* name, int val);
132 void shader_set_float(Shader* shader, const char* name, float val);
133 void shader_set_vec2(Shader* shader, const char* name, const float* val);
134 void shader_set_vec3(Shader* shader, const char* name, const float* val);
135 void shader_set_vec4(Shader* shader, const char* name, const float* val);
136 void shader_set_mat4(Shader* shader, const char* name, const float* val);
137 
138 /* --- FASTER UNIFORM SETTERS (O(1) - Cached Location) --- */
139 
140 void shader_set_int_loc(GLint loc, int val);
141 void shader_set_float_loc(GLint loc, float val);
142 void shader_set_vec2_loc(GLint loc, const float* val);
143 void shader_set_vec3_loc(GLint loc, const float* val);
144 void shader_set_vec4_loc(GLint loc, const float* val);
145 void shader_set_mat4_loc(GLint loc, const float* val);
146 
151 #define SHADER_SAFE_DESTROY(s) \
152  do { \
153  if ((s) != NULL) { \
154  shader_destroy(s); \
155  (s) = NULL; \
156  } \
157  } while (0)
158 
159 #endif /* SHADER_H */
Common OpenGL definitions, RAII helpers, and utilities.
GLuint shader_load_compute(const char *compute_path)
Helper to load a compute program from disk.
Definition: shader.c:589
void shader_set_vec4_loc(GLint loc, const float *val)
Definition: shader.c:862
void shader_set_int(Shader *shader, const char *name, int val)
Definition: shader.c:794
Shader * shader_load_with_defines(const char *vertex_path, const char *fragment_path, const char **defines, int count)
Special loader that injects #define directives before compilation.
Definition: shader.c:698
void shader_set_int_loc(GLint loc, int val)
Definition: shader.c:842
void shader_destroy(Shader *shader)
Destroys the shader wrapper and deletes the GL program.
Definition: shader.c:719
void shader_set_vec2(Shader *shader, const char *name, const float *val)
Definition: shader.c:810
void shader_set_float_loc(GLint loc, float val)
Definition: shader.c:847
void shader_set_vec3(Shader *shader, const char *name, const float *val)
Definition: shader.c:818
void shader_set_vec3_loc(GLint loc, const float *val)
Definition: shader.c:857
void shader_set_mat4(Shader *shader, const char *name, const float *val)
Definition: shader.c:834
GLint shader_get_uniform_location(Shader *shader, const char *name)
Retrieves a uniform location via binary search on the cache.
Definition: shader.c:750
GLuint shader_compile(const char *path, GLenum type)
Compiles a single shader stage from a file.
Definition: shader.c:523
void shader_set_vec4(Shader *shader, const char *name, const float *val)
Definition: shader.c:826
void shader_set_vec2_loc(GLint loc, const float *val)
Definition: shader.c:852
@ SHADER_WARNING_THROTTLE_LIMIT
Definition: shader.h:12
Shader * shader_load_compute_program(const char *compute_path)
Loads a compute program and caches its uniforms.
Definition: shader.c:713
Shader * shader_load(const char *vertex_path, const char *fragment_path)
Loads a linked program and caches all its active uniforms.
Definition: shader.c:693
char * shader_read_file(const char *path)
Reads a shader file into RAM, processing all includes.
Definition: shader.c:489
void shader_use(Shader *shader)
Activates the program for subsequent draw calls (glUseProgram).
Definition: shader.c:743
GLuint shader_load_program(const char *vertex_path, const char *fragment_path)
Helper to load a classic Vertex+Fragment program from disk.
Definition: shader.c:583
void shader_set_mat4_loc(GLint loc, const float *val)
Definition: shader.c:867
void shader_set_float(Shader *shader, const char *name, float val)
Definition: shader.c:802
char * shader_read_file_with_defines(const char *path, const char **defines, int count)
Reads a shader file and injects defines.
Definition: shader.c:414
Wrapper for an OpenGL program with uniform caching and automatic cleanup.
Definition: shader.h:71
bool silent_warnings
Definition: shader.h:78
int entry_count
Definition: shader.h:75
char * name
Definition: shader.h:73
int warning_count
Definition: shader.h:79
GLuint program
Definition: shader.h:72
UniformEntry * entries
Definition: shader.h:74
int entry_capacity
Definition: shader.h:76
Cached uniform metadata for fast lookup.
Definition: shader.h:61
GLint location
Definition: shader.h:63
char * name
Definition: shader.h:62