From 0b35be65b43f88f0a17a6f8830a52415c3ff1aa1 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 23 Jan 2017 09:36:20 +0200 Subject: Split code a bit, wrangle OpenGL Split system function hooks into hooks.h Wrangle opengl functions instead of trying to use them directly. --- glwrangle.h | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 glwrangle.h (limited to 'glwrangle.h') 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; +} -- cgit v1.2.3