Skip to content

Instantly share code, notes, and snippets.

@zeux
Created March 7, 2014 18:49
Show Gist options
  • Save zeux/9417411 to your computer and use it in GitHub Desktop.
Save zeux/9417411 to your computer and use it in GitHub Desktop.
Yay for modern GL! Wait, what?
#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