diff options
author | Tomasz Kramkowski <tk@the-tk.com> | 2018-03-27 18:51:07 +0100 |
---|---|---|
committer | Tomasz Kramkowski <tk@the-tk.com> | 2018-03-27 19:21:34 +0100 |
commit | 4329c4e47c43dd34a106b5c8158f06728780629a (patch) | |
tree | 8ede3a5a46773730f9ad88ae201badb3636e4214 /glprog.c | |
parent | 126c248cf55d10c1584f9bb340144b42ae57e847 (diff) | |
download | faqe-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.c | 72 |
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; +} |