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