diff options
| author | Jari Vetoniemi <mailroxas@gmail.com> | 2017-01-23 09:36:20 +0200 | 
|---|---|---|
| committer | Jari Vetoniemi <mailroxas@gmail.com> | 2017-01-23 09:39:41 +0200 | 
| commit | 0b35be65b43f88f0a17a6f8830a52415c3ff1aa1 (patch) | |
| tree | 75fa9155be8443ae6050d456db9b4ce0f2c83022 /glwrangle.h | |
| parent | d69f53b735eec46a802e5ffaff9ee4dbc0ccb391 (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.h | 86 | 
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; +} | 
