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