aboutsummaryrefslogtreecommitdiffstats
path: root/glprog.c
diff options
context:
space:
mode:
authorTomasz Kramkowski <tk@the-tk.com>2018-03-27 18:51:07 +0100
committerTomasz Kramkowski <tk@the-tk.com>2018-03-27 19:21:34 +0100
commit4329c4e47c43dd34a106b5c8158f06728780629a (patch)
tree8ede3a5a46773730f9ad88ae201badb3636e4214 /glprog.c
parent126c248cf55d10c1584f9bb340144b42ae57e847 (diff)
downloadfaqe-4329c4e47c43dd34a106b5c8158f06728780629a.tar.gz
faqe-4329c4e47c43dd34a106b5c8158f06728780629a.tar.xz
faqe-4329c4e47c43dd34a106b5c8158f06728780629a.zip
glprog: Wrap OpenGL program object loading
glprog provides a simple interface to loadign OpenGL program objects and getting their uniform locations.
Diffstat (limited to 'glprog.c')
-rw-r--r--glprog.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/glprog.c b/glprog.c
new file mode 100644
index 0000000..84f2bab
--- /dev/null
+++ b/glprog.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2018 Tomasz Kramkowski <tk@the-tk.com>
+ * SPDX-License-Identifier: MIT
+ */
+#include <assert.h>
+
+#include "eprintf.h"
+#include "glprog.h"
+#include "loadgl.h"
+
+enum {
+ LOGSIZE = 1024,
+};
+
+static GLuint load_shader(const struct shdrdat *shdr)
+{
+ GLuint id;
+ GLint success;
+ char log[LOGSIZE];
+
+ id = gl_shdr_create(shdr->type);
+ gl_shdr_source(id, 1, &shdr->src, &shdr->len);
+ gl_shdr_compile(id);
+ gl_shdr_param(id, GL_COMPILE_STATUS, &success);
+
+ if (!success) {
+ gl_shdr_infolog(id, sizeof log, NULL, log);
+ eprintf("Failed to compile shader:\n%s", log);
+ }
+
+ return id;
+}
+
+void detach_shaders(GLuint prog)
+{
+ GLsizei count;
+ GLuint shdr;
+
+ while (gl_prog_getshdrs(prog, 1, &count, &shdr), count)
+ gl_prog_detachshdr(prog, shdr);
+}
+
+GLuint glprog_load(int nshdrs, const struct shdrdat *shdrs, int nunis, const struct unidat *unis)
+{
+ GLuint prog;
+ GLint success;
+ char log[LOGSIZE];
+
+ assert(nshdrs > 0);
+ assert(shdrs != NULL);
+ assert(nunis <= 0 || unis != NULL);
+
+ prog = gl_prog_create();
+ for (int i = 0; i < nshdrs; i++) {
+ GLuint shdr = load_shader(&shdrs[i]);
+ gl_prog_attachshdr(prog, shdr);
+ gl_shdr_del(shdr);
+ }
+ gl_prog_link(prog);
+ gl_prog_param(prog, GL_LINK_STATUS, &success);
+ if (!success) {
+ gl_prog_infolog(prog, sizeof log, NULL, log);
+ eprintf("Failed to link program:\n%s", log);
+ }
+
+ detach_shaders(prog);
+
+ for (int i = 0; i < nunis; i++)
+ *unis[i].loc = gl_uni_loc(prog, unis[i].name);
+
+ return prog;
+}