1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: oglpfuncs.h 3 // Purpose: Types, constants, and pointers to OpenGL functions 4 // Author: Manuel Martin 5 // Created: 2015/11/16 6 // Copyright: (c) 2015 Manuel Martin 7 // Licence: wxWindows licence 8 ///////////////////////////////////////////////////////////////////////////// 9 10 #ifndef OGLPFUNCS_H 11 #define OGLPFUNCS_H 12 13 /* What is this file for? 14 You would expect the OS to provide constants and functions used in OpenGL. 15 That was so up to OGL version 1.1; you just needed to include 'gl.h'. But for 16 newer versions things are not so simple. Constants and function prototypes (well, 17 typedefs for their pointers) are included in 'glext.h', a file provided by the 18 OpenGL Registry, and 'glcorearb.h' (also from OGL, only Core Profile definitions). 19 The functions "live" in the graphics card driver, and they are used through their 20 pointers. 21 The reason of this file is to retrieve those pointers, and also to define the 22 types, constants, and functions used in this sample, so as to avoid the inclusion 23 of glext.h, which is a very big file. 24 25 In the OpenGL Registry we can find also glxext.h and wglext.h (MSW/UXs versions). 26 These files are used for "extensions", or functions provided by GPU vendors instead 27 of the OpenGL Consortium. This sample doesn't use them. 28 29 OK, there are some good libraries to do this job (GLEW, GL3W, etc). Why do we 30 reinvent the wheel? Just because for this sample we need a small subset, and not 31 all of thousands of lines of code that those libraries consist of. 32 */ 33 34 /* 35 ** Copyright (c) 2013-2015 The Khronos Group Inc. 36 ** 37 ** Permission is hereby granted, free of charge, to any person obtaining a 38 ** copy of this software and/or associated documentation files (the 39 ** "Materials"), to deal in the Materials without restriction, including 40 ** without limitation the rights to use, copy, modify, merge, publish, 41 ** distribute, sublicense, and/or sell copies of the Materials, and to 42 ** permit persons to whom the Materials are furnished to do so, subject to 43 ** the following conditions: 44 ** 45 ** The above copyright notice and this permission notice shall be included 46 ** in all copies or substantial portions of the Materials. 47 ** 48 ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 49 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 50 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 51 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 52 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 53 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 54 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. 55 */ 56 57 #if defined(__gl_h_) || defined(__GL_H__) || defined(_GL_H) || defined(__X_GL_H) 58 #error gl.h included before oglpfuncs.h 59 #endif 60 61 // Apple defines everything on his own 62 #ifdef __APPLE__ 63 // Suppress warnings when including gl3.h 64 #define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED 65 #include <OpenGL/gl3.h> // For Core Profile 66 #else 67 // The rest of the world needs the rest of this file 68 69 // Avoid gl.h definitions, may clash with our own definitions 70 #define __gl_h_ 71 #define __GL_H__ 72 #define _GL_H 73 #define __X_GL_H 74 75 // APIENTRY and GLAPI definitions 76 #if defined(_WIN32) || defined(__WIN32__) 77 // MS Windows needs APIENTRY. 78 #ifndef APIENTRY 79 #define APIENTRY __stdcall 80 #endif 81 82 #ifndef GLAPI 83 #if defined(_MSC_VER) //VC++ 84 #define GLAPI __declspec(dllimport) 85 #else 86 #define GLAPI extern 87 #endif 88 #endif 89 #endif // _WIN32 / __WIN32__ 90 91 // Other platforms are simpler 92 #ifndef APIENTRY 93 #define APIENTRY 94 #endif 95 #ifndef GLAPI 96 #define GLAPI extern 97 #endif 98 99 // For ptrdiff_t 100 #include <stddef.h> 101 102 103 #ifdef __cplusplus 104 extern "C" { 105 #endif 106 107 // GL types 108 typedef void GLvoid; 109 typedef unsigned char GLubyte; 110 typedef char GLchar; 111 typedef unsigned char GLboolean; 112 typedef unsigned short GLushort; 113 typedef int GLint; 114 typedef int GLsizei; 115 typedef unsigned int GLenum; 116 typedef unsigned int GLuint; 117 typedef unsigned int GLbitfield; 118 typedef float GLfloat; 119 typedef ptrdiff_t GLsizeiptr; 120 typedef ptrdiff_t GLintptr; 121 122 // Constants 123 #define GL_ARRAY_BUFFER 0x8892 124 #define GL_BLEND 0x0BE2 125 #define GL_CLAMP_TO_EDGE 0x812F 126 #define GL_COLOR_BUFFER_BIT 0x00004000 127 #define GL_COMPILE_STATUS 0x8B81 128 #define GL_DEPTH_BUFFER_BIT 0x00000100 129 #define GL_DEPTH_TEST 0x0B71 130 #define GL_ELEMENT_ARRAY_BUFFER 0x8893 131 #define GL_FALSE 0 132 #define GL_FIRST_VERTEX_CONVENTION 0x8E4D 133 #define GL_FLOAT 0x1406 134 #define GL_FRAGMENT_SHADER 0x8B30 135 #define GL_INFO_LOG_LENGTH 0x8B84 136 #define GL_LEQUAL 0x0203 137 #define GL_LINK_STATUS 0x8B82 138 #define GL_LINEAR 0x2601 139 #define GL_NO_ERROR 0 140 #define GL_ONE_MINUS_SRC_ALPHA 0x0303 141 #define GL_RENDERER 0x1F01 142 #define GL_RGBA 0x1908 143 #define GL_SRC_ALPHA 0x0302 144 #define GL_STATIC_DRAW 0x88E4 145 #define GL_TEXTURE0 0x84C0 146 #define GL_TEXTURE_2D 0x0DE1 147 #define GL_TEXTURE_BASE_LEVEL 0x813C 148 #define GL_TEXTURE_MAX_LEVEL 0x813D 149 #define GL_TEXTURE_MAG_FILTER 0x2800 150 #define GL_TEXTURE_MIN_FILTER 0x2801 151 #define GL_TEXTURE_WRAP_S 0x2802 152 #define GL_TEXTURE_WRAP_T 0x2803 153 #define GL_TRIANGLE_STRIP 0x0005 154 #define GL_UNSIGNED_BYTE 0x1401 155 #define GL_UNSIGNED_SHORT 0x1403 156 #define GL_VENDOR 0x1F00 157 #define GL_VERSION 0x1F02 158 #define GL_VERTEX_SHADER 0x8B31 159 160 // This functions exist since OpenGL 1.1, and they don't need typedefs nor pointers. 161 // Trying to retrieve their pointers with wglGetProcAddress() will fail. 162 GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); 163 GLAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); 164 GLAPI void APIENTRY glClear (GLbitfield mask); 165 GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); 166 GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); 167 GLAPI void APIENTRY glDepthFunc (GLenum func); 168 GLAPI void APIENTRY glDisable (GLenum cap); 169 GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); 170 GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); 171 GLAPI void APIENTRY glEnable (GLenum cap); 172 GLAPI void APIENTRY glFinish (void); 173 GLAPI void APIENTRY glFlush (void); 174 GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); 175 GLAPI GLenum APIENTRY glGetError (void); 176 GLAPI const GLubyte* APIENTRY glGetString (GLenum name); 177 GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); 178 GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); 179 GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); 180 181 // Typedefs for functions for OpenGL > 1.1 182 typedef void (APIENTRY* PFNGLACTIVETEXTUREPROC) (GLenum texture); 183 typedef void (APIENTRY* PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); 184 typedef void (APIENTRY* PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); 185 typedef void (APIENTRY* PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); 186 typedef void (APIENTRY* PFNGLBINDVERTEXARRAYPROC) (GLuint array); 187 typedef void (APIENTRY* PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); 188 typedef void (APIENTRY* PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); 189 typedef void (APIENTRY* PFNGLCOMPILESHADERPROC) (GLuint shader); 190 typedef GLuint (APIENTRY* PFNGLCREATEPROGRAMPROC) (void); 191 typedef GLuint (APIENTRY* PFNGLCREATESHADERPROC) (GLenum type); 192 typedef void (APIENTRY* PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); 193 typedef void (APIENTRY* PFNGLDELETEPROGRAMPROC) (GLuint program); 194 typedef void (APIENTRY* PFNGLDELETESHADERPROC) (GLuint shader); 195 typedef void (APIENTRY* PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); 196 typedef void (APIENTRY* PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); 197 typedef void (APIENTRY* PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); 198 typedef void (APIENTRY* PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); 199 typedef void (APIENTRY* PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); 200 typedef void (APIENTRY* PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); 201 typedef void (APIENTRY* PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); 202 typedef void (APIENTRY* PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); 203 typedef void (APIENTRY* PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); 204 typedef void (APIENTRY* PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); 205 typedef GLint (APIENTRY* PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); 206 typedef void (APIENTRY* PFNGLLINKPROGRAMPROC) (GLuint program); 207 typedef void (APIENTRY* PFNGLPROVOKINGVERTEXPROC) (GLenum mode); 208 typedef void (APIENTRY* PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); 209 typedef void (APIENTRY* PFNGLUNIFORM1IPROC) (GLint location, GLint v0); 210 typedef void (APIENTRY* PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); 211 typedef void (APIENTRY* PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); 212 typedef void (APIENTRY* PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); 213 typedef void (APIENTRY* PFNGLUSEPROGRAMPROC) (GLuint program); 214 typedef void (APIENTRY* PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); 215 216 // Pointers to functions 217 // NOTE: 218 // For each glFunction we use a pointer name which is not the name of the function. 219 // This is needed in some Linux [old] drivers, which define also these function 220 // names, leading to a crash because of function vs pointer use. 221 222 #define glActiveTexture my_glActiveTexture 223 #define glAttachShader my_glAttachShader 224 #define glBindAttribLocation my_glBindAttribLocation 225 #define glBindBuffer my_glBindBuffer 226 #define glBindVertexArray my_glBindVertexArray 227 #define glBufferData my_glBufferData 228 #define glBufferSubData my_glBufferSubData 229 #define glCompileShader my_glCompileShader 230 #define glCreateProgram my_glCreateProgram 231 #define glCreateShader my_glCreateShader 232 #define glDeleteBuffers my_glDeleteBuffers 233 #define glDeleteProgram my_glDeleteProgram 234 #define glDeleteShader my_glDeleteShader 235 #define glDeleteVertexArrays my_glDeleteVertexArrays 236 #define glDetachShader my_glDetachShader 237 #define glDisableVertexAttribArray my_glDisableVertexAttribArray 238 #define glEnableVertexAttribArray my_glEnableVertexAttribArray 239 #define glGenBuffers my_glGenBuffers 240 #define glGenVertexArrays my_glGenVertexArrays 241 #define glGetProgramInfoLog my_glGetProgramInfoLog 242 #define glGetProgramiv my_glGetProgramiv 243 #define glGetShaderInfoLog my_glGetShaderInfoLog 244 #define glGetShaderiv my_glGetShaderiv 245 #define glGetUniformLocation my_glGetUniformLocation 246 #define glLinkProgram my_glLinkProgram 247 #define glProvokingVertex my_glProvokingVertex 248 #define glShaderSource my_glShaderSource 249 #define glUniform1i my_glUniform1i 250 #define glUniform3fv my_glUniform3fv 251 #define glUniform4fv my_glUniform4fv 252 #define glUniformMatrix4fv my_glUniformMatrix4fv 253 #define glUseProgram my_glUseProgram 254 #define glVertexAttribPointer my_glVertexAttribPointer 255 256 // NOTE: 257 // Windows uses different pointers for different OGLcontexts. 258 // If multi-context was used, these pointers must be used inside some 259 // structure, something like activeOGLcontext->my_glTheFunction 260 261 extern PFNGLACTIVETEXTUREPROC my_glActiveTexture; 262 extern PFNGLATTACHSHADERPROC my_glAttachShader; 263 extern PFNGLBINDATTRIBLOCATIONPROC my_glBindAttribLocation; 264 extern PFNGLBINDBUFFERPROC my_glBindBuffer; 265 extern PFNGLBINDVERTEXARRAYPROC my_glBindVertexArray; 266 extern PFNGLBUFFERDATAPROC my_glBufferData; 267 extern PFNGLBUFFERSUBDATAPROC my_glBufferSubData; 268 extern PFNGLCOMPILESHADERPROC my_glCompileShader; 269 extern PFNGLCREATEPROGRAMPROC my_glCreateProgram; 270 extern PFNGLCREATESHADERPROC my_glCreateShader; 271 extern PFNGLDELETEBUFFERSPROC my_glDeleteBuffers; 272 extern PFNGLDELETEPROGRAMPROC my_glDeleteProgram; 273 extern PFNGLDELETESHADERPROC my_glDeleteShader; 274 extern PFNGLDELETEVERTEXARRAYSPROC my_glDeleteVertexArrays; 275 extern PFNGLDETACHSHADERPROC my_glDetachShader; 276 extern PFNGLDISABLEVERTEXATTRIBARRAYPROC my_glDisableVertexAttribArray; 277 extern PFNGLENABLEVERTEXATTRIBARRAYPROC my_glEnableVertexAttribArray; 278 extern PFNGLGENBUFFERSPROC my_glGenBuffers; 279 extern PFNGLGENVERTEXARRAYSPROC my_glGenVertexArrays; 280 extern PFNGLGETPROGRAMINFOLOGPROC my_glGetProgramInfoLog; 281 extern PFNGLGETPROGRAMIVPROC my_glGetProgramiv; 282 extern PFNGLGETSHADERINFOLOGPROC my_glGetShaderInfoLog; 283 extern PFNGLGETSHADERIVPROC my_glGetShaderiv; 284 extern PFNGLGETUNIFORMLOCATIONPROC my_glGetUniformLocation; 285 extern PFNGLLINKPROGRAMPROC my_glLinkProgram; 286 extern PFNGLPROVOKINGVERTEXPROC my_glProvokingVertex; 287 extern PFNGLSHADERSOURCEPROC my_glShaderSource; 288 extern PFNGLUNIFORM1IPROC my_glUniform1i; 289 extern PFNGLUNIFORM3FVPROC my_glUniform3fv; 290 extern PFNGLUNIFORM4FVPROC my_glUniform4fv; 291 extern PFNGLUNIFORMMATRIX4FVPROC my_glUniformMatrix4fv; 292 extern PFNGLUSEPROGRAMPROC my_glUseProgram; 293 extern PFNGLVERTEXATTRIBPOINTERPROC my_glVertexAttribPointer; 294 295 #ifdef __cplusplus 296 } 297 #endif 298 299 #endif // __APPLE__ and rest 300 301 // This is the function to use in oglstuff.cpp 302 bool MyInitGLPointers(); 303 304 #endif // OGLPFUNCS_H 305