Created
March 7, 2014 18:49
-
-
Save zeux/9417411 to your computer and use it in GitHub Desktop.
Yay for modern GL! Wait, what?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma comment(lib, "opengl32.lib") | |
#include "glew.c" | |
template <typename T, typename U> static void patchUnsafe(T& t, U& u) | |
{ | |
if (!t && u) | |
t = reinterpret_cast<T>(u); | |
} | |
template <typename T> static void patch(T& t, T& u) | |
{ | |
if (!t && u) | |
t = u; | |
} | |
void glewInitRBX() | |
{ | |
#define P_APPLE(name) patch(name, name##APPLE) | |
#define P_EXT(name) patch(name, name##EXT) | |
#define P_ARB(name) patch(name, name##ARB) | |
glewInit(); | |
// APPLE_vertex_array_object is the same as ARB_vertex_array_object | |
P_APPLE(glBindVertexArray); | |
P_APPLE(glDeleteVertexArrays); | |
patchUnsafe(glGenVertexArrays, glGenVertexArraysAPPLE); // glGenVertexArraysAPPLE has a const-correctness bug | |
P_APPLE(glIsVertexArray); | |
P_APPLE(glBindVertexArray); | |
// EXT_framebuffer_object is the same as ARB_framebuffer_object | |
P_EXT(glBindFramebuffer); | |
P_EXT(glBindRenderbuffer); | |
P_EXT(glCheckFramebufferStatus); | |
P_EXT(glDeleteFramebuffers); | |
P_EXT(glDeleteRenderbuffers); | |
P_EXT(glFramebufferRenderbuffer); | |
P_EXT(glFramebufferTexture1D); | |
P_EXT(glFramebufferTexture2D); | |
P_EXT(glFramebufferTexture3D); | |
P_EXT(glGenFramebuffers); | |
P_EXT(glGenRenderbuffers); | |
P_EXT(glGenerateMipmap); | |
P_EXT(glGetFramebufferAttachmentParameteriv); | |
P_EXT(glGetRenderbufferParameteriv); | |
P_EXT(glIsFramebuffer); | |
P_EXT(glIsRenderbuffer); | |
P_EXT(glRenderbufferStorage); | |
// EXT_texture3D is the same as core GL but the EXT API uses GLenum internalFormat instead of GLint | |
patchUnsafe(glTexImage3D, glTexImage3DEXT); | |
P_EXT(glTexSubImage3D); | |
// ARB_texture_compression is the same as core GL | |
P_ARB(glCompressedTexImage1D); | |
P_ARB(glCompressedTexImage2D); | |
P_ARB(glCompressedTexImage3D); | |
P_ARB(glCompressedTexSubImage1D); | |
P_ARB(glCompressedTexSubImage2D); | |
P_ARB(glCompressedTexSubImage3D); | |
P_ARB(glGetCompressedTexImage); | |
// ARB_shader_objects is roughly the same as core GL | |
patch(glAttachShader, glAttachObjectARB); | |
P_ARB(glCompileShader); | |
patch(glCreateProgram, glCreateProgramObjectARB); | |
patch(glCreateShader, glCreateShaderObjectARB); | |
patch(glDeleteProgram, glDeleteObjectARB); | |
patch(glDeleteShader, glDeleteObjectARB); | |
patch(glDetachShader, glDetachObjectARB); | |
P_ARB(glGetActiveUniform); | |
patch(glGetAttachedShaders, glGetAttachedObjectsARB); | |
patch(glGetShaderInfoLog, glGetInfoLogARB); | |
patch(glGetProgramInfoLog, glGetInfoLogARB); | |
patch(glGetShaderiv, glGetObjectParameterivARB); | |
patch(glGetProgramiv, glGetObjectParameterivARB); | |
P_ARB(glGetShaderSource); | |
P_ARB(glGetUniformLocation); | |
P_ARB(glGetUniformfv); | |
P_ARB(glGetUniformiv); | |
P_ARB(glLinkProgram); | |
P_ARB(glShaderSource); | |
P_ARB(glUniform1f); | |
P_ARB(glUniform1fv); | |
P_ARB(glUniform1i); | |
P_ARB(glUniform1iv); | |
P_ARB(glUniform2f); | |
P_ARB(glUniform2fv); | |
P_ARB(glUniform2i); | |
P_ARB(glUniform2iv); | |
P_ARB(glUniform3f); | |
P_ARB(glUniform3fv); | |
P_ARB(glUniform3i); | |
P_ARB(glUniform3iv); | |
P_ARB(glUniform4f); | |
P_ARB(glUniform4fv); | |
P_ARB(glUniform4i); | |
P_ARB(glUniform4iv); | |
P_ARB(glUniformMatrix2fv); | |
P_ARB(glUniformMatrix3fv); | |
P_ARB(glUniformMatrix4fv); | |
patch(glUseProgram, glUseProgramObjectARB); | |
P_ARB(glValidateProgram); | |
#undef P_ARB | |
#undef P_EXT | |
#undef P_APPLE | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment