aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomasz Kramkowski <tk@the-tk.com>2018-03-26 21:27:00 +0100
committerTomasz Kramkowski <tk@the-tk.com>2018-03-26 21:28:37 +0100
commit604ae85b6e76befe96036d16c4e3096b966a03e0 (patch)
treeb6cf94126804d196c9631ac7a1da26891eb5d50f
parentca761a910c25197b10aeadcb0120dae132442d56 (diff)
downloadfaqe-604ae85b6e76befe96036d16c4e3096b966a03e0.tar.gz
faqe-604ae85b6e76befe96036d16c4e3096b966a03e0.tar.xz
faqe-604ae85b6e76befe96036d16c4e3096b966a03e0.zip
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.
-rw-r--r--Makefile7
-rw-r--r--loadgl.c100
-rw-r--r--loadgl.c.in48
-rw-r--r--loadgl.h56
-rw-r--r--loadgl.h.in27
-rw-r--r--loadgl.m452
6 files changed, 133 insertions, 157 deletions
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 <tk@the-tk.com>
- * SPDX-License-Identifier: MIT
- */
-#include <setjmp.h>
-
-#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 <tk@the-tk.com>
+ * SPDX-License-Identifier: MIT
+ */
+#include <setjmp.h>
+
+#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 <tk@the-tk.com>
- * 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 <tk@the-tk.com>
+ * 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 <tk@the-tk.com>
+# 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