summaryrefslogtreecommitdiff
path: root/glwrangle.h
diff options
context:
space:
mode:
authorJari Vetoniemi <mailroxas@gmail.com>2017-01-23 09:36:20 +0200
committerJari Vetoniemi <mailroxas@gmail.com>2017-01-23 09:39:41 +0200
commit0b35be65b43f88f0a17a6f8830a52415c3ff1aa1 (patch)
tree75fa9155be8443ae6050d456db9b4ce0f2c83022 /glwrangle.h
parentd69f53b735eec46a802e5ffaff9ee4dbc0ccb391 (diff)
Split code a bit, wrangle OpenGL
Split system function hooks into hooks.h Wrangle opengl functions instead of trying to use them directly.
Diffstat (limited to 'glwrangle.h')
-rw-r--r--glwrangle.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/glwrangle.h b/glwrangle.h
new file mode 100644
index 0000000..f6b2555
--- /dev/null
+++ b/glwrangle.h
@@ -0,0 +1,86 @@
+#pragma once
+
+static GLenum (*_glGetError)(void);
+static void (*_glGetIntegerv)(GLenum, GLint*);
+static GLboolean (*_glIsBuffer)(GLuint);
+static void (*_glGenBuffers)(GLsizei, GLuint*);
+static void (*_glDeleteBuffers)(GLsizei, GLuint*);
+static void (*_glBindBuffer)(GLenum, GLuint);
+static void (*_glBufferData)(GLenum, GLsizeiptr, const GLvoid*, GLenum);
+static void* (*_glMapBuffer)(GLenum, GLenum);
+static void (*_glUnmapBuffer)(GLenum);
+static void (*_glPixelStorei)(GLenum, GLint);
+static void (*_glReadPixels)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, GLvoid*);
+static void (*_glPushClientAttrib)(GLbitfield);
+static void (*_glPopClientAttrib)(void);
+static void (*_glPushAttrib)(GLbitfield);
+static void (*_glPopAttrib)(void);
+static void (*_glEnable)(GLenum);
+static void (*_glDisable)(GLenum);
+static void (*_glScissor)(GLint, GLint, GLsizei, GLsizei);
+static void (*_glClearColor)(GLclampf, GLclampf, GLclampf, GLclampf);
+static void (*_glClear)(GLbitfield);
+
+#define glGetError _glGetError
+#define glGetIntegerv _glGetIntegerv
+#define glIsBuffer _glIsBuffer
+#define glGenBuffers _glGenBuffers
+#define glDeleteBuffers _glDeleteBuffers
+#define glBindBuffer _glBindBuffer
+#define glBufferData _glBufferData
+#define glMapBuffer _glMapBuffer
+#define glUnmapBuffer _glUnmapBuffer
+#define glPixelStorei _glPixelStorei
+#define glReadPixels _glReadPixels
+#define glPushClientAttrib _glPushClientAttrib
+#define glPopClientAttrib _glPopClientAttrib
+#define glPushAttrib _glPushAttrib
+#define glPopAttrib _glPopAttrib
+#define glEnable _glEnable
+#define glDisable _glDisable
+#define glScissor _glScissor
+#define glClearColor _glClearColor
+#define glClear _glClear
+
+static void
+load_gl_function_pointers(void* (*procs[])(const char*), const size_t memb)
+{
+ static bool loaded;
+
+ if (loaded)
+ return;
+
+ void* (*proc)(const char*);
+ for (size_t i = 0; i < memb; ++i) {
+ if ((proc = procs[i]))
+ break;
+ }
+
+ if (!proc)
+ ERRX(EXIT_FAILURE, "There is no proc loader available");
+
+#define GL(x) do { if (!(_##x = proc(#x))) { ERRX(EXIT_FAILURE, "Failed to load %s", #x); } } while (0)
+ GL(glGetError);
+ GL(glGetIntegerv);
+ GL(glIsBuffer);
+ GL(glGenBuffers);
+ GL(glDeleteBuffers);
+ GL(glBindBuffer);
+ GL(glBufferData);
+ GL(glMapBuffer);
+ GL(glUnmapBuffer);
+ GL(glPixelStorei);
+ GL(glReadPixels);
+ GL(glPushClientAttrib);
+ GL(glPopClientAttrib);
+ GL(glPushAttrib);
+ GL(glPopAttrib);
+ GL(glEnable);
+ GL(glDisable);
+ GL(glScissor);
+ GL(glClearColor);
+ GL(glClear);
+#undef GL
+
+ loaded = true;
+}