summaryrefslogtreecommitdiff
path: root/prge_shader.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-02-20 15:10:11 +0500
committerpryazha <pryadeiniv@mail.ru>2025-02-20 15:10:11 +0500
commit34821e9fefb0d7cbf9e72a2457b2901edbbe03bb (patch)
tree59ec69f7d19aa48091b3d39ad0dfd6b26bacb88b /prge_shader.c
initial
Diffstat (limited to 'prge_shader.c')
-rw-r--r--prge_shader.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/prge_shader.c b/prge_shader.c
new file mode 100644
index 0000000..21a91f3
--- /dev/null
+++ b/prge_shader.c
@@ -0,0 +1,65 @@
+U32 compile_shader(GLenum type, Str8 filename)
+{
+ Arena *tmp = arena_alloc(0);
+
+ Str8 src = str8_read_entire_file(tmp, filename);
+ if (!src.ptr || !src.length) {
+ str8print(str8_pushf(tmp, "[ERROR] : Failed to read \"%.*s\"\n", str8expand(filename)));
+ arena_release(tmp);
+ return 0;
+ }
+
+ const char *csrc = str8_to_cstr(tmp, src);
+
+ U32 id = glCreateShader(type);
+ glShaderSource(id, 1, &csrc, 0);
+ glCompileShader(id);
+
+ S32 status;
+ glGetShaderiv(id, GL_COMPILE_STATUS, &status);
+ if (status == GL_FALSE) {
+ char log[512];
+ glGetShaderInfoLog(id, 512, 0, log);
+ str8print(str8_pushf(tmp, "[ERROR] : Failed to compile : \"%.*s\"\n%s", str8expand(filename), log));
+ } else {
+ str8print(str8_pushf(tmp, "[INFO] : \"%.*s\" compiled successfully.\n", str8expand(filename)));
+ }
+
+ arena_release(tmp);
+
+ return id;
+}
+
+U32 create_shader_program(Str8 vert_filename, Str8 frag_filename)
+{
+ U32 vert = compile_shader(GL_VERTEX_SHADER, vert_filename);
+ U32 frag = compile_shader(GL_FRAGMENT_SHADER, frag_filename);
+
+ Arena *tmp = arena_alloc(0);
+
+ U32 id = glCreateProgram();
+ glAttachShader(id, vert);
+ glAttachShader(id, frag);
+ glLinkProgram(id);
+ S32 success;
+ glGetProgramiv(id, GL_LINK_STATUS, &success);
+ if (success == GL_FALSE) {
+ char log[512];
+ glGetProgramInfoLog(id, 512, 0, log);
+ str8print(str8_pushf(tmp, "[ERROR]: Failed to link shader program:\n%s", log));
+ } else {
+ str8print(str8_pushf(tmp, "[INFO]: Shader program linked successfuly.\n\n"));
+ }
+ glDeleteShader(vert);
+ glDeleteShader(frag);
+
+ arena_release(tmp);
+
+ return id;
+}
+
+void shader_set_mat4fv(U32 id, char *name, Mat4 m)
+{
+ S32 loc = glGetUniformLocation(id, name);
+ glUniformMatrix4fv(loc, 1, 0, (F32 *)&m);
+}