Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/system/lib/gl/webgl1.c
6169 views
1
/*
2
* Copyright 2018 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
#include <assert.h>
8
#include <emscripten/threading.h>
9
#include <emscripten/console.h>
10
#include <string.h>
11
#include <stdlib.h>
12
#include <sys/types.h>
13
14
#include <webgl/webgl1.h>
15
#include <webgl/webgl1_ext.h>
16
#include <webgl/webgl2.h>
17
18
#include "webgl_internal.h"
19
20
void emscripten_webgl_init_context_attributes(EmscriptenWebGLContextAttributes *attributes) {
21
memset(attributes, 0, sizeof(*attributes));
22
23
attributes->alpha = 1;
24
attributes->depth = 1;
25
attributes->antialias = 1;
26
attributes->premultipliedAlpha = 1;
27
attributes->majorVersion = 1;
28
attributes->enableExtensionsByDefault = 1;
29
30
// Default context initialization state (user can override):
31
// - if main thread is creating the context, default to the context not being
32
// shared between threads - enabling sharing has performance overhead,
33
// because it forces the context to be OffscreenCanvas or
34
// OffscreenFramebuffer.
35
// - if a web worker is creating the context, default to using OffscreenCanvas
36
// if available, or proxying via Offscreen Framebuffer if not
37
if (!emscripten_is_main_runtime_thread()) {
38
attributes->proxyContextToMainThread = EMSCRIPTEN_WEBGL_CONTEXT_PROXY_FALLBACK;
39
}
40
}
41
42
#if defined(__EMSCRIPTEN_PTHREADS__) && defined(__EMSCRIPTEN_OFFSCREEN_FRAMEBUFFER__)
43
44
static pthread_key_t currentActiveWebGLContext;
45
pthread_key_t currentThreadOwnsItsWebGLContext;
46
static pthread_once_t tlsInit = PTHREAD_ONCE_INIT;
47
48
static void InitWebGLTls() {
49
pthread_key_create(&currentActiveWebGLContext, NULL);
50
pthread_key_create(&currentThreadOwnsItsWebGLContext, NULL);
51
}
52
53
// When OFFSCREEN_FRAMEBUFFER is enabled the EMSCRIPTEN_WEBGL_CONTEXT_HANDLE
54
// is a pointer to a struct with two fields. See registerContext in
55
// library_webgl.js
56
typedef struct WebGLContextHandle {
57
uint32_t explicit_swap_control;
58
pthread_t owning_thread;
59
} WebGLContextHandle;
60
61
static inline pthread_t GetOwningThread(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE handle) {
62
return ((WebGLContextHandle*)handle)->owning_thread;
63
}
64
65
static inline pthread_t GetCurrentTargetThread() {
66
return GetOwningThread(emscripten_webgl_get_current_context());
67
}
68
69
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE emscripten_webgl_create_context(const char *target, const EmscriptenWebGLContextAttributes *attributes) {
70
GL_FUNCTION_TRACE();
71
if (!attributes) {
72
emscripten_err("emscripten_webgl_create_context: attributes pointer is null!");
73
return 0;
74
}
75
pthread_once(&tlsInit, InitWebGLTls);
76
77
if (attributes->proxyContextToMainThread == EMSCRIPTEN_WEBGL_CONTEXT_PROXY_ALWAYS ||
78
(attributes->proxyContextToMainThread == EMSCRIPTEN_WEBGL_CONTEXT_PROXY_FALLBACK && !emscripten_supports_offscreencanvas())) {
79
EmscriptenWebGLContextAttributes attrs = *attributes;
80
attrs.renderViaOffscreenBackBuffer = true;
81
return (EMSCRIPTEN_WEBGL_CONTEXT_HANDLE)emscripten_sync_run_in_main_runtime_thread_ptr(EM_FUNC_SIG_PPP, &emscripten_webgl_do_create_context, target, &attrs);
82
} else {
83
return emscripten_webgl_do_create_context(target, attributes);
84
}
85
}
86
87
EMSCRIPTEN_RESULT emscripten_webgl_make_context_current(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context) {
88
GL_FUNCTION_TRACE();
89
if (emscripten_webgl_get_current_context() == context)
90
return EMSCRIPTEN_RESULT_SUCCESS;
91
92
if (context && GetOwningThread(context) == pthread_self()) {
93
EMSCRIPTEN_RESULT r = emscripten_webgl_make_context_current_calling_thread(context);
94
if (r == EMSCRIPTEN_RESULT_SUCCESS) {
95
pthread_setspecific(currentActiveWebGLContext, (void*)context);
96
pthread_setspecific(currentThreadOwnsItsWebGLContext, (void*)1);
97
}
98
return r;
99
} else {
100
EMSCRIPTEN_RESULT r = emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_IP, &emscripten_webgl_make_context_current_calling_thread, context);
101
if (r == EMSCRIPTEN_RESULT_SUCCESS) {
102
pthread_setspecific(currentActiveWebGLContext, (void*)context);
103
pthread_setspecific(currentThreadOwnsItsWebGLContext, (void*)0);
104
_emscripten_proxied_gl_context_activated_from_main_browser_thread(context);
105
}
106
return r;
107
}
108
}
109
110
EMSCRIPTEN_WEBGL_CONTEXT_HANDLE emscripten_webgl_get_current_context(void) {
111
return (EMSCRIPTEN_WEBGL_CONTEXT_HANDLE)pthread_getspecific(currentActiveWebGLContext);
112
}
113
114
EMSCRIPTEN_RESULT emscripten_webgl_commit_frame(void) {
115
GL_FUNCTION_TRACE();
116
if (pthread_getspecific(currentThreadOwnsItsWebGLContext))
117
return emscripten_webgl_do_commit_frame();
118
else
119
return (EMSCRIPTEN_RESULT)emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_I, &emscripten_webgl_do_commit_frame);
120
}
121
122
static void *memdup(const void *ptr, size_t sz) {
123
if (!ptr) return 0;
124
void *dup = malloc(sz);
125
if (dup) memcpy(dup, ptr, sz);
126
return dup;
127
}
128
129
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glActiveTexture, GLenum);
130
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glAttachShader, GLuint, GLuint);
131
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glBindAttribLocation, GLuint, GLuint, const GLchar*);
132
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBindBuffer, GLenum, GLuint);
133
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBindFramebuffer, GLenum, GLuint);
134
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBindRenderbuffer, GLenum, GLuint);
135
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBindTexture, GLenum, GLuint);
136
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VFFFF, void, glBlendColor, GLfloat, GLfloat, GLfloat, GLfloat);
137
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glBlendEquation, GLenum);
138
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBlendEquationSeparate, GLenum, GLenum);
139
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBlendFunc, GLenum, GLenum);
140
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glBlendFuncSeparate, GLenum, GLenum, GLenum, GLenum);
141
142
void glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage) {
143
GL_FUNCTION_TRACE();
144
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
145
emscripten_glBufferData(target, size, data, usage);
146
return;
147
}
148
149
if (size < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
150
void *ptr = memdup(data, size);
151
if (ptr || !data) { // glBufferData(data=0) can always be handled asynchronously
152
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIPPI, &emscripten_glBufferData, ptr, target, size, ptr, usage);
153
return;
154
}
155
// Fall through on allocation failure and run synchronously.
156
}
157
158
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIPPI, &emscripten_glBufferData, target, size, data, usage);
159
}
160
161
void glBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, const void *data) {
162
GL_FUNCTION_TRACE();
163
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
164
emscripten_glBufferSubData(target, offset, size, data);
165
return;
166
}
167
168
if (size < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
169
void *ptr = memdup(data, size);
170
if (ptr || !data) {
171
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIIII, &emscripten_glBufferSubData, ptr, target, offset, size, ptr);
172
return;
173
}
174
// Fall through on allocation failure and run synchronously.
175
}
176
177
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIII, &emscripten_glBufferSubData, target, offset, size, data);
178
}
179
180
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLenum, glCheckFramebufferStatus, GLenum);
181
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glClear, GLbitfield);
182
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VFFFF, void, glClearColor, GLfloat, GLfloat, GLfloat, GLfloat);
183
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VF, void, glClearDepthf, GLfloat);
184
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glClearStencil, GLint);
185
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glColorMask, GLboolean, GLboolean, GLboolean, GLboolean);
186
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glCompileShader, GLuint);
187
VOID_SYNC_GL_FUNCTION_8(EM_FUNC_SIG_VIIIIIIII, void, glCompressedTexImage2D, GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const void *);
188
VOID_SYNC_GL_FUNCTION_9(EM_FUNC_SIG_VIIIIIIIII, void, glCompressedTexSubImage2D, GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const void *);
189
ASYNC_GL_FUNCTION_8(EM_FUNC_SIG_VIIIIIIII, void, glCopyTexImage2D, GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
190
ASYNC_GL_FUNCTION_8(EM_FUNC_SIG_VIIIIIIII, void, glCopyTexSubImage2D, GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
191
RET_SYNC_GL_FUNCTION_0(EM_FUNC_SIG_I, GLuint, glCreateProgram);
192
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLuint, glCreateShader, GLenum);
193
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glCullFace, GLenum);
194
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteBuffers, GLsizei, const GLuint *);
195
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteFramebuffers, GLsizei, const GLuint *);
196
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDeleteProgram, GLuint);
197
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteRenderbuffers, GLsizei, const GLuint *);
198
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDeleteShader, GLuint);
199
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteTextures, GLsizei, const GLuint *);
200
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDepthFunc, GLenum);
201
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDepthMask, GLboolean);
202
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VFF, void, glDepthRangef, GLfloat, GLfloat);
203
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDetachShader, GLuint, GLuint);
204
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDisable, GLenum);
205
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDisableVertexAttribArray, GLuint);
206
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glDrawArrays, GLenum, GLint, GLsizei);
207
// TODO: The following #define FULL_ES2 does not yet exist, we'll need to compile this file twice, for FULL_ES2 mode and without
208
#if FULL_ES2
209
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glDrawElements, GLenum, GLsizei, GLenum, const void *);
210
#else
211
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glDrawElements, GLenum, GLsizei, GLenum, const void *);
212
#endif
213
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glEnable, GLenum);
214
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glEnableVertexAttribArray, GLuint);
215
VOID_SYNC_GL_FUNCTION_0(EM_FUNC_SIG_V, void, glFinish);
216
VOID_SYNC_GL_FUNCTION_0(EM_FUNC_SIG_V, void, glFlush); // TODO: THIS COULD POTENTIALLY BE ASYNC
217
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glFramebufferRenderbuffer, GLenum, GLenum, GLenum, GLuint);
218
ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glFramebufferTexture2D, GLenum, GLenum, GLenum, GLuint, GLint);
219
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glFrontFace, GLenum);
220
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIP, void, glGenBuffers, GLsizei, GLuint *);
221
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glGenerateMipmap, GLenum);
222
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIP, void, glGenFramebuffers, GLsizei, GLuint *);
223
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIP, void, glGenRenderbuffers, GLsizei, GLuint *);
224
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIP, void, glGenTextures, GLsizei, GLuint *);
225
VOID_SYNC_GL_FUNCTION_7(EM_FUNC_SIG_VIIIIIII, void, glGetActiveAttrib, GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *);
226
VOID_SYNC_GL_FUNCTION_7(EM_FUNC_SIG_VIIIIIII, void, glGetActiveUniform, GLuint, GLuint, GLsizei, GLsizei *, GLint *, GLenum *, GLchar *);
227
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glGetAttachedShaders, GLuint, GLsizei, GLsizei *, GLuint *);
228
RET_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_IIP, GLint, glGetAttribLocation, GLuint, const GLchar *);
229
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGetBooleanv, GLenum, GLboolean *);
230
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetBufferParameteriv, GLenum, GLenum, GLint *);
231
RET_SYNC_GL_FUNCTION_0(EM_FUNC_SIG_I, GLenum, glGetError);
232
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIP, void, glGetFloatv, GLenum, GLfloat *);
233
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glGetFramebufferAttachmentParameteriv, GLenum, GLenum, GLenum, GLint *);
234
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIP, void, glGetIntegerv, GLenum, GLint *);
235
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetProgramiv, GLuint, GLenum, GLint *);
236
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIPP, void, glGetProgramInfoLog, GLuint, GLsizei, GLsizei *, GLchar *);
237
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetRenderbufferParameteriv, GLenum, GLenum, GLint *);
238
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetShaderiv, GLuint, GLenum, GLint *);
239
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIPP, void, glGetShaderInfoLog, GLuint, GLsizei, GLsizei *, GLchar *);
240
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIPP, void, glGetShaderPrecisionFormat, GLenum, GLenum, GLint *, GLint *);
241
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIPP, void, glGetShaderSource, GLuint, GLsizei, GLsizei *, GLchar *);
242
RET_PTR_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_PI, const GLubyte *, glGetString, GLenum);
243
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetTexParameterfv, GLenum, GLenum, GLfloat *);
244
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetTexParameteriv, GLenum, GLenum, GLint *);
245
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetUniformfv, GLuint, GLint, GLfloat *);
246
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetUniformiv, GLuint, GLint, GLint *);
247
RET_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_IIP, GLint, glGetUniformLocation, GLuint, const GLchar *);
248
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetVertexAttribfv, GLuint, GLenum, GLfloat *);
249
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetVertexAttribiv, GLuint, GLenum, GLint *);
250
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIP, void, glGetVertexAttribPointerv, GLuint, GLenum, void **);
251
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glHint, GLenum, GLenum);
252
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsBuffer, GLuint);
253
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsEnabled, GLenum);
254
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsFramebuffer, GLuint);
255
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsProgram, GLuint);
256
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsRenderbuffer, GLuint);
257
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsShader, GLuint);
258
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsTexture, GLuint);
259
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VF, void, glLineWidth, GLfloat);
260
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glLinkProgram, GLuint);
261
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glPixelStorei, GLenum, GLint);
262
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VFF, void, glPolygonOffset, GLfloat, GLfloat);
263
VOID_SYNC_GL_FUNCTION_7(EM_FUNC_SIG_VIIIIIIP, void, glReadPixels, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *);
264
ASYNC_GL_FUNCTION_0(EM_FUNC_SIG_V, void, glReleaseShaderCompiler);
265
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glRenderbufferStorage, GLenum, GLenum, GLsizei, GLsizei);
266
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glSampleCoverage, GLfloat, GLboolean);
267
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glScissor, GLint, GLint, GLsizei, GLsizei);
268
VOID_SYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glShaderBinary, GLsizei, const GLuint *, GLenum, const void *, GLsizei);
269
VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIPP, void, glShaderSource, GLuint, GLsizei, const GLchar *const*, const GLint *);
270
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glStencilFunc, GLenum, GLint, GLuint);
271
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glStencilFuncSeparate, GLenum, GLenum, GLint, GLuint);
272
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glStencilMask, GLuint);
273
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glStencilMaskSeparate, GLenum, GLuint);
274
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glStencilOp, GLenum, GLenum, GLenum);
275
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glStencilOpSeparate, GLenum, GLenum, GLenum, GLenum);
276
277
static ssize_t ImageSize(int width, int height, GLenum format, GLenum type) {
278
int numChannels;
279
switch (format) {
280
case GL_ALPHA: case GL_LUMINANCE: case GL_DEPTH_COMPONENT: case GL_RED: case GL_RED_INTEGER: numChannels = 1; break;
281
case GL_RG: case GL_RG_INTEGER: numChannels = 2; break;
282
case GL_RGB: case 0x8C40/*GL_SRGB_EXT*/: case GL_RGB_INTEGER: numChannels = 3; break;
283
case GL_RGBA: case 0x8C42/*GL_SRGB_ALPHA_EXT*/: case GL_RGBA_INTEGER: numChannels = 4; break;
284
default: return -1;
285
}
286
int sizePerPixel;
287
switch (type) {
288
case GL_UNSIGNED_BYTE: case GL_BYTE: sizePerPixel = numChannels; break;
289
case GL_UNSIGNED_SHORT: case 0x8D61/*GL_HALF_FLOAT_OES*/: case GL_HALF_FLOAT: case GL_SHORT: case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_5_5_5_1: sizePerPixel = numChannels*2; break;
290
case GL_UNSIGNED_INT: case GL_FLOAT: case GL_INT: case GL_UNSIGNED_INT_5_9_9_9_REV: case GL_UNSIGNED_INT_2_10_10_10_REV: case GL_UNSIGNED_INT_10F_11F_11F_REV: case GL_UNSIGNED_INT_24_8: sizePerPixel = numChannels*4; break;
291
default: return -1;
292
}
293
return width*height*sizePerPixel;
294
}
295
296
void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) {
297
GL_FUNCTION_TRACE();
298
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
299
emscripten_glTexImage2D(target, level, internalformat, width, height, border, format, type, pixels);
300
return;
301
}
302
303
ssize_t sz = ImageSize(width, height, format, type);
304
if (!pixels || (sz >= 0 && sz < 256*1024)) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
305
void *ptr = memdup(pixels, sz);
306
if (ptr || !pixels) {
307
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIIIIIIIIP, &emscripten_glTexImage2D, ptr, target, level, internalformat, width, height, border, format, type, ptr);
308
return;
309
}
310
// Fall through on allocation failure and run synchronously.
311
}
312
313
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIIIIIIIP, &emscripten_glTexImage2D, target, level, internalformat, width, height, border, format, type, pixels);
314
}
315
316
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIF, void, glTexParameterf, GLenum, GLenum, GLfloat);
317
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glTexParameterfv, GLenum, GLenum, const GLfloat *);
318
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glTexParameteri, GLenum, GLenum, GLint);
319
VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glTexParameteriv, GLenum, GLenum, const GLint *);
320
321
void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) {
322
GL_FUNCTION_TRACE();
323
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
324
emscripten_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
325
return;
326
}
327
328
ssize_t sz = ImageSize(width, height, format, type);
329
if (!pixels || (sz >= 0 && sz < 256*1024)) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
330
void *ptr = memdup(pixels, sz);
331
if (ptr || !pixels) {
332
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIIIIIIIII, &emscripten_glTexSubImage2D, ptr, target, level, xoffset, yoffset, width, height, format, type, ptr);
333
return;
334
}
335
// Fall through on allocation failure and run synchronously.
336
}
337
338
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIIIIIIII, &emscripten_glTexSubImage2D, target, level, xoffset, yoffset, width, height, format, type, pixels);
339
}
340
341
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIF, void, glUniform1f, GLint, GLfloat);
342
343
void glUniform1fv(GLint location, GLsizei count, const GLfloat *value) {
344
GL_FUNCTION_TRACE();
345
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
346
emscripten_glUniform1fv(location, count, value);
347
return;
348
}
349
350
size_t sz = sizeof(GLfloat)*count;
351
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
352
void *ptr = memdup(value, sz);
353
if (ptr) {
354
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform1fv, ptr, location, count, (GLfloat*)ptr);
355
return;
356
}
357
// Fall through on allocation failure and run synchronously.
358
}
359
360
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform1fv, location, count, value);
361
}
362
363
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glUniform1i, GLint, GLint);
364
365
void glUniform1iv(GLint location, GLsizei count, const GLint *value) {
366
GL_FUNCTION_TRACE();
367
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
368
emscripten_glUniform1iv(location, count, value);
369
return;
370
}
371
372
size_t sz = sizeof(GLint)*count;
373
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
374
void *ptr = memdup(value, sz);
375
if (ptr) {
376
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform1iv, ptr, location, count, (GLint*)ptr);
377
return;
378
}
379
// Fall through on allocation failure and run synchronously.
380
}
381
382
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform1iv, location, count, value);
383
}
384
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIFF, void, glUniform2f, GLint, GLfloat, GLfloat);
385
386
void glUniform2fv(GLint location, GLsizei count, const GLfloat *value) {
387
GL_FUNCTION_TRACE();
388
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
389
emscripten_glUniform2fv(location, count, value);
390
return;
391
}
392
393
size_t sz = 2*sizeof(GLfloat)*count;
394
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
395
void *ptr = memdup(value, sz);
396
if (ptr) {
397
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform2fv, ptr, location, count, (GLfloat*)ptr);
398
return;
399
}
400
// Fall through on allocation failure and run synchronously.
401
}
402
403
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform2fv, location, count, value);
404
}
405
406
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glUniform2i, GLint, GLint, GLint);
407
408
void glUniform2iv(GLint location, GLsizei count, const GLint *value) {
409
GL_FUNCTION_TRACE();
410
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
411
emscripten_glUniform2iv(location, count, value);
412
return;
413
}
414
415
size_t sz = 2*sizeof(GLint)*count;
416
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
417
void *ptr = memdup(value, sz);
418
if (ptr) {
419
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform2iv, ptr, location, count, (GLint*)ptr);
420
return;
421
}
422
// Fall through on allocation failure and run synchronously.
423
}
424
425
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform2iv, location, count, value);
426
}
427
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIFFF, void, glUniform3f, GLint, GLfloat, GLfloat, GLfloat);
428
429
void glUniform3fv(GLint location, GLsizei count, const GLfloat *value) {
430
GL_FUNCTION_TRACE();
431
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
432
emscripten_glUniform3fv(location, count, value);
433
return;
434
}
435
436
size_t sz = 3*sizeof(GLfloat)*count;
437
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
438
void *ptr = memdup(value, sz);
439
if (ptr) {
440
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform3fv, ptr, location, count, (GLfloat*)ptr);
441
return;
442
}
443
// Fall through on allocation failure and run synchronously.
444
}
445
446
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform3fv, location, count, value);
447
}
448
449
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniform3i, GLint, GLint, GLint, GLint);
450
451
void glUniform3iv(GLint location, GLsizei count, const GLint *value) {
452
GL_FUNCTION_TRACE();
453
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
454
emscripten_glUniform3iv(location, count, value);
455
return;
456
}
457
458
size_t sz = 3*sizeof(GLint)*count;
459
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
460
void *ptr = memdup(value, sz);
461
if (ptr) {
462
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform3iv, ptr, location, count, (GLint*)ptr);
463
return;
464
}
465
// Fall through on allocation failure and run synchronously.
466
}
467
468
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform3iv, location, count, value);
469
}
470
ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIFFFF, void, glUniform4f, GLint, GLfloat, GLfloat, GLfloat, GLfloat);
471
472
void glUniform4fv(GLint location, GLsizei count, const GLfloat *value) {
473
GL_FUNCTION_TRACE();
474
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
475
emscripten_glUniform4fv(location, count, value);
476
return;
477
}
478
479
size_t sz = 4*sizeof(GLfloat)*count;
480
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
481
void *ptr = memdup(value, sz);
482
if (ptr) {
483
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform4fv, ptr, location, count, (GLfloat*)ptr);
484
return;
485
}
486
// Fall through on allocation failure and run synchronously.
487
}
488
489
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform4fv, location, count, value);
490
}
491
492
ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glUniform4i, GLint, GLint, GLint, GLint, GLint);
493
494
void glUniform4iv(GLint location, GLsizei count, const GLint *value) {
495
GL_FUNCTION_TRACE();
496
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
497
emscripten_glUniform4iv(location, count, value);
498
return;
499
}
500
501
size_t sz = 4*sizeof(GLint)*count;
502
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
503
void *ptr = memdup(value, sz);
504
if (ptr) {
505
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIII, &emscripten_glUniform4iv, ptr, location, count, (GLint*)ptr);
506
return;
507
}
508
// Fall through on allocation failure and run synchronously.
509
}
510
511
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIII, &emscripten_glUniform4iv, location, count, value);
512
}
513
514
void glUniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) {
515
GL_FUNCTION_TRACE();
516
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
517
emscripten_glUniformMatrix2fv(location, count, transpose, value);
518
return;
519
}
520
size_t sz = 2*2*sizeof(GLfloat)*count;
521
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
522
void *ptr = memdup(value, sz);
523
if (ptr) {
524
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIIII, &emscripten_glUniformMatrix2fv, ptr, location, count, transpose, (GLfloat*)ptr);
525
return;
526
}
527
// Fall through on allocation failure and run synchronously.
528
}
529
530
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIII, &emscripten_glUniformMatrix2fv, location, count, transpose, value);
531
}
532
533
void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) {
534
GL_FUNCTION_TRACE();
535
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
536
emscripten_glUniformMatrix3fv(location, count, transpose, value);
537
return;
538
}
539
size_t sz = 3*3*sizeof(GLfloat)*count;
540
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
541
void *ptr = memdup(value, sz);
542
if (ptr) {
543
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIIII, &emscripten_glUniformMatrix3fv, ptr, location, count, transpose, (GLfloat*)ptr);
544
return;
545
}
546
// Fall through on allocation failure and run synchronously.
547
}
548
549
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIII, &emscripten_glUniformMatrix3fv, location, count, transpose, value);
550
}
551
552
void glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value) {
553
GL_FUNCTION_TRACE();
554
if (pthread_getspecific(currentThreadOwnsItsWebGLContext)) {
555
emscripten_glUniformMatrix4fv(location, count, transpose, value);
556
return;
557
}
558
size_t sz = 4*4*sizeof(GLfloat)*count;
559
if (sz < 256*1024) { // run small buffer sizes asynchronously by copying - large buffers run synchronously
560
void *ptr = memdup(value, sz);
561
if (ptr) {
562
emscripten_dispatch_to_thread(GetCurrentTargetThread(), EM_FUNC_SIG_VIIIP, &emscripten_glUniformMatrix4fv, ptr, location, count, transpose, (GLfloat*)ptr);
563
return;
564
}
565
// Fall through on allocation failure and run synchronously.
566
}
567
568
emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIIP, &emscripten_glUniformMatrix4fv, location, count, transpose, value);
569
}
570
571
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glUseProgram, GLuint);
572
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glValidateProgram, GLuint);
573
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VIF, void, glVertexAttrib1f, GLuint, GLfloat);
574
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glVertexAttrib1fv, GLuint, const GLfloat *);
575
ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIFF, void, glVertexAttrib2f, GLuint, GLfloat, GLfloat);
576
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glVertexAttrib2fv, GLuint, const GLfloat *);
577
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIFFF, void, glVertexAttrib3f, GLuint, GLfloat, GLfloat, GLfloat);
578
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glVertexAttrib3fv, GLuint, const GLfloat *);
579
ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIFFFF, void, glVertexAttrib4f, GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
580
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glVertexAttrib4fv, GLuint, const GLfloat *);
581
582
// TODO: The following #define FULL_ES2 does not yet exist, we'll need to compile this file twice, for FULL_ES2 mode and without
583
#if FULL_ES2
584
VOID_SYNC_GL_FUNCTION_6(EM_FUNC_SIG_PIIIIIP, void, glVertexAttribPointer, GLuint, GLint, GLenum, GLboolean, GLsizei, const void *);
585
#else
586
ASYNC_GL_FUNCTION_6(EM_FUNC_SIG_VIIIIIP, void, glVertexAttribPointer, GLuint, GLint, GLenum, GLboolean, GLsizei, const void *);
587
#endif
588
ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glViewport, GLint, GLint, GLsizei, GLsizei);
589
590
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGenQueriesEXT, GLsizei, GLuint *);
591
VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteQueriesEXT, GLsizei, const GLuint *);
592
RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsQueryEXT, GLuint);
593
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBeginQueryEXT, GLenum, GLuint);
594
ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glEndQueryEXT, GLenum);
595
ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glQueryCounterEXT, GLuint, GLenum);
596
RET_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetQueryivEXT, GLenum, GLenum, GLint *);
597
RET_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetQueryObjectivEXT, GLenum, GLenum, GLint *);
598
RET_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetQueryObjectuivEXT, GLenum, GLenum, GLuint *);
599
RET_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetQueryObjecti64vEXT, GLenum, GLenum, GLint64 *);
600
RET_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetQueryObjectui64vEXT, GLenum, GLenum, GLuint64 *);
601
602
#endif // ~(__EMSCRIPTEN_PTHREADS__ && __EMSCRIPTEN_OFFSCREEN_FRAMEBUFFER__)
603
604
#if GL_ENABLE_GET_PROC_ADDRESS
605
606
// Returns a function pointer to the given WebGL 1 extension function, when queried without
607
// a GL extension suffix such as "EXT", "OES", or "ANGLE". This function is used by
608
// emscripten_GetProcAddress() to implement legacy GL emulation semantics for portability.
609
void *_webgl1_match_ext_proc_address_without_suffix(const char *name) {
610
RETURN_FN_WITH_SUFFIX(glGenQueries, EXT);
611
RETURN_FN_WITH_SUFFIX(glDeleteQueries, EXT);
612
RETURN_FN_WITH_SUFFIX(glIsQuery, EXT);
613
RETURN_FN_WITH_SUFFIX(glBeginQuery, EXT);
614
RETURN_FN_WITH_SUFFIX(glEndQuery, EXT);
615
RETURN_FN_WITH_SUFFIX(glQueryCounter, EXT);
616
RETURN_FN_WITH_SUFFIX(glGetQueryiv, EXT);
617
RETURN_FN_WITH_SUFFIX(glGetQueryObjectiv, EXT);
618
RETURN_FN_WITH_SUFFIX(glGetQueryObjectuiv, EXT);
619
RETURN_FN_WITH_SUFFIX(glGetQueryObjecti64v, EXT);
620
RETURN_FN_WITH_SUFFIX(glGetQueryObjectui64v, EXT);
621
622
// WebGL 1 , Extensions
623
RETURN_FN_WITH_SUFFIX(glBindVertexArray, OES);
624
RETURN_FN_WITH_SUFFIX(glDeleteVertexArrays, OES);
625
RETURN_FN_WITH_SUFFIX(glGenVertexArrays, OES);
626
RETURN_FN_WITH_SUFFIX(glIsVertexArray, OES);
627
RETURN_FN_WITH_SUFFIX(glDrawBuffers, WEBGL);
628
RETURN_FN_WITH_SUFFIX(glDrawArraysInstanced, ANGLE);
629
RETURN_FN_WITH_SUFFIX(glDrawElementsInstanced, ANGLE);
630
RETURN_FN_WITH_SUFFIX(glVertexAttribDivisor, ANGLE);
631
RETURN_FN_WITH_SUFFIX(glGenQueries, EXT);
632
RETURN_FN_WITH_SUFFIX(glDeleteQueries, EXT);
633
RETURN_FN_WITH_SUFFIX(glIsQuery, EXT);
634
RETURN_FN_WITH_SUFFIX(glBeginQuery, EXT);
635
RETURN_FN_WITH_SUFFIX(glEndQuery, EXT);
636
RETURN_FN_WITH_SUFFIX(glQueryCounter, EXT);
637
RETURN_FN_WITH_SUFFIX(glGetQueryiv, EXT);
638
RETURN_FN_WITH_SUFFIX(glGetQueryObjectiv, EXT);
639
RETURN_FN_WITH_SUFFIX(glGetQueryObjectuiv, EXT);
640
RETURN_FN_WITH_SUFFIX(glGetQueryObjecti64v, EXT);
641
RETURN_FN_WITH_SUFFIX(glGetQueryObjectui64v, EXT);
642
643
return 0;
644
}
645
646
void *emscripten_webgl1_get_proc_address(const char *name) {
647
RETURN_FN(glActiveTexture);
648
RETURN_FN(glAttachShader);
649
RETURN_FN(glBindAttribLocation);
650
RETURN_FN(glBindBuffer);
651
RETURN_FN(glBindFramebuffer);
652
RETURN_FN(glBindRenderbuffer);
653
RETURN_FN(glBindTexture);
654
RETURN_FN(glBlendColor);
655
RETURN_FN(glBlendEquation);
656
RETURN_FN(glBlendEquationSeparate);
657
RETURN_FN(glBlendFunc);
658
RETURN_FN(glBlendFuncSeparate);
659
RETURN_FN(glBufferData);
660
RETURN_FN(glBufferSubData);
661
RETURN_FN(glCheckFramebufferStatus);
662
RETURN_FN(glClear);
663
RETURN_FN(glClearColor);
664
RETURN_FN(glClearDepthf);
665
RETURN_FN(glClearStencil);
666
RETURN_FN(glColorMask);
667
RETURN_FN(glCompileShader);
668
RETURN_FN(glCompressedTexImage2D);
669
RETURN_FN(glCompressedTexSubImage2D);
670
RETURN_FN(glCopyTexImage2D);
671
RETURN_FN(glCopyTexSubImage2D);
672
RETURN_FN(glCreateProgram);
673
RETURN_FN(glCreateShader);
674
RETURN_FN(glCullFace);
675
RETURN_FN(glDeleteBuffers);
676
RETURN_FN(glDeleteFramebuffers);
677
RETURN_FN(glDeleteProgram);
678
RETURN_FN(glDeleteRenderbuffers);
679
RETURN_FN(glDeleteShader);
680
RETURN_FN(glDeleteTextures);
681
RETURN_FN(glDepthFunc);
682
RETURN_FN(glDepthMask);
683
RETURN_FN(glDepthRangef);
684
RETURN_FN(glDetachShader);
685
RETURN_FN(glDisable);
686
RETURN_FN(glDisableVertexAttribArray);
687
RETURN_FN(glDrawArrays);
688
RETURN_FN(glDrawElements);
689
RETURN_FN(glEnable);
690
RETURN_FN(glEnableVertexAttribArray);
691
RETURN_FN(glFinish);
692
RETURN_FN(glFlush);
693
RETURN_FN(glFramebufferRenderbuffer);
694
RETURN_FN(glFramebufferTexture2D);
695
RETURN_FN(glFrontFace);
696
RETURN_FN(glGenBuffers);
697
RETURN_FN(glGenerateMipmap);
698
RETURN_FN(glGenFramebuffers);
699
RETURN_FN(glGenRenderbuffers);
700
RETURN_FN(glGenTextures);
701
RETURN_FN(glGetActiveAttrib);
702
RETURN_FN(glGetActiveUniform);
703
RETURN_FN(glGetAttachedShaders);
704
RETURN_FN(glGetAttribLocation);
705
RETURN_FN(glGetBooleanv);
706
RETURN_FN(glGetBufferParameteriv);
707
RETURN_FN(glGetError);
708
RETURN_FN(glGetFloatv);
709
RETURN_FN(glGetFramebufferAttachmentParameteriv);
710
RETURN_FN(glGetIntegerv);
711
RETURN_FN(glGetProgramiv);
712
RETURN_FN(glGetProgramInfoLog);
713
RETURN_FN(glGetRenderbufferParameteriv);
714
RETURN_FN(glGetShaderiv);
715
RETURN_FN(glGetShaderInfoLog);
716
RETURN_FN(glGetShaderPrecisionFormat);
717
RETURN_FN(glGetShaderSource);
718
RETURN_FN(glGetString);
719
RETURN_FN(glGetTexParameterfv);
720
RETURN_FN(glGetTexParameteriv);
721
RETURN_FN(glGetUniformfv);
722
RETURN_FN(glGetUniformiv);
723
RETURN_FN(glGetUniformLocation);
724
RETURN_FN(glGetVertexAttribfv);
725
RETURN_FN(glGetVertexAttribiv);
726
RETURN_FN(glGetVertexAttribPointerv);
727
RETURN_FN(glHint);
728
RETURN_FN(glIsBuffer);
729
RETURN_FN(glIsEnabled);
730
RETURN_FN(glIsFramebuffer);
731
RETURN_FN(glIsProgram);
732
RETURN_FN(glIsRenderbuffer);
733
RETURN_FN(glIsShader);
734
RETURN_FN(glIsTexture);
735
RETURN_FN(glLineWidth);
736
RETURN_FN(glLinkProgram);
737
RETURN_FN(glPixelStorei);
738
RETURN_FN(glPolygonOffset);
739
RETURN_FN(glReadPixels);
740
RETURN_FN(glReleaseShaderCompiler);
741
RETURN_FN(glRenderbufferStorage);
742
RETURN_FN(glSampleCoverage);
743
RETURN_FN(glScissor);
744
RETURN_FN(glShaderBinary);
745
RETURN_FN(glShaderSource);
746
RETURN_FN(glStencilFunc);
747
RETURN_FN(glStencilFuncSeparate);
748
RETURN_FN(glStencilMask);
749
RETURN_FN(glStencilMaskSeparate);
750
RETURN_FN(glStencilOp);
751
RETURN_FN(glStencilOpSeparate);
752
RETURN_FN(glTexImage2D);
753
RETURN_FN(glTexParameterf);
754
RETURN_FN(glTexParameterfv);
755
RETURN_FN(glTexParameteri);
756
RETURN_FN(glTexParameteriv);
757
RETURN_FN(glTexSubImage2D);
758
RETURN_FN(glUniform1f);
759
RETURN_FN(glUniform1fv);
760
RETURN_FN(glUniform1i);
761
RETURN_FN(glUniform1iv);
762
RETURN_FN(glUniform2f);
763
RETURN_FN(glUniform2fv);
764
RETURN_FN(glUniform2i);
765
RETURN_FN(glUniform2iv);
766
RETURN_FN(glUniform3f);
767
RETURN_FN(glUniform3fv);
768
RETURN_FN(glUniform3i);
769
RETURN_FN(glUniform3iv);
770
RETURN_FN(glUniform4f);
771
RETURN_FN(glUniform4fv);
772
RETURN_FN(glUniform4i);
773
RETURN_FN(glUniform4iv);
774
RETURN_FN(glUniformMatrix2fv);
775
RETURN_FN(glUniformMatrix3fv);
776
RETURN_FN(glUniformMatrix4fv);
777
RETURN_FN(glUseProgram);
778
RETURN_FN(glValidateProgram);
779
RETURN_FN(glVertexAttrib1f);
780
RETURN_FN(glVertexAttrib1fv);
781
RETURN_FN(glVertexAttrib2f);
782
RETURN_FN(glVertexAttrib2fv);
783
RETURN_FN(glVertexAttrib3f);
784
RETURN_FN(glVertexAttrib3fv);
785
RETURN_FN(glVertexAttrib4f);
786
RETURN_FN(glVertexAttrib4fv);
787
RETURN_FN(glVertexAttribPointer);
788
RETURN_FN(glViewport);
789
RETURN_FN(glGenQueriesEXT);
790
RETURN_FN(glDeleteQueriesEXT);
791
RETURN_FN(glIsQueryEXT);
792
RETURN_FN(glBeginQueryEXT);
793
RETURN_FN(glEndQueryEXT);
794
RETURN_FN(glQueryCounterEXT);
795
RETURN_FN(glGetQueryivEXT);
796
RETURN_FN(glGetQueryObjectivEXT);
797
RETURN_FN(glGetQueryObjectuivEXT);
798
RETURN_FN(glGetQueryObjecti64vEXT);
799
RETURN_FN(glGetQueryObjectui64vEXT);
800
801
// WebGL 1 Extensions
802
RETURN_FN(glBindVertexArrayOES);
803
RETURN_FN(glDeleteVertexArraysOES);
804
RETURN_FN(glGenVertexArraysOES);
805
RETURN_FN(glIsVertexArrayOES);
806
RETURN_FN(glDrawBuffersWEBGL);
807
RETURN_FN(glDrawArraysInstancedANGLE);
808
RETURN_FN(glDrawElementsInstancedANGLE);
809
RETURN_FN(glVertexAttribDivisorANGLE);
810
RETURN_FN(glGenQueriesEXT);
811
RETURN_FN(glDeleteQueriesEXT);
812
RETURN_FN(glIsQueryEXT);
813
RETURN_FN(glBeginQueryEXT);
814
RETURN_FN(glEndQueryEXT);
815
RETURN_FN(glQueryCounterEXT);
816
RETURN_FN(glGetQueryivEXT);
817
RETURN_FN(glGetQueryObjectivEXT);
818
RETURN_FN(glGetQueryObjectuivEXT);
819
RETURN_FN(glGetQueryObjecti64vEXT);
820
RETURN_FN(glGetQueryObjectui64vEXT);
821
RETURN_FN(glPolygonOffsetClampEXT);
822
RETURN_FN(glClipControlEXT);
823
RETURN_FN(glPolygonModeWEBGL);
824
825
return 0;
826
}
827
828
#endif
829
830