#ifdef _WIN32 typedef __int64 GLintptr; #else typedef intptr_t GLintptr; #endif typedef void GLvoid; typedef unsigned char GLboolean; typedef unsigned char GLubyte; typedef char GLchar; typedef int GLint; typedef int GLsizei; typedef unsigned int GLenum; typedef unsigned int GLuint; typedef unsigned int GLbitfield; typedef float GLfloat; typedef double GLdouble; typedef unsigned long long GLsizeiptr; #define GL_NO_ERROR 0 #define GL_INFO_LOG_LENGTH 0x8b84 #define GL_ZERO 0x0000 #define GL_ONE 0x0001 #define GL_ALPHA 0x1906 #define GL_BLEND 0x0be2 #define GL_CLAMP_TO_EDGE 0x812f #define GL_COLOR_BUFFER_BIT 0x4000 #define GL_COMPILE_STATUS 0x8b81 #define GL_DEPTH_TEST 0x0b71 #define GL_FRAMEBUFFER_SRGB 0x8db9 #define GL_FRAGMENT_SHADER 0x8b30 #define GL_LINK_STATUS 0x8b82 #define GL_MODELVIEW 0x1700 #define GL_NEAREST 0x2600 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 #define GL_PROJECTION 0x1701 #define GL_QUADS 0x0007 #define GL_RGBA 0x1908 #define GL_RGBA8 0x8058 #define GL_SCISSOR_TEST 0x0c11 #define GL_SRGB8_ALPHA8 0x8c43 #define GL_SRC_ALPHA 0x0302 #define GL_TEXTURE0 0x84c0 #define GL_TEXTURE_2D 0x0de1 #define GL_TEXTURE_COORD_ARRAY 0x8078 #define GL_TEXTURE_MAG_FILTER 0x2800 #define GL_TEXTURE_MIN_FILTER 0x2801 #define GL_TEXTURE_WRAP_S 0x2802 #define GL_TEXTURE_WRAP_T 0x2803 #define GL_UNSIGNED_BYTE 0x1401 #define GL_UNSIGNED_INT_8_8_8_8 0x8035 #define GL_VERTEX_SHADER 0x8b31 #define GL_ARRAY_BUFFER 0x8892 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 #define GL_STATIC_DRAW 0x88e4 #define GL_FLOAT 0x1406 #define GL_FALSE 0 #define GL_TRUE 1 #define GL_LINEAR 0x2601 #define GL_FUNC_ADD 0x8006 #define GL_CULL_FACE 0x0b44 #define GL_STREAM_DRAW 0x88e0 #define GL_WRITE_ONLY 0x88b9 #define GL_TRIANGLES 0x0004 #define GL_UNSIGNED_INT 0x1405 #define GL_UNSIGNED_SHORT 0x1403 #define GL_MULTISAMPLE 0x809d #define GL_DYNAMIC_DRAW 0x88e8 #define GL_RED 0x1903 #define GL_FRAMEBUFFER_WIDTH 0x9310 #define GL_FRAMEBUFFER_HEIGHT 0x9311 #define GL_VIEWPORT 0x0ba2 #define GL_PIXEL_UNPACK_BUFFER 0x88ec #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88ef #define GL_VERTEX_ARRAY_BINDING 0x85b5 #define GL_ARRAY_BUFFER_BINDING 0x8894 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 #define GL_CURRENT_PROGRAM 0x8b8d #define GL_TEXTURE_BINDING_2D 0x8069 #define GL_LINEAR_MIPMAP_LINEAR 0x2703 #define GL_SRGB_ALPHA 0x8c43 #define GL_UNPACK_ROW_LENGTH 0x0cf2 #define GL_UNPACK_SKIP_PIXELS 0x0cf4 #define GL_UNPACK_SKIP_ROWS 0x0cf3 #define GL_TRIANGLE_STRIP 0x0005 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8646 #define DECLARE_GL_FUNCTION(Name, ReturnType, ...) typedef ReturnType (*type_##Name)(__VA_ARGS__); #define DECLARE_GLOBAL_FUNCTION(Name, ...) type_##Name Name; #define GL_FUNCTIONS(X) \ X(glActiveTexture, void, GLenum texture) \ X(glAttachShader, void, GLuint program, GLuint shader) \ X(glBindBuffer, void, GLenum target, GLuint buffer) \ X(glBindTexture, void, GLenum target, GLuint texture) \ X(glBufferData, void, GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) \ X(glClear, void, GLbitfield mask) \ X(glClearColor, void, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) \ X(glCompileShader, void, GLuint shader) \ X(glCreateProgram, GLuint) \ X(glCreateShader, GLuint, GLenum type) \ X(glDeleteShader, void, GLuint shader) \ X(glDrawElements, void, GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) \ X(glEnableVertexAttribArray, void, GLuint index) \ X(glGenBuffers, void, GLsizei n, GLuint *buffers) \ X(glGenTextures, void, GLsizei n, GLuint *textures) \ X(glGetShaderInfoLog, void, GLuint shader, GLsizei maxLength, GLsizei *length, GLchar *infoLog) \ X(glGetShaderiv, void, GLuint shader, GLenum pname, GLint *params) \ X(glGetUniformLocation, GLint, GLuint program, const GLchar *name) \ X(glLinkProgram, void, GLuint program) \ X(glShaderSource, void, GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length) \ X(glTexImage2D, void, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) \ X(glTexParameteri, void, GLenum target, GLenum pname, GLint param) \ X(glTexSubImage2D, void, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) \ X(glUniform1f, void, GLint location, GLfloat v0) \ X(glUniform1i, void, GLint location, GLint v0) \ X(glUniform2f, void, GLint location, GLfloat v0, GLfloat v1) \ X(glUniform4f, void, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) \ X(glUseProgram, void, GLuint program) \ X(glVertexAttribPointer, void, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer) \ X(glViewport, void, GLint x, GLint y, GLsizei width, GLsizei height) \ X(glDeleteProgram, void, GLuint program) \ X(glDeleteBuffers, void, GLsizei n, const GLuint *buffers) \ X(glDeleteTextures, void, GLsizei n, const GLuint *textures) \ X(glEnable, void, GLenum cap) \ X(glGenerateMipmap, void, GLenum target) \ X(glGetProgramiv, void, GLuint program, GLenum pname, GLint *params) \ X(glGetAttribLocation, GLint, GLuint program, const GLchar *name) \ X(glDetachShader, void, GLuint program, GLuint shader) \ X(glUniformMatrix4fv, void, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) \ X(glMapBuffer, void*, GLenum target, GLenum access) \ X(glUnmapBuffer, GLboolean, GLenum target) \ X(glBlendEquation, void, GLenum mode) \ X(glBlendFunc, void, GLenum sfactor, GLenum dfactor) \ X(glDisable, void, GLenum cap) \ X(glScissor, void, GLint x, GLint y, GLsizei width, GLsizei height) \ X(glTexCoord2f, void, GLfloat s, GLfloat t) \ X(glVertex2f, void, GLfloat x, GLfloat y) \ X(glGetError, GLenum) \ X(glGetProgramInfoLog, void, GLuint program, GLsizei maxLength, GLsizei *length, GLchar *infoLog) \ X(glGenVertexArrays, void, GLsizei n, GLuint *arrays) \ X(glBindVertexArray, void, GLuint array) \ X(glDeleteVertexArrays, void, GLsizei n, const GLuint *arrays) \ X(glDrawArrays, void, GLenum mode, GLint first, GLsizei count) \ X(glBufferSubData, void, GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data) \ X(glDisableVertexAttribArray, void, GLuint index) \ X(glGetIntegerv, void, GLenum pname, GLint *data) \ X(glBindAttribLocation, void, GLuint program, GLuint index, const GLchar *name) \ X(glGetUniformfv, void, GLuint program, GLint location, GLfloat *params) \ X(glPixelStorei, void, GLenum pname, GLint param) \ X(glGetVertexAttribiv, void, GLuint index, GLenum pname, GLint *params) \ X(glFinish, void) GL_FUNCTIONS(DECLARE_GL_FUNCTION) GL_FUNCTIONS(DECLARE_GLOBAL_FUNCTION) #if defined(_WIN32) static void *get_any_gl_address(const char *name) { void *p = (void *)wglGetProcAddress(name); if(!p) { HMODULE module = LoadLibraryA("opengl32.dll"); if(module) { p = (void *)GetProcAddress(module, name); } } return p; } #define GetOpenGLFunction(Name, ...) \ *(void **)&Name = (void *)get_any_gl_address(#Name); \ if(!Name) { \ DEBUG_PRINT("Failed to load OpenGL function: %s\n", #Name); \ exit(EXIT_FAILURE); \ } #elif defined(__linux__) #include static void *glXGetProcAddress(const GLubyte *procName) { static void *(*glxGetProcAddress)(const GLubyte *); if(!glxGetProcAddress) { void *libGL = dlopen("libGL.so.1", RTLD_LAZY | RTLD_GLOBAL); if(!libGL) { DEBUG_PRINT("Error: Unable to load libGL.so.1\n"); exit(EXIT_FAILURE); } glxGetProcAddress = dlsym(libGL, "glXGetProcAddress"); if(!glxGetProcAddress) { DEBUG_PRINT("Error: Unable to find glXGetProcAddress\n"); exit(EXIT_FAILURE); } } return glxGetProcAddress(procName); } #define GetOpenGLFunction(Name, ...) \ *(void **)&Name = (void *)glXGetProcAddress((const GLubyte *)#Name); \ if(!Name) { \ DEBUG_PRINT("Failed to load OpenGL function: %s\n", #Name); \ exit(EXIT_FAILURE); \ } #endif __attribute__((cold, noinline, section(".init_section"))) static void gl_loader() { GL_FUNCTIONS(GetOpenGLFunction); };