1 /////////////////////////////////////////////////////////////////////////////
2 // Name: oglpfuncs.cpp
3 // Purpose: 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 #include "oglpfuncs.h"
11
12 // Apple defines everything on his own
13 #ifndef __APPLE__
14
15 #if defined(_WIN32) || defined(__WIN32__)
16 #ifndef WIN32_LEAN_AND_MEAN
17 // Reduce a bit header VC++ compilation time
18 #define WIN32_LEAN_AND_MEAN 1
19 #define LE_ME_ISDEF
20 #endif
21
22 /*
23 APIENTRY is defined in oglpfuncs.h as well as by windows.h. Undefine
24 it to prevent a macro redefinition warning.
25 */
26 #undef APIENTRY
27 #include <windows.h> //For wglGetProcAddress
28 #ifdef LE_ME_ISDEF
29 #undef WIN32_LEAN_AND_MEAN
30 #undef LE_ME_ISDEF
31 #endif
32 // Our macro
33 #define MyGetProcAddress(name) wglGetProcAddress((LPCSTR)name)
34 #else // Linux
35 // GLX_ARB_get_proc_address
36 // glXGetProcAddressARB is statically exported by all libGL implementations,
37 // while glXGetProcAddress may be not available.
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 extern void (*glXGetProcAddressARB(const GLubyte *procName))();
42 #ifdef __cplusplus
43 }
44 #endif
45 #define MyGetProcAddress(name) (*glXGetProcAddressARB)((const GLubyte*)name)
46 #endif
47
48 // The function to get the pointers
MyGetGLFuncAddress(const char * fname)49 void* MyGetGLFuncAddress(const char* fname)
50 {
51 void* pret = (void*) MyGetProcAddress(fname);
52
53 // Some drivers return -apart from 0-, -1, 1, 2 or 3
54 if ( pret == (void*)-1 || pret == (void*)1 || pret == (void*)2 || pret == (void*)3 )
55 pret = (void*)0;
56
57 return pret;
58 }
59
60 // Declare and initialize pointers
61 PFNGLACTIVETEXTUREPROC my_glActiveTexture = NULL;
62 PFNGLATTACHSHADERPROC my_glAttachShader = NULL;
63 PFNGLBINDATTRIBLOCATIONPROC my_glBindAttribLocation = NULL;
64 PFNGLBINDBUFFERPROC my_glBindBuffer = NULL;
65 PFNGLBINDVERTEXARRAYPROC my_glBindVertexArray = NULL;
66 PFNGLBUFFERDATAPROC my_glBufferData = NULL;
67 PFNGLBUFFERSUBDATAPROC my_glBufferSubData = NULL;
68 PFNGLCOMPILESHADERPROC my_glCompileShader = NULL;
69 PFNGLCREATEPROGRAMPROC my_glCreateProgram = NULL;
70 PFNGLCREATESHADERPROC my_glCreateShader = NULL;
71 PFNGLDELETEBUFFERSPROC my_glDeleteBuffers = NULL;
72 PFNGLDELETEPROGRAMPROC my_glDeleteProgram = NULL;
73 PFNGLDELETESHADERPROC my_glDeleteShader = NULL;
74 PFNGLDELETEVERTEXARRAYSPROC my_glDeleteVertexArrays = NULL;
75 PFNGLDETACHSHADERPROC my_glDetachShader = NULL;
76 PFNGLDISABLEVERTEXATTRIBARRAYPROC my_glDisableVertexAttribArray = NULL;
77 PFNGLENABLEVERTEXATTRIBARRAYPROC my_glEnableVertexAttribArray = NULL;
78 PFNGLGENBUFFERSPROC my_glGenBuffers = NULL;
79 PFNGLGENVERTEXARRAYSPROC my_glGenVertexArrays = NULL;
80 PFNGLGETPROGRAMINFOLOGPROC my_glGetProgramInfoLog = NULL;
81 PFNGLGETPROGRAMIVPROC my_glGetProgramiv = NULL;
82 PFNGLGETSHADERINFOLOGPROC my_glGetShaderInfoLog = NULL;
83 PFNGLGETSHADERIVPROC my_glGetShaderiv = NULL;
84 PFNGLGETUNIFORMLOCATIONPROC my_glGetUniformLocation = NULL;
85 PFNGLLINKPROGRAMPROC my_glLinkProgram = NULL;
86 PFNGLPROVOKINGVERTEXPROC my_glProvokingVertex = NULL;
87 PFNGLSHADERSOURCEPROC my_glShaderSource = NULL;
88 PFNGLUNIFORM1IPROC my_glUniform1i = NULL;
89 PFNGLUNIFORM3FVPROC my_glUniform3fv = NULL;
90 PFNGLUNIFORM4FVPROC my_glUniform4fv = NULL;
91 PFNGLUNIFORMMATRIX4FVPROC my_glUniformMatrix4fv = NULL;
92 PFNGLUSEPROGRAMPROC my_glUseProgram = NULL;
93 PFNGLVERTEXATTRIBPOINTERPROC my_glVertexAttribPointer = NULL;
94
95 #endif // __APPLE__
96
97 // Retrieve the pointers
98 #define GETANDTEST(type, name) \
99 my_ ## name = (type) MyGetGLFuncAddress(#name); \
100 if (name == 0) \
101 return false;
102
MyInitGLPointers()103 bool MyInitGLPointers()
104 {
105 #ifdef __APPLE__
106 return true;
107 #else
108 GETANDTEST(PFNGLACTIVETEXTUREPROC, glActiveTexture)
109 GETANDTEST(PFNGLATTACHSHADERPROC, glAttachShader)
110 GETANDTEST(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation)
111 GETANDTEST(PFNGLBINDBUFFERPROC, glBindBuffer)
112 GETANDTEST(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray)
113 GETANDTEST(PFNGLBUFFERDATAPROC, glBufferData)
114 GETANDTEST(PFNGLBUFFERSUBDATAPROC, glBufferSubData)
115 GETANDTEST(PFNGLCOMPILESHADERPROC, glCompileShader)
116 GETANDTEST(PFNGLCREATEPROGRAMPROC, glCreateProgram)
117 GETANDTEST(PFNGLCREATESHADERPROC, glCreateShader)
118 GETANDTEST(PFNGLDELETEBUFFERSPROC, glDeleteBuffers)
119 GETANDTEST(PFNGLDELETEPROGRAMPROC, glDeleteProgram)
120 GETANDTEST(PFNGLDELETESHADERPROC, glDeleteShader)
121 GETANDTEST(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays)
122 GETANDTEST(PFNGLDETACHSHADERPROC, glDetachShader)
123 GETANDTEST(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray)
124 GETANDTEST(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray)
125 GETANDTEST(PFNGLGENBUFFERSPROC, glGenBuffers)
126 GETANDTEST(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays)
127 GETANDTEST(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog)
128 GETANDTEST(PFNGLGETPROGRAMIVPROC, glGetProgramiv)
129 GETANDTEST(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog)
130 GETANDTEST(PFNGLGETSHADERIVPROC, glGetShaderiv)
131 GETANDTEST(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation)
132 GETANDTEST(PFNGLLINKPROGRAMPROC, glLinkProgram)
133 GETANDTEST(PFNGLPROVOKINGVERTEXPROC, glProvokingVertex)
134 GETANDTEST(PFNGLSHADERSOURCEPROC, glShaderSource)
135 GETANDTEST(PFNGLUNIFORM1IPROC, glUniform1i)
136 GETANDTEST(PFNGLUNIFORM3FVPROC, glUniform3fv)
137 GETANDTEST(PFNGLUNIFORM4FVPROC, glUniform4fv)
138 GETANDTEST(PFNGLUNIFORMMATRIX4FVPROC, glUniformMatrix4fv)
139 GETANDTEST(PFNGLUSEPROGRAMPROC, glUseProgram)
140 GETANDTEST(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer)
141
142 return true;
143 #endif
144 }
145