PageRenderTime 40ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/system/lib/gl/webgl2.c

https://github.com/SiggyBar/emscripten
C | 312 lines | 296 code | 10 blank | 6 comment | 3 complexity | 5f0274651aceca9ff1d890051805e811 MD5 | raw file
  1. #include <emscripten/threading.h>
  2. #include <emscripten.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <webgl/webgl1.h>
  6. #include <webgl/webgl2.h>
  7. #if defined(__EMSCRIPTEN_PTHREADS__) && defined(__EMSCRIPTEN_OFFSCREEN_FRAMEBUFFER__)
  8. ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glReadBuffer, GLenum);
  9. ASYNC_GL_FUNCTION_6(EM_FUNC_SIG_VIIIIII, void, glDrawRangeElements, GLenum, GLuint, GLuint, GLsizei, GLenum, const void *); // TODO: Not async if rendering from client side memory
  10. VOID_SYNC_GL_FUNCTION_10(EM_FUNC_SIG_VIIIIIIIIII, void, glTexImage3D, GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *);
  11. VOID_SYNC_GL_FUNCTION_11(EM_FUNC_SIG_VIIIIIIIIIII, void, glTexSubImage3D, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, const void *);
  12. ASYNC_GL_FUNCTION_9(EM_FUNC_SIG_VIIIIIIIII, void, glCopyTexSubImage3D, GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
  13. VOID_SYNC_GL_FUNCTION_9(EM_FUNC_SIG_VIIIIIIIII, void, glCompressedTexImage3D, GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const void *);
  14. VOID_SYNC_GL_FUNCTION_11(EM_FUNC_SIG_VIIIIIIIIIII, void, glCompressedTexSubImage3D, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const void *);
  15. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGenQueries, GLsizei, GLuint *);
  16. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteQueries, GLsizei, const GLuint *);
  17. RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsQuery, GLuint);
  18. ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBeginQuery, GLenum, GLuint);
  19. ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glEndQuery, GLenum);
  20. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetQueryiv, GLenum, GLenum, GLint *);
  21. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetQueryObjectuiv, GLuint, GLenum, GLuint *);
  22. #ifdef __EMSCRIPTEN_FULL_ES3__
  23. RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glUnmapBuffer, GLenum);
  24. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetBufferPointerv, GLenum, GLenum, void **);
  25. #endif
  26. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDrawBuffers, GLsizei, const GLenum *);
  27. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniformMatrix2x3fv, GLint, GLsizei, GLboolean, const GLfloat *);
  28. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniformMatrix3x2fv, GLint, GLsizei, GLboolean, const GLfloat *);
  29. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniformMatrix2x4fv, GLint, GLsizei, GLboolean, const GLfloat *);
  30. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniformMatrix4x2fv, GLint, GLsizei, GLboolean, const GLfloat *);
  31. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniformMatrix3x4fv, GLint, GLsizei, GLboolean, const GLfloat *);
  32. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniformMatrix4x3fv, GLint, GLsizei, GLboolean, const GLfloat *);
  33. ASYNC_GL_FUNCTION_10(EM_FUNC_SIG_VIIIIIIIIII, void, glBlitFramebuffer, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum);
  34. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glRenderbufferStorageMultisample, GLenum, GLsizei, GLenum, GLsizei, GLsizei);
  35. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glFramebufferTextureLayer, GLenum, GLenum, GLuint, GLint, GLint);
  36. #ifdef __EMSCRIPTEN_FULL_ES3__
  37. RET_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void *, glMapBufferRange, GLenum, GLintptr, GLsizeiptr, GLbitfield);
  38. ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glFlushMappedBufferRange, GLenum, GLintptr, GLsizeiptr);
  39. #endif
  40. ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glBindVertexArray, GLuint);
  41. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteVertexArrays, GLsizei, const GLuint *);
  42. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGenVertexArrays, GLsizei, GLuint *);
  43. RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsVertexArray, GLuint);
  44. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetIntegeri_v, GLenum, GLuint, GLint *);
  45. ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glBeginTransformFeedback, GLenum);
  46. ASYNC_GL_FUNCTION_0(EM_FUNC_SIG_V, void, glEndTransformFeedback);
  47. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glBindBufferRange, GLenum, GLuint, GLuint, GLintptr, GLsizeiptr);
  48. ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glBindBufferBase, GLenum, GLuint, GLuint);
  49. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glTransformFeedbackVaryings, GLuint, GLsizei, const GLchar *const*, GLenum);
  50. VOID_SYNC_GL_FUNCTION_7(EM_FUNC_SIG_VIIIIIII, void, glGetTransformFeedbackVarying, GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *);
  51. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glVertexAttribIPointer, GLuint, GLint, GLenum, GLsizei, const void *); // TODO: Not async if not rendering from client side memory
  52. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetVertexAttribIiv, GLuint, GLenum, GLint *);
  53. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetVertexAttribIuiv, GLuint, GLenum, GLuint *);
  54. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glVertexAttribI4i, GLuint, GLint, GLint, GLint, GLint);
  55. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glVertexAttribI4ui, GLuint, GLuint, GLuint, GLuint, GLuint);
  56. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glVertexAttribI4iv, GLuint, const GLint *);
  57. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glVertexAttribI4uiv, GLuint, const GLuint *);
  58. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetUniformuiv, GLuint, GLint, GLuint *);
  59. RET_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_III, GLint, glGetFragDataLocation, GLuint, const GLchar *);
  60. ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glUniform1ui, GLint, GLuint);
  61. ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glUniform2ui, GLint, GLuint, GLuint);
  62. ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glUniform3ui, GLint, GLuint, GLuint, GLuint);
  63. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glUniform4ui, GLint, GLuint, GLuint, GLuint, GLuint);
  64. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glUniform1uiv, GLint, GLsizei, const GLuint *);
  65. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glUniform2uiv, GLint, GLsizei, const GLuint *);
  66. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glUniform3uiv, GLint, GLsizei, const GLuint *);
  67. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glUniform4uiv, GLint, GLsizei, const GLuint *);
  68. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glClearBufferiv, GLenum, GLint, const GLint *);
  69. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glClearBufferuiv, GLenum, GLint, const GLuint *);
  70. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glClearBufferfv, GLenum, GLint, const GLfloat *);
  71. ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIFI, void, glClearBufferfi, GLenum, GLint, GLfloat, GLint);
  72. RET_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_III, const GLubyte *, glGetStringi, GLenum, GLuint);
  73. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glCopyBufferSubData, GLenum, GLenum, GLintptr, GLintptr, GLsizeiptr);
  74. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glGetUniformIndices, GLuint, GLsizei, const GLchar *const*, GLuint *);
  75. VOID_SYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glGetActiveUniformsiv, GLuint, GLsizei, const GLuint *, GLenum, GLint *);
  76. RET_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_III, GLuint, glGetUniformBlockIndex, GLuint, const GLchar *);
  77. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glGetActiveUniformBlockiv, GLuint, GLuint, GLenum, GLint *);
  78. VOID_SYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glGetActiveUniformBlockName, GLuint, GLuint, GLsizei, GLsizei *, GLchar *);
  79. ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glUniformBlockBinding, GLuint, GLuint, GLuint);
  80. ASYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glDrawArraysInstanced, GLenum, GLint, GLsizei, GLsizei);
  81. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glDrawElementsInstanced, GLenum, GLsizei, GLenum, const void *, GLsizei); // TODO: Not async if rendering from client side memory
  82. RET_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_III, GLsync, glFenceSync, GLenum, GLbitfield);
  83. RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsSync, GLsync);
  84. ASYNC_GL_FUNCTION_1(EM_FUNC_SIG_VI, void, glDeleteSync, GLsync);
  85. GLenum glClientWaitSync(GLsync p0, GLbitfield p1, GLuint64 p2) {
  86. GL_FUNCTION_TRACE(glClientWaitSync);
  87. if (pthread_getspecific(currentThreadOwnsItsWebGLContext))
  88. return emscripten_glClientWaitSync(p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
  89. else
  90. return (GLenum)emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_IIIII, &emscripten_glClientWaitSync, p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
  91. }
  92. void glWaitSync(GLsync p0, GLbitfield p1, GLuint64 p2) {
  93. GL_FUNCTION_TRACE(glWaitSync);
  94. if (pthread_getspecific(currentThreadOwnsItsWebGLContext))
  95. emscripten_glWaitSync(p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
  96. else
  97. emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VIIII, &emscripten_glWaitSync, p0, p1, p2 & 0xFFFFFFFF, (p2 >> 32) & 0xFFFFFFFF);
  98. }
  99. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGetInteger64v, GLenum, GLint64 *);
  100. VOID_SYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glGetSynciv, GLsync, GLenum, GLsizei, GLsizei *, GLint *);
  101. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetInteger64i_v, GLenum, GLuint, GLint64 *);
  102. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetBufferParameteri64v, GLenum, GLenum, GLint64 *);
  103. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGenSamplers, GLsizei, GLuint *);
  104. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteSamplers, GLsizei, const GLuint *);
  105. RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsSampler, GLuint);
  106. ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBindSampler, GLuint, GLuint);
  107. ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glSamplerParameteri, GLuint, GLenum, GLint);
  108. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glSamplerParameteriv, GLuint, GLenum, const GLint *);
  109. ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIIF, void, glSamplerParameterf, GLuint, GLenum, GLfloat);
  110. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glSamplerParameterfv, GLuint, GLenum, const GLfloat *);
  111. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetSamplerParameteriv, GLuint, GLenum, GLint *);
  112. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glGetSamplerParameterfv, GLuint, GLenum, GLfloat *);
  113. ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glVertexAttribDivisor, GLuint, GLuint);
  114. ASYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glBindTransformFeedback, GLenum, GLuint);
  115. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glDeleteTransformFeedbacks, GLsizei, const GLuint *);
  116. VOID_SYNC_GL_FUNCTION_2(EM_FUNC_SIG_VII, void, glGenTransformFeedbacks, GLsizei, GLuint *);
  117. RET_SYNC_GL_FUNCTION_1(EM_FUNC_SIG_II, GLboolean, glIsTransformFeedback, GLuint);
  118. ASYNC_GL_FUNCTION_0(EM_FUNC_SIG_V, void, glPauseTransformFeedback);
  119. ASYNC_GL_FUNCTION_0(EM_FUNC_SIG_V, void, glResumeTransformFeedback);
  120. VOID_SYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glGetProgramBinary, GLuint, GLsizei, GLsizei *, GLenum *, void *);
  121. VOID_SYNC_GL_FUNCTION_4(EM_FUNC_SIG_VIIII, void, glProgramBinary, GLuint, GLenum, const void *, GLsizei);
  122. ASYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glProgramParameteri, GLuint, GLenum, GLint);
  123. VOID_SYNC_GL_FUNCTION_3(EM_FUNC_SIG_VIII, void, glInvalidateFramebuffer, GLenum, GLsizei, const GLenum *);
  124. VOID_SYNC_GL_FUNCTION_7(EM_FUNC_SIG_VIIIIIII, void, glInvalidateSubFramebuffer, GLenum, GLsizei, const GLenum *, GLint, GLint, GLsizei, GLsizei);
  125. ASYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glTexStorage2D, GLenum, GLsizei, GLenum, GLsizei, GLsizei);
  126. ASYNC_GL_FUNCTION_6(EM_FUNC_SIG_VIIIIII, void, glTexStorage3D, GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei);
  127. VOID_SYNC_GL_FUNCTION_5(EM_FUNC_SIG_VIIIII, void, glGetInternalformativ, GLenum, GLenum, GLenum, GLsizei, GLint *);
  128. #endif // ~__EMSCRIPTEN_PTHREADS__
  129. // Extensions:
  130. GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV(GLuint index, GLuint divisor) { glVertexAttribDivisor(index, divisor); }
  131. GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT(GLuint index, GLuint divisor) { glVertexAttribDivisor(index, divisor); }
  132. GL_APICALL void GL_APIENTRY glVertexAttribDivisorARB(GLuint index, GLuint divisor) { glVertexAttribDivisor(index, divisor); }
  133. GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE(GLuint index, GLuint divisor) { glVertexAttribDivisor(index, divisor); }
  134. GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { glDrawArraysInstanced(mode, first, count, instancecount); }
  135. GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { glDrawArraysInstanced(mode, first, count, instancecount); }
  136. GL_APICALL void GL_APIENTRY glDrawArraysInstancedARB(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { glDrawArraysInstanced(mode, first, count, instancecount); }
  137. GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE(GLenum mode, GLint first, GLsizei count, GLsizei instancecount) { glDrawArraysInstanced(mode, first, count, instancecount); }
  138. GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount) { glDrawElementsInstanced(mode, count, type, indices, instancecount); }
  139. GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount) { glDrawElementsInstanced(mode, count, type, indices, instancecount); }
  140. GL_APICALL void GL_APIENTRY glDrawElementsInstancedARB(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount) { glDrawElementsInstanced(mode, count, type, indices, instancecount); }
  141. GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount) { glDrawElementsInstanced(mode, count, type, indices, instancecount); }
  142. GL_APICALL void GL_APIENTRY glBindVertexArrayOES(GLuint array) { glBindVertexArray(array); }
  143. GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES(GLsizei n, const GLuint *arrays) { glDeleteVertexArrays(n, arrays); }
  144. GL_APICALL void GL_APIENTRY glGenVertexArraysOES(GLsizei n, GLuint *arrays) { glGenVertexArrays(n, arrays); }
  145. GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES(GLuint array) { return glIsVertexArray(array); }
  146. GL_APICALL void GL_APIENTRY glDrawBuffersEXT(GLsizei n, const GLenum *bufs) { glDrawBuffers(n, bufs); }
  147. GL_APICALL void GL_APIENTRY glDrawBuffersWEBGL(GLsizei n, const GLenum *bufs) { glDrawBuffers(n, bufs); }
  148. // Returns a function pointer to the given WebGL 2 extension function, when queried without
  149. // a GL extension suffix such as "EXT", "OES", or "ANGLE". This function is used by
  150. // emscripten_GetProcAddress() to implement legacy GL emulation semantics for portability.
  151. void *_webgl2_match_ext_proc_address_without_suffix(const char *name)
  152. {
  153. RETURN_FN_WITH_SUFFIX(glVertexAttribDivisor, EXT);
  154. RETURN_FN_WITH_SUFFIX(glVertexAttribDivisor, ARB);
  155. RETURN_FN_WITH_SUFFIX(glVertexAttribDivisor, ANGLE);
  156. RETURN_FN_WITH_SUFFIX(glDrawArraysInstanced, EXT);
  157. RETURN_FN_WITH_SUFFIX(glDrawArraysInstanced, ARB);
  158. RETURN_FN_WITH_SUFFIX(glDrawArraysInstanced, ANGLE);
  159. RETURN_FN_WITH_SUFFIX(glDrawElementsInstanced, NV);
  160. RETURN_FN_WITH_SUFFIX(glDrawElementsInstanced, EXT);
  161. RETURN_FN_WITH_SUFFIX(glDrawElementsInstanced, ARB);
  162. RETURN_FN_WITH_SUFFIX(glDrawElementsInstanced, ANGLE);
  163. RETURN_FN_WITH_SUFFIX(glBindVertexArray, OES);
  164. RETURN_FN_WITH_SUFFIX(glDeleteVertexArrays, OES);
  165. RETURN_FN_WITH_SUFFIX(glGenVertexArrays, OES);
  166. RETURN_FN_WITH_SUFFIX(glIsVertexArray, OES);
  167. RETURN_FN_WITH_SUFFIX(glDrawBuffers, EXT);
  168. RETURN_FN_WITH_SUFFIX(glDrawBuffers, WEBGL);
  169. return 0;
  170. }
  171. void *emscripten_webgl2_get_proc_address(const char *name)
  172. {
  173. RETURN_FN(glReadBuffer);
  174. RETURN_FN(glDrawRangeElements);
  175. RETURN_FN(glTexImage3D);
  176. RETURN_FN(glTexSubImage3D);
  177. RETURN_FN(glCopyTexSubImage3D);
  178. RETURN_FN(glCompressedTexImage3D);
  179. RETURN_FN(glCompressedTexSubImage3D);
  180. RETURN_FN(glGenQueries);
  181. RETURN_FN(glDeleteQueries);
  182. RETURN_FN(glIsQuery);
  183. RETURN_FN(glBeginQuery);
  184. RETURN_FN(glEndQuery);
  185. RETURN_FN(glGetQueryiv);
  186. RETURN_FN(glGetQueryObjectuiv);
  187. #ifdef __EMSCRIPTEN_FULL_ES3__
  188. RETURN_FN(glUnmapBuffer);
  189. RETURN_FN(glGetBufferPointerv);
  190. #endif
  191. RETURN_FN(glDrawBuffers);
  192. RETURN_FN(glUniformMatrix2x3fv);
  193. RETURN_FN(glUniformMatrix3x2fv);
  194. RETURN_FN(glUniformMatrix2x4fv);
  195. RETURN_FN(glUniformMatrix4x2fv);
  196. RETURN_FN(glUniformMatrix3x4fv);
  197. RETURN_FN(glUniformMatrix4x3fv);
  198. RETURN_FN(glBlitFramebuffer);
  199. RETURN_FN(glRenderbufferStorageMultisample);
  200. RETURN_FN(glFramebufferTextureLayer);
  201. #ifdef __EMSCRIPTEN_FULL_ES3__
  202. RETURN_FN(glMapBufferRange);
  203. RETURN_FN(glFlushMappedBufferRange);
  204. #endif
  205. RETURN_FN(glBindVertexArray);
  206. RETURN_FN(glDeleteVertexArrays);
  207. RETURN_FN(glGenVertexArrays);
  208. RETURN_FN(glIsVertexArray);
  209. RETURN_FN(glGetIntegeri_v);
  210. RETURN_FN(glBeginTransformFeedback);
  211. RETURN_FN(glEndTransformFeedback);
  212. RETURN_FN(glBindBufferRange);
  213. RETURN_FN(glBindBufferBase);
  214. RETURN_FN(glTransformFeedbackVaryings);
  215. RETURN_FN(glGetTransformFeedbackVarying);
  216. RETURN_FN(glVertexAttribIPointer);
  217. RETURN_FN(glGetVertexAttribIiv);
  218. RETURN_FN(glGetVertexAttribIuiv);
  219. RETURN_FN(glVertexAttribI4i);
  220. RETURN_FN(glVertexAttribI4ui);
  221. RETURN_FN(glVertexAttribI4iv);
  222. RETURN_FN(glVertexAttribI4uiv);
  223. RETURN_FN(glGetUniformuiv);
  224. RETURN_FN(glGetFragDataLocation);
  225. RETURN_FN(glUniform1ui);
  226. RETURN_FN(glUniform2ui);
  227. RETURN_FN(glUniform3ui);
  228. RETURN_FN(glUniform4ui);
  229. RETURN_FN(glUniform1uiv);
  230. RETURN_FN(glUniform2uiv);
  231. RETURN_FN(glUniform3uiv);
  232. RETURN_FN(glUniform4uiv);
  233. RETURN_FN(glClearBufferiv);
  234. RETURN_FN(glClearBufferuiv);
  235. RETURN_FN(glClearBufferfv);
  236. RETURN_FN(glClearBufferfi);
  237. RETURN_FN(glGetStringi);
  238. RETURN_FN(glCopyBufferSubData);
  239. RETURN_FN(glGetUniformIndices);
  240. RETURN_FN(glGetActiveUniformsiv);
  241. RETURN_FN(glGetUniformBlockIndex);
  242. RETURN_FN(glGetActiveUniformBlockiv);
  243. RETURN_FN(glGetActiveUniformBlockName);
  244. RETURN_FN(glUniformBlockBinding);
  245. RETURN_FN(glDrawArraysInstanced);
  246. RETURN_FN(glDrawElementsInstanced);
  247. RETURN_FN(glFenceSync);
  248. RETURN_FN(glIsSync);
  249. RETURN_FN(glDeleteSync);
  250. RETURN_FN(glClientWaitSync);
  251. RETURN_FN(glWaitSync);
  252. RETURN_FN(glGetInteger64v);
  253. RETURN_FN(glGetSynciv);
  254. RETURN_FN(glGetInteger64i_v);
  255. RETURN_FN(glGetBufferParameteri64v);
  256. RETURN_FN(glGenSamplers);
  257. RETURN_FN(glDeleteSamplers);
  258. RETURN_FN(glIsSampler);
  259. RETURN_FN(glBindSampler);
  260. RETURN_FN(glSamplerParameteri);
  261. RETURN_FN(glSamplerParameteriv);
  262. RETURN_FN(glSamplerParameterf);
  263. RETURN_FN(glSamplerParameterfv);
  264. RETURN_FN(glGetSamplerParameteriv);
  265. RETURN_FN(glGetSamplerParameterfv);
  266. RETURN_FN(glVertexAttribDivisor);
  267. RETURN_FN(glBindTransformFeedback);
  268. RETURN_FN(glDeleteTransformFeedbacks);
  269. RETURN_FN(glGenTransformFeedbacks);
  270. RETURN_FN(glIsTransformFeedback);
  271. RETURN_FN(glPauseTransformFeedback);
  272. RETURN_FN(glResumeTransformFeedback);
  273. RETURN_FN(glGetProgramBinary);
  274. RETURN_FN(glProgramBinary);
  275. RETURN_FN(glProgramParameteri);
  276. RETURN_FN(glInvalidateFramebuffer);
  277. RETURN_FN(glInvalidateSubFramebuffer);
  278. RETURN_FN(glTexStorage2D);
  279. RETURN_FN(glTexStorage3D);
  280. RETURN_FN(glGetInternalformativ);
  281. RETURN_FN(glVertexAttribDivisorNV);
  282. RETURN_FN(glVertexAttribDivisorEXT);
  283. RETURN_FN(glVertexAttribDivisorARB);
  284. RETURN_FN(glVertexAttribDivisorANGLE);
  285. RETURN_FN(glDrawArraysInstancedNV);
  286. RETURN_FN(glDrawArraysInstancedEXT);
  287. RETURN_FN(glDrawArraysInstancedARB);
  288. RETURN_FN(glDrawArraysInstancedANGLE);
  289. RETURN_FN(glDrawElementsInstancedNV);
  290. RETURN_FN(glDrawElementsInstancedEXT);
  291. RETURN_FN(glDrawElementsInstancedARB);
  292. RETURN_FN(glDrawElementsInstancedANGLE);
  293. RETURN_FN(glBindVertexArrayOES);
  294. RETURN_FN(glDeleteVertexArraysOES);
  295. RETURN_FN(glGenVertexArraysOES);
  296. RETURN_FN(glIsVertexArrayOES);
  297. RETURN_FN(glDrawBuffersEXT);
  298. RETURN_FN(glDrawBuffersWEBGL);
  299. // WebGL 2 extensions:
  300. // (currently none)
  301. return 0;
  302. }