-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathopengl_loading.c
90 lines (75 loc) · 2.76 KB
/
opengl_loading.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "opengl_loading.h"
#include <windows.h>
PFNGLVIEWPORTPROC glViewport;
PFNGLCREATESHADERPROC glCreateShader;
PFNGLSHADERSOURCEPROC glShaderSource;
PFNGLCOMPILESHADERPROC glCompileShader;
PFNGLGETSHADERIVPROC glGetShaderiv;
PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
PFNGLCREATEPROGRAMPROC glCreateProgram;
PFNGLATTACHSHADERPROC glAttachShader;
PFNGLLINKPROGRAMPROC glLinkProgram;
PFNGLGETPROGRAMIVPROC glGetProgramiv;
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
PFNGLUSEPROGRAMPROC glUseProgram;
PFNGLCLEARBUFFERFVPROC glClearBufferfv;
PFNGLDRAWARRAYSPROC glDrawArrays;
PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv;
PFNGLPOINTSIZEPROC glPointSize;
PFNGLGETINTEGERVPROC glGetIntegerv;
PFNGLGETERRORPROC glGetError;
PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;
PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB;
#define LoadFunc(T, val) val = (T)GetAnyGLFuncAddress(#val)
static void*
GetAnyGLFuncAddress(const char *name)
{
void *p = (void *)wglGetProcAddress(name);
if(p == 0 ||
(p == (void*)0x1) || (p == (void*)0x2) || (p == (void*)0x3) ||
(p == (void*)-1)) {
static HMODULE module = NULL;
if (!module)
module = LoadLibraryW(L"opengl32.dll");
p = (void*)GetProcAddress(module, name);
}
return p;
}
void
glloading_prev_init()
{
LoadFunc(PFNWGLCREATECONTEXTATTRIBSARBPROC, wglCreateContextAttribsARB);
LoadFunc(PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB);
}
void
glloading_init()
{
LoadFunc(PFNGLVIEWPORTPROC, glViewport);
LoadFunc(PFNGLCREATESHADERPROC, glCreateShader);
LoadFunc(PFNGLSHADERSOURCEPROC, glShaderSource);
LoadFunc(PFNGLCOMPILESHADERPROC, glCompileShader);
LoadFunc(PFNGLGETSHADERIVPROC, glGetShaderiv);
LoadFunc(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog);
LoadFunc(PFNGLCREATEPROGRAMPROC, glCreateProgram);
LoadFunc(PFNGLATTACHSHADERPROC, glAttachShader);
LoadFunc(PFNGLLINKPROGRAMPROC, glLinkProgram);
LoadFunc(PFNGLGETPROGRAMIVPROC, glGetProgramiv);
LoadFunc(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog);
LoadFunc(PFNGLUSEPROGRAMPROC, glUseProgram);
LoadFunc(PFNGLCLEARBUFFERFVPROC, glClearBufferfv);
LoadFunc(PFNGLDRAWARRAYSPROC, glDrawArrays);
LoadFunc(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays);
LoadFunc(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray);
LoadFunc(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays);
LoadFunc(PFNGLVERTEXATTRIB4FVPROC, glVertexAttrib4fv);
LoadFunc(PFNGLGETINTEGERVPROC, glGetIntegerv);
LoadFunc(PFNGLGETERRORPROC, glGetError);
}
void*
glloading_pointer(const char *name)
{
return GetAnyGLFuncAddress(name);
}