From 604ae85b6e76befe96036d16c4e3096b966a03e0 Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Mon, 26 Mar 2018 21:27:00 +0100 Subject: loadgl: Use m4 to generate the loads The loadgl interfaces, loads and functions are now generated with m4 so that all the information can be stored in a single place. --- Makefile | 7 ++++- loadgl.c | 100 ------------------------------------------------------------ loadgl.c.in | 48 +++++++++++++++++++++++++++++ loadgl.h | 56 ---------------------------------- loadgl.h.in | 27 ++++++++++++++++ loadgl.m4 | 52 +++++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 157 deletions(-) delete mode 100644 loadgl.c create mode 100644 loadgl.c.in delete mode 100644 loadgl.h create mode 100644 loadgl.h.in create mode 100644 loadgl.m4 diff --git a/Makefile b/Makefile index df93833..aa71c5c 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,12 @@ DEP := $(OBJ:.o=.d) all: $(PROG) $(PROG): $(OBJ) clean: - $(RM) $(OBJ) $(DEP) $(PROG) + $(RM) $(OBJ) $(DEP) $(PROG) $(CLEAN) + +loadgl.o gltest.o: loadgl.h +loadgl.c loadgl.h: loadgl.%: loadgl.m4 loadgl.%.in + m4 $^ >$@ +CLEAN += loadgl.c loadgl.h include $(EPRINTF_PATH)/module.mk deplinks: $(EPRINTF_FILES) diff --git a/loadgl.c b/loadgl.c deleted file mode 100644 index 0dbd720..0000000 --- a/loadgl.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2018 Tomasz Kramkowski - * SPDX-License-Identifier: MIT - */ -#include - -#include "loadgl.h" - -#define LGL_FUNC(name, glname) \ - name##_func *name; \ - static const char *name##_gln = #glname; - -LGL_FUNC(gl_viewport, glViewport); -LGL_FUNC(gl_clearcolor, glClearColor); -LGL_FUNC(gl_clear, glClear); -LGL_FUNC(gl_buf_gen, glGenBuffers); -LGL_FUNC(gl_buf_bind, glBindBuffer); -LGL_FUNC(gl_buf_data, glBufferData); -LGL_FUNC(gl_shdr_create, glCreateShader); -LGL_FUNC(gl_shdr_del, glDeleteShader); -LGL_FUNC(gl_shdr_source, glShaderSource); -LGL_FUNC(gl_shdr_compile, glCompileShader); -LGL_FUNC(gl_shdr_param, glGetShaderiv); -LGL_FUNC(gl_shdr_infolog, glGetShaderInfoLog); -LGL_FUNC(gl_prog_create, glCreateProgram); -LGL_FUNC(gl_prog_attachshdr, glAttachShader); -LGL_FUNC(gl_prog_link, glLinkProgram); -LGL_FUNC(gl_prog_use, glUseProgram); -LGL_FUNC(gl_prog_del, glDeleteProgram); -LGL_FUNC(gl_prog_param, glGetProgramiv); -LGL_FUNC(gl_prog_infolog, glGetProgramInfoLog); -LGL_FUNC(gl_va_define, glVertexAttribPointer); -LGL_FUNC(gl_va_enable, glEnableVertexAttribArray); -LGL_FUNC(gl_va_disable, glDisableVertexAttribArray); -LGL_FUNC(gl_va_gen, glGenVertexArrays); -LGL_FUNC(gl_va_bind, glBindVertexArray); -LGL_FUNC(gl_draw_arrays, glDrawArrays); -LGL_FUNC(gl_draw_elems, glDrawElements); -LGL_FUNC(gl_poly_mode, glPolygonMode); - -static void *load_func(const char *name, lgl_loadfunc *load, jmp_buf env) -{ - void *ret; - - ret = load(name); - if (ret == NULL) - longjmp(env, LGL_MISSING); - - return ret; -} - -enum lgl_status lgl_load(lgl_loadfunc *load) -{ - enum lgl_status status; - jmp_buf env; - - status = setjmp(env); - if (status != 0) - return status; - -#define LGL_LOAD(name) name = (name##_func *)load_func(name##_gln, load, env); - LGL_LOAD(gl_viewport); - LGL_LOAD(gl_clearcolor); - LGL_LOAD(gl_clear); - LGL_LOAD(gl_buf_gen); - LGL_LOAD(gl_buf_bind); - LGL_LOAD(gl_buf_data); - LGL_LOAD(gl_shdr_create); - LGL_LOAD(gl_shdr_del); - LGL_LOAD(gl_shdr_source); - LGL_LOAD(gl_shdr_compile); - LGL_LOAD(gl_shdr_param); - LGL_LOAD(gl_shdr_infolog); - LGL_LOAD(gl_prog_create); - LGL_LOAD(gl_prog_attachshdr); - LGL_LOAD(gl_prog_link); - LGL_LOAD(gl_prog_use); - LGL_LOAD(gl_prog_del); - LGL_LOAD(gl_prog_param); - LGL_LOAD(gl_prog_infolog); - LGL_LOAD(gl_va_define); - LGL_LOAD(gl_va_enable); - LGL_LOAD(gl_va_disable); - LGL_LOAD(gl_va_gen); - LGL_LOAD(gl_va_bind); - LGL_LOAD(gl_draw_arrays); - LGL_LOAD(gl_draw_elems); - LGL_LOAD(gl_poly_mode); - - return LGL_OK; -} - -const char *lgl_strerror(enum lgl_status status) -{ - switch (status) { - case LGL_OK: return "Success"; - case LGL_MISSING: return "Missing function"; - } - return "Unknown"; -} diff --git a/loadgl.c.in b/loadgl.c.in new file mode 100644 index 0000000..a76eebc --- /dev/null +++ b/loadgl.c.in @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2018 Tomasz Kramkowski + * SPDX-License-Identifier: MIT + */ +#include + +#include "loadgl.h" + +#define LGL_FUNC(name, glname) \ + name##_func *name; \ + static const char *name##_gln = #glname; + +FUNCS()dnl + +static void *load_func(const char *name, lgl_loadfunc *load, jmp_buf env) +{ + void *ret; + + ret = load(name); + if (ret == NULL) + longjmp(env, LGL_MISSING); + + return ret; +} + +enum lgl_status lgl_load(lgl_loadfunc *load) +{ + enum lgl_status status; + jmp_buf env; + + status = setjmp(env); + if (status != 0) + return status; + +#define LGL_LOAD(name) name = (name##_func *)load_func(name##_gln, load, env); + LOADS()dnl + + return LGL_OK; +} + +const char *lgl_strerror(enum lgl_status status) +{ + switch (status) { + case LGL_OK: return "Success"; + case LGL_MISSING: return "Missing function"; + } + return "Unknown"; +} diff --git a/loadgl.h b/loadgl.h deleted file mode 100644 index 01acdfa..0000000 --- a/loadgl.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2018 Tomasz Kramkowski - * SPDX-License-Identifier: MIT - */ -#ifndef LOADGL_H -#define LOADGL_H - -#include "gldefs.h" - -typedef void *lgl_loadfunc(const char *name); - -enum lgl_status { - LGL_OK, - LGL_MISSING, -}; - -enum lgl_status lgl_load(lgl_loadfunc *load); -const char *lgl_strerror(enum lgl_status status); - -#define _LGL_INTERFACE(rett, name, func, ...) \ - typedef rett func(__VA_ARGS__); \ - extern func *name; -#define LGL_INTERFACE(rett, name, ...) _LGL_INTERFACE(rett, name, name##_func, __VA_ARGS__) - -LGL_INTERFACE(void, gl_viewport, GLint x, GLint y, GLsizei width, GLsizei height); -LGL_INTERFACE(void, gl_clearcolor, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -LGL_INTERFACE(void, gl_clear, GLbitfield mask); -/* LGL_INTERFACE(GLboolean, gl_isbuf, GLuint buffer); */ -LGL_INTERFACE(void, gl_buf_gen, GLsizei n, GLuint *buffers); -/* LGL_INTERFACE(void, gl_buf_del, GLsizei n, GLuint *buffers); */ -LGL_INTERFACE(void, gl_buf_bind, GLenum target, GLuint buffer); -LGL_INTERFACE(void, gl_buf_data, GLenum target, GLsizeiptr size, const void *data, GLenum usage); -LGL_INTERFACE(GLuint, gl_shdr_create, GLenum type); -LGL_INTERFACE(void, gl_shdr_del, GLuint shader); -/* LGL_INTERFACE(GLboolean, gl_isshdr, GLuint shader); */ -LGL_INTERFACE(void, gl_shdr_source, GLuint shader, GLsizei count, const char * const *string, const GLint *length); -LGL_INTERFACE(void, gl_shdr_compile, GLuint shader); -LGL_INTERFACE(void, gl_shdr_param, GLuint shader, GLenum pname, GLint *params); -LGL_INTERFACE(void, gl_shdr_infolog, GLuint shader, GLsizei size, GLsizei *len, char *data); -LGL_INTERFACE(GLuint, gl_prog_create, void); -LGL_INTERFACE(void, gl_prog_del, GLuint program); -LGL_INTERFACE(void, gl_prog_attachshdr, GLuint program, GLuint shader); -LGL_INTERFACE(void, gl_prog_link, GLuint program); -LGL_INTERFACE(void, gl_prog_use, GLuint program); -LGL_INTERFACE(void, gl_prog_param, GLuint prog, GLenum pname, GLint *params); -LGL_INTERFACE(void, gl_prog_infolog, GLuint prog, GLsizei size, GLsizei *len, char *data); -LGL_INTERFACE(void, gl_va_define, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *data); -LGL_INTERFACE(void, gl_va_enable, GLuint index); -LGL_INTERFACE(void, gl_va_disable, GLuint index); -LGL_INTERFACE(void, gl_va_gen, GLsizei n, GLuint *arrays); -LGL_INTERFACE(void, gl_va_bind, GLuint va); -LGL_INTERFACE(void, gl_draw_arrays, GLenum mode, GLint first, GLsizei count); -LGL_INTERFACE(void, gl_draw_elems, GLenum mode, GLsizei count, GLenum type, const void *indices); -LGL_INTERFACE(void, gl_poly_mode, GLenum face, GLenum mode); - -#endif // LOADGL_H diff --git a/loadgl.h.in b/loadgl.h.in new file mode 100644 index 0000000..e7381cd --- /dev/null +++ b/loadgl.h.in @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2018 Tomasz Kramkowski + * SPDX-License-Identifier: MIT + */ +#ifndef LOADGL_H +#define LOADGL_H + +#include "gldefs.h" + +typedef void *lgl_loadfunc(const char *name); + +enum lgl_status { + LGL_OK, + LGL_MISSING, +}; + +enum lgl_status lgl_load(lgl_loadfunc *load); +const char *lgl_strerror(enum lgl_status status); + +#define _LGL_INTERFACE(rett, name, func, ...) \ + typedef rett func(__VA_ARGS__); \ + extern func *name; +#define LGL_INTERFACE(rett, name, ...) _LGL_INTERFACE(rett, name, name##_func, __VA_ARGS__) + +INTERFACES()dnl + +#endif // LOADGL_H diff --git a/loadgl.m4 b/loadgl.m4 new file mode 100644 index 0000000..3a20e7c --- /dev/null +++ b/loadgl.m4 @@ -0,0 +1,52 @@ +divert(-1) +# Copyright (C) Tomasz Kramkowski +# SPDX-License + +# Macros + +# LOAD(glname, rtype, name, args) +define(`LOAD', +`divert(1)LGL_INTERFACE(shift($@)); +divert(2)LGL_FUNC($3, $1); +divert(3)LGL_LOAD($3); +divert(-1)') +m4wrap(`m4exit') + +# 1 - LGL_INTERFACE(rtype, name, args); +define(`INTERFACES', `undivert(1)') +# 2 - LGL_FUNC(name, glname); +define(`FUNCS', `undivert(2)') +# 3 - LGL_LOAD(name); +define(`LOADS', `undivert(3)') + +# Functions + +LOAD(glViewport, void, gl_viewport, GLint x, GLint y, GLsizei width, GLsizei height) +LOAD(glClearColor, void, gl_clearcolor, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) +LOAD(glClear, void, gl_clear, GLbitfield mask) +LOAD(glGenBuffers, void, gl_buf_gen, GLsizei n, GLuint *buffers) +LOAD(glBindBuffer, void, gl_buf_bind, GLenum target, GLuint buffer) +LOAD(glBufferData, void, gl_buf_data, GLenum target, GLsizeiptr size, const void *data, GLenum usage) +LOAD(glCreateShader, GLuint, gl_shdr_create, GLenum type) +LOAD(glDeleteShader, void, gl_shdr_del, GLuint shader) +LOAD(glShaderSource, void, gl_shdr_source, GLuint shader, GLsizei count, const char * const *string, const GLint *length) +LOAD(glCompileShader, void, gl_shdr_compile, GLuint shader) +LOAD(glGetShaderiv, void, gl_shdr_param, GLuint shader, GLenum pname, GLint *params) +LOAD(glGetShaderInfoLog, void, gl_shdr_infolog, GLuint shader, GLsizei size, GLsizei *len, char *data) +LOAD(glCreateProgram, GLuint, gl_prog_create, void) +LOAD(glDeleteProgram, void, gl_prog_del, GLuint program) +LOAD(glAttachShader, void, gl_prog_attachshdr, GLuint program, GLuint shader) +LOAD(glLinkProgram, void, gl_prog_link, GLuint program) +LOAD(glUseProgram, void, gl_prog_use, GLuint program) +LOAD(glGetProgramiv, void, gl_prog_param, GLuint prog, GLenum pname, GLint *params) +LOAD(glGetProgramInfoLog, void, gl_prog_infolog, GLuint prog, GLsizei size, GLsizei *len, char *data) +LOAD(glVertexAttribPointer, void, gl_va_define, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *data) +LOAD(glEnableVertexAttribArray, void, gl_va_enable, GLuint index) +LOAD(glDisableVertexAttribArray, void, gl_va_disable, GLuint index) +LOAD(glGenVertexArrays, void, gl_va_gen, GLsizei n, GLuint *arrays) +LOAD(glBindVertexArray, void, gl_va_bind, GLuint va) +LOAD(glDrawArrays, void, gl_draw_arrays, GLenum mode, GLint first, GLsizei count) +LOAD(glDrawElements, void, gl_draw_elems, GLenum mode, GLsizei count, GLenum type, const void *indices) +LOAD(glPolygonMode, void, gl_poly_mode, GLenum face, GLenum mode) + +divert(0)dnl -- cgit v1.2.3-54-g00ecf