Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/system/lib/gl/gl.c
6169 views
1
/*
2
* Copyright 2014 The Emscripten Authors. All rights reserved.
3
* Emscripten is available under two separate licenses, the MIT license and the
4
* University of Illinois/NCSA Open Source License. Both these licenses can be
5
* found in the LICENSE file.
6
*/
7
8
#if GL_ENABLE_GET_PROC_ADDRESS
9
10
// GL proc address retrieval
11
12
#include <string.h>
13
#include <stdlib.h>
14
#include <emscripten.h>
15
#include <emscripten/html5_webgl.h>
16
17
#define GL_GLEXT_PROTOTYPES
18
#include <GL/gl.h>
19
#include <GL/glext.h>
20
21
#ifdef LEGACY_GL_EMULATION
22
23
#include <webgl/webgl1_ext.h>
24
#include "webgl_internal_funcs.h"
25
26
#define RETURN_GL_EMU_FN(functionName) if (!strcmp(name, #functionName)) return emscripten_##functionName;
27
28
void* emscripten_legacy_gl_emulation_GetProcAddress(const char *name) {
29
// main list, autogenerated from the earlier part of the file using
30
/*
31
for line in open('a').readlines():
32
if "emscripten" not in line: continue
33
line = line.replace(' * ', ' ').replace('const ', '').replace('(', ' ')
34
func = line.split(' ')[3].strip().replace('(', '')
35
short = func.replace('EXT', '').replace('ARB', '').replace('OES', '').replace('ANGLE', '').replace('emscripten_', '')
36
print ' if (!strcmp(name, "%s")) return %s;' % (short, func);
37
*/
38
39
// The following list contains only exactly those functions that library_glemu.js currently implements.
40
// Others will return a null pointer.
41
42
// misc renamings
43
if (!strcmp(name, "glCreateProgramObject")) return emscripten_glCreateProgram;
44
if (!strcmp(name, "glUseProgramObject")) return emscripten_glUseProgram;
45
if (!strcmp(name, "glCreateShaderObject")) return emscripten_glCreateShader;
46
if (!strcmp(name, "glAttachObject")) return emscripten_glAttachShader;
47
if (!strcmp(name, "glDetachObject")) return emscripten_glDetachShader;
48
49
RETURN_GL_EMU_FN(glDeleteObject);
50
RETURN_GL_EMU_FN(glGetObjectParameteriv);
51
RETURN_GL_EMU_FN(glGetInfoLog);
52
RETURN_GL_EMU_FN(glBindProgram);
53
RETURN_GL_EMU_FN(glGetPointerv);
54
RETURN_GL_EMU_FN(glBegin);
55
RETURN_GL_EMU_FN(glEnd);
56
//RETURN_GL_EMU_FN(glVertex2d);
57
RETURN_GL_EMU_FN(glVertex2f);
58
RETURN_GL_EMU_FN(glVertex2i);
59
//RETURN_GL_EMU_FN(glVertex2s);
60
//RETURN_GL_EMU_FN(glVertex3d);
61
RETURN_GL_EMU_FN(glVertex3f);
62
RETURN_GL_EMU_FN(glVertex3i);
63
//RETURN_GL_EMU_FN(glVertex3s);
64
//RETURN_GL_EMU_FN(glVertex4d);
65
RETURN_GL_EMU_FN(glVertex4f);
66
RETURN_GL_EMU_FN(glVertex4i);
67
//RETURN_GL_EMU_FN(glVertex4s);
68
//RETURN_GL_EMU_FN(glVertex2dv);
69
RETURN_GL_EMU_FN(glVertex2fv);
70
//RETURN_GL_EMU_FN(glVertex2iv);
71
//RETURN_GL_EMU_FN(glVertex2sv);
72
//RETURN_GL_EMU_FN(glVertex3dv);
73
RETURN_GL_EMU_FN(glVertex3fv);
74
//RETURN_GL_EMU_FN(glVertex3iv);
75
//RETURN_GL_EMU_FN(glVertex3sv);
76
//RETURN_GL_EMU_FN(glVertex4dv);
77
RETURN_GL_EMU_FN(glVertex4fv);
78
//RETURN_GL_EMU_FN(glVertex4iv);
79
//RETURN_GL_EMU_FN(glVertex4sv);
80
//RETURN_GL_EMU_FN(glColor3b);
81
RETURN_GL_EMU_FN(glColor3d);
82
RETURN_GL_EMU_FN(glColor3f);
83
//RETURN_GL_EMU_FN(glColor3i);
84
//RETURN_GL_EMU_FN(glColor3s);
85
RETURN_GL_EMU_FN(glColor3ub);
86
RETURN_GL_EMU_FN(glColor3ui);
87
RETURN_GL_EMU_FN(glColor3us);
88
//RETURN_GL_EMU_FN(glColor4b);
89
RETURN_GL_EMU_FN(glColor4d);
90
RETURN_GL_EMU_FN(glColor4f);
91
//RETURN_GL_EMU_FN(glColor4i);
92
//RETURN_GL_EMU_FN(glColor4s);
93
RETURN_GL_EMU_FN(glColor4ub);
94
RETURN_GL_EMU_FN(glColor4ui);
95
RETURN_GL_EMU_FN(glColor4us);
96
//RETURN_GL_EMU_FN(glColor3bv);
97
//RETURN_GL_EMU_FN(glColor3dv);
98
RETURN_GL_EMU_FN(glColor3fv);
99
//RETURN_GL_EMU_FN(glColor3iv);
100
//RETURN_GL_EMU_FN(glColor3sv);
101
RETURN_GL_EMU_FN(glColor3ubv);
102
RETURN_GL_EMU_FN(glColor3uiv);
103
RETURN_GL_EMU_FN(glColor3usv);
104
//RETURN_GL_EMU_FN(glColor4bv);
105
//RETURN_GL_EMU_FN(glColor4dv);
106
RETURN_GL_EMU_FN(glColor4fv);
107
//RETURN_GL_EMU_FN(glColor4iv);
108
//RETURN_GL_EMU_FN(glColor4sv);
109
RETURN_GL_EMU_FN(glColor4ubv);
110
//RETURN_GL_EMU_FN(glColor4uiv);
111
//RETURN_GL_EMU_FN(glColor4usv);
112
//RETURN_GL_EMU_FN(glFogCoordf);
113
//RETURN_GL_EMU_FN(glFogCoordfv);
114
//RETURN_GL_EMU_FN(glFogCoordd);
115
//RETURN_GL_EMU_FN(glFogCoorddv);
116
//RETURN_GL_EMU_FN(glFogCoordPointer);
117
RETURN_GL_EMU_FN(glPolygonMode);
118
RETURN_GL_EMU_FN(glAlphaFunc);
119
//RETURN_GL_EMU_FN(glNormal3b);
120
//RETURN_GL_EMU_FN(glNormal3d);
121
RETURN_GL_EMU_FN(glNormal3f);
122
//RETURN_GL_EMU_FN(glNormal3i);
123
//RETURN_GL_EMU_FN(glNormal3s);
124
//RETURN_GL_EMU_FN(glNormal3bv);
125
//RETURN_GL_EMU_FN(glNormal3dv);
126
//RETURN_GL_EMU_FN(glNormal3fv);
127
//RETURN_GL_EMU_FN(glNormal3iv);
128
//RETURN_GL_EMU_FN(glNormal3sv);
129
RETURN_GL_EMU_FN(glDrawRangeElements);
130
RETURN_GL_EMU_FN(glEnableClientState);
131
RETURN_GL_EMU_FN(glDisableClientState);
132
RETURN_GL_EMU_FN(glVertexPointer);
133
RETURN_GL_EMU_FN(glNormalPointer);
134
RETURN_GL_EMU_FN(glColorPointer);
135
RETURN_GL_EMU_FN(glTexCoordPointer);
136
RETURN_GL_EMU_FN(glClientActiveTexture);
137
RETURN_GL_EMU_FN(glMatrixMode);
138
RETURN_GL_EMU_FN(glPushMatrix);
139
RETURN_GL_EMU_FN(glPopMatrix);
140
RETURN_GL_EMU_FN(glLoadIdentity);
141
RETURN_GL_EMU_FN(glLoadMatrixd);
142
RETURN_GL_EMU_FN(glLoadMatrixf);
143
RETURN_GL_EMU_FN(glLoadTransposeMatrixf);
144
RETURN_GL_EMU_FN(glLoadTransposeMatrixd);
145
RETURN_GL_EMU_FN(glMultTransposeMatrixf);
146
RETURN_GL_EMU_FN(glMultTransposeMatrixd);
147
RETURN_GL_EMU_FN(glMultMatrixd);
148
RETURN_GL_EMU_FN(glMultMatrixf);
149
RETURN_GL_EMU_FN(glOrtho);
150
RETURN_GL_EMU_FN(glFrustum);
151
RETURN_GL_EMU_FN(glRotated);
152
RETURN_GL_EMU_FN(glRotatef);
153
RETURN_GL_EMU_FN(glScaled);
154
RETURN_GL_EMU_FN(glScalef);
155
RETURN_GL_EMU_FN(glTranslated);
156
RETURN_GL_EMU_FN(glTranslatef);
157
RETURN_GL_EMU_FN(glClipPlane);
158
RETURN_GL_EMU_FN(glDrawBuffer);
159
RETURN_GL_EMU_FN(glReadBuffer);
160
//RETURN_GL_EMU_FN(glLightf);
161
//RETURN_GL_EMU_FN(glLighti);
162
RETURN_GL_EMU_FN(glLightfv);
163
//RETURN_GL_EMU_FN(glLightiv);
164
RETURN_GL_EMU_FN(glLightModelf);
165
//RETURN_GL_EMU_FN(glLightModeli);
166
RETURN_GL_EMU_FN(glLightModelfv);
167
//RETURN_GL_EMU_FN(glLightModeliv);
168
//RETURN_GL_EMU_FN(glMaterialf);
169
//RETURN_GL_EMU_FN(glMateriali);
170
RETURN_GL_EMU_FN(glMaterialfv);
171
//RETURN_GL_EMU_FN(glMaterialiv);
172
//RETURN_GL_EMU_FN(glTexGend);
173
//RETURN_GL_EMU_FN(glTexGenf);
174
RETURN_GL_EMU_FN(glTexGeni);
175
//RETURN_GL_EMU_FN(glTexGendv);
176
RETURN_GL_EMU_FN(glTexGenfv);
177
//RETURN_GL_EMU_FN(glTexGeniv);
178
RETURN_GL_EMU_FN(glGetTexEnvfv);
179
RETURN_GL_EMU_FN(glGetTexEnviv);
180
RETURN_GL_EMU_FN(glTexImage1D);
181
//RETURN_GL_EMU_FN(glTexCoord1d);
182
//RETURN_GL_EMU_FN(glTexCoord1f);
183
//RETURN_GL_EMU_FN(glTexCoord1i);
184
//RETURN_GL_EMU_FN(glTexCoord1s);
185
//RETURN_GL_EMU_FN(glTexCoord2d);
186
RETURN_GL_EMU_FN(glTexCoord2f);
187
RETURN_GL_EMU_FN(glTexCoord2i);
188
//RETURN_GL_EMU_FN(glTexCoord2s);
189
//RETURN_GL_EMU_FN(glTexCoord3d);
190
RETURN_GL_EMU_FN(glTexCoord3f);
191
//RETURN_GL_EMU_FN(glTexCoord3i);
192
//RETURN_GL_EMU_FN(glTexCoord3s);
193
//RETURN_GL_EMU_FN(glTexCoord4d);
194
RETURN_GL_EMU_FN(glTexCoord4f);
195
//RETURN_GL_EMU_FN(glTexCoord4i);
196
//RETURN_GL_EMU_FN(glTexCoord4s);
197
//RETURN_GL_EMU_FN(glTexCoord1dv);
198
//RETURN_GL_EMU_FN(glTexCoord1fv);
199
//RETURN_GL_EMU_FN(glTexCoord1iv);
200
//RETURN_GL_EMU_FN(glTexCoord1sv);
201
//RETURN_GL_EMU_FN(glTexCoord2dv);
202
RETURN_GL_EMU_FN(glTexCoord2fv);
203
//RETURN_GL_EMU_FN(glTexCoord2iv);
204
//RETURN_GL_EMU_FN(glTexCoord2sv);
205
//RETURN_GL_EMU_FN(glTexCoord3dv);
206
//RETURN_GL_EMU_FN(glTexCoord3fv);
207
//RETURN_GL_EMU_FN(glTexCoord3iv);
208
//RETURN_GL_EMU_FN(glTexCoord3sv);
209
//RETURN_GL_EMU_FN(glTexCoord4dv);
210
//RETURN_GL_EMU_FN(glTexCoord4fv);
211
//RETURN_GL_EMU_FN(glTexCoord4iv);
212
//RETURN_GL_EMU_FN(glTexCoord4sv);
213
//RETURN_GL_EMU_FN(glGetTexLevelParameterfv);
214
RETURN_GL_EMU_FN(glGetTexLevelParameteriv);
215
RETURN_GL_EMU_FN(glShadeModel);
216
217
// GL emulation library "sloppy" lookup:
218
// WebGL 1 extensions are offered without their EXT suffixes.
219
if (!strcmp(name, "glBindVertexArray")) return emscripten_glBindVertexArrayOES;
220
if (!strcmp(name, "glDeleteVertexArrays")) return emscripten_glDeleteVertexArraysOES;
221
if (!strcmp(name, "glGenVertexArrays")) return emscripten_glGenVertexArraysOES;
222
if (!strcmp(name, "glIsVertexArray")) return emscripten_glIsVertexArrayOES;
223
if (!strcmp(name, "glDrawBuffers")) return emscripten_glDrawBuffersWEBGL;
224
if (!strcmp(name, "glDrawArraysInstanced")) return emscripten_glDrawArraysInstancedANGLE;
225
if (!strcmp(name, "glDrawElementsInstanced")) return emscripten_glDrawElementsInstancedANGLE;
226
if (!strcmp(name, "glVertexAttribDivisor")) return emscripten_glVertexAttribDivisorANGLE;
227
if (!strcmp(name, "glGenQueries")) return emscripten_glGenQueriesEXT;
228
if (!strcmp(name, "glDeleteQueries")) return emscripten_glDeleteQueriesEXT;
229
if (!strcmp(name, "glIsQuery")) return emscripten_glIsQueryEXT;
230
if (!strcmp(name, "glBeginQuery")) return emscripten_glBeginQueryEXT;
231
if (!strcmp(name, "glEndQuery")) return emscripten_glEndQueryEXT;
232
if (!strcmp(name, "glQueryCounter")) return emscripten_glQueryCounterEXT;
233
if (!strcmp(name, "glGetQueryiv")) return emscripten_glGetQueryivEXT;
234
if (!strcmp(name, "glGetQueryObjectiv")) return emscripten_glGetQueryObjectivEXT;
235
if (!strcmp(name, "glGetQueryObjectuiv")) return emscripten_glGetQueryObjectuivEXT;
236
if (!strcmp(name, "glGetQueryObjecti64v")) return emscripten_glGetQueryObjecti64vEXT;
237
if (!strcmp(name, "glGetQueryObjectui64v")) return emscripten_glGetQueryObjectui64vEXT;
238
239
return 0;
240
}
241
#endif
242
243
void *_webgl1_match_ext_proc_address_without_suffix(const char *name);
244
void *_webgl2_match_ext_proc_address_without_suffix(const char *name);
245
246
// "Sloppy" desktop OpenGL/mobile GLES emulating
247
// behavior: different functionality is available under
248
// different vendor suffixes. In emscripten_GetProcAddress()
249
// function, all these suffixes will be ignored when performing
250
// the function pointer lookup.
251
void* emscripten_GetProcAddress(const char *name_) {
252
char *name = malloc(strlen(name_)+1);
253
strcpy(name, name_);
254
// remove EXT|ARB|OES|ANGLE suffixes
255
char *end = strstr(name, "EXT");
256
if (end) *end = 0;
257
end = strstr(name, "ARB");
258
if (end) *end = 0;
259
end = strstr(name, "OES");
260
if (end) *end = 0;
261
end = strstr(name, "ANGLE");
262
if (end) *end = 0;
263
end = strstr(name, "WEBGL");
264
if (end) *end = 0;
265
266
void *ptr = emscripten_webgl1_get_proc_address(name);
267
268
if (!ptr) ptr = _webgl1_match_ext_proc_address_without_suffix(name);
269
270
#if LEGACY_GL_EMULATION
271
if (!ptr) ptr = emscripten_legacy_gl_emulation_GetProcAddress(name);
272
#endif
273
#if MAX_WEBGL_VERSION >= 2
274
if (!ptr) ptr = emscripten_webgl2_get_proc_address(name);
275
if (!ptr) ptr = _webgl2_match_ext_proc_address_without_suffix(name);
276
#endif
277
278
free(name);
279
return ptr;
280
}
281
282
extern void *emscripten_webgl_get_proc_address(const char *name)
283
{
284
void *ptr = emscripten_webgl1_get_proc_address(name);
285
#if MAX_WEBGL_VERSION >= 2
286
if (!ptr) ptr = emscripten_webgl2_get_proc_address(name);
287
#endif
288
return ptr;
289
}
290
291
#endif
292
293