/* * Copyright (c) 2024 lax1dude. All Rights Reserved. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */ const VAO_IMPL_NONE = -1; const VAO_IMPL_CORE = 0; const VAO_IMPL_OES = 1; const INSTANCE_IMPL_NONE = -1; const INSTANCE_IMPL_CORE = 0; const INSTANCE_IMPL_ANGLE = 1; const CAP_A_BIT_EXT_GPU_SHADER5 = 1; const CAP_A_BIT_OES_GPU_SHADER5 = 2; const CAP_A_BIT_FBO_RENDER_MIPMAP = 4; const CAP_A_BIT_TEXTURE_LOD_CAPABLE = 8; const CAP_A_BIT_NPOT_CAPABLE = 16; const CAP_A_BIT_HDR_FBO16F = 32; const CAP_A_BIT_HDR_FBO32F = 64; const CAP_A_BIT_ANISOTROPIC = 128; const CAP_B_BIT_HDR_LINEAR16F = 1; const CAP_B_BIT_HDR_LINEAR32F = 2; const platfOpenGLName = "platformOpenGL"; /** * @param {WebGL2RenderingContext} ctx * @param {number} glesVersIn * @param {boolean} allowExts * @param {Object} glImports */ function setCurrentGLContext(ctx, glesVersIn, allowExts, glImports) { const wglExtVAO = (allowExts && glesVersIn === 200) ? ctx.getExtension("OES_vertex_array_object") : null; const wglExtInstancing = (allowExts && glesVersIn === 200) ? ctx.getExtension("ANGLE_instanced_arrays") : null; const hasANGLEInstancedArrays = allowExts && glesVersIn === 200 && wglExtInstancing !== null; const hasEXTColorBufferFloat = allowExts && (glesVersIn === 310 || glesVersIn === 300) && ctx.getExtension("EXT_color_buffer_float") !== null; const hasEXTColorBufferHalfFloat = allowExts && !hasEXTColorBufferFloat && (glesVersIn === 310 || glesVersIn === 300 || glesVersIn === 200) && ctx.getExtension("EXT_color_buffer_half_float") !== null; const hasEXTShaderTextureLOD = allowExts && glesVersIn === 200 && ctx.getExtension("EXT_shader_texture_lod") !== null; const hasOESFBORenderMipmap = allowExts && glesVersIn === 200 && ctx.getExtension("OES_fbo_render_mipmap") !== null; const hasOESVertexArrayObject = allowExts && glesVersIn === 200 && wglExtVAO !== null; const hasOESTextureFloat = allowExts && glesVersIn === 200 && ctx.getExtension("OES_texture_float") !== null; const hasOESTextureFloatLinear = allowExts && glesVersIn >= 300 && ctx.getExtension("OES_texture_float_linear") !== null; const hasOESTextureHalfFloat = allowExts && glesVersIn === 200 && ctx.getExtension("OES_texture_half_float") !== null; const hasOESTextureHalfFloatLinear = allowExts && glesVersIn === 200 && ctx.getExtension("OES_texture_half_float_linear") !== null; const hasEXTTextureFilterAnisotropic = allowExts && ctx.getExtension("EXT_texture_filter_anisotropic") !== null; const hasWEBGLDebugRendererInfo = ctx.getExtension("WEBGL_debug_renderer_info") !== null; const hasFBO16FSupport = glesVersIn >= 320 || ((glesVersIn >= 300 || hasOESTextureFloat) && (hasEXTColorBufferFloat || hasEXTColorBufferHalfFloat)); const hasFBO32FSupport = glesVersIn >= 320 || ((glesVersIn >= 300 || hasOESTextureHalfFloat) && hasEXTColorBufferFloat); const hasLinearHDR16FSupport = glesVersIn >= 300 || hasOESTextureHalfFloatLinear; const hasLinearHDR32FSupport = glesVersIn >= 300 && hasOESTextureFloatLinear; const vertexArrayImpl = glesVersIn >= 300 ? VAO_IMPL_CORE : ((glesVersIn === 200 && hasOESVertexArrayObject) ? VAO_IMPL_OES : VAO_IMPL_NONE); const instancingImpl = glesVersIn >= 300 ? INSTANCE_IMPL_CORE : ((glesVersIn === 200 && hasANGLEInstancedArrays) ? INSTANCE_IMPL_ANGLE : INSTANCE_IMPL_NONE); const capBits = [ glesVersIn, vertexArrayImpl, instancingImpl, 0, 0 ]; if(glesVersIn >= 300 || hasOESFBORenderMipmap) capBits[3] |= CAP_A_BIT_FBO_RENDER_MIPMAP; if(glesVersIn >= 300 || hasEXTShaderTextureLOD) capBits[3] |= CAP_A_BIT_TEXTURE_LOD_CAPABLE; if(glesVersIn >= 300) capBits[3] |= CAP_A_BIT_NPOT_CAPABLE; if(hasFBO16FSupport) capBits[3] |= CAP_A_BIT_HDR_FBO16F; if(hasFBO32FSupport) capBits[3] |= CAP_A_BIT_HDR_FBO32F; if(hasEXTTextureFilterAnisotropic) capBits[3] |= CAP_A_BIT_ANISOTROPIC; if(hasLinearHDR16FSupport) capBits[4] |= CAP_B_BIT_HDR_LINEAR16F; if(hasLinearHDR32FSupport) capBits[4] |= CAP_B_BIT_HDR_LINEAR32F; /** * @param {number} idx * @return {number} */ glImports["getCapBits"] = function(idx) { return capBits[idx]; }; glImports["glEnable"] = ctx.enable.bind(ctx); glImports["glDisable"] = ctx.disable.bind(ctx); glImports["glClearColor"] = ctx.clearColor.bind(ctx); glImports["glClearDepth"] = ctx.clearDepth.bind(ctx); glImports["glClear"] = ctx.clear.bind(ctx); glImports["glDepthFunc"] = ctx.depthFunc.bind(ctx); glImports["glDepthMask"] = ctx.depthMask.bind(ctx); glImports["glCullFace"] = ctx.cullFace.bind(ctx); glImports["glViewport"] = ctx.viewport.bind(ctx); glImports["glBlendFunc"] = ctx.blendFunc.bind(ctx); glImports["glBlendFuncSeparate"] = ctx.blendFuncSeparate.bind(ctx); glImports["glBlendEquation"] = ctx.blendEquation.bind(ctx); glImports["glBlendColor"] = ctx.blendColor.bind(ctx); glImports["glColorMask"] = ctx.colorMask.bind(ctx); glImports["glDrawBuffers"] = glesVersIn >= 300 ? ctx.drawBuffers.bind(ctx) : unsupportedFunc(platfOpenGLName, "glDrawBuffers"); glImports["glReadBuffer"] = glesVersIn >= 300 ? ctx.readBuffer.bind(ctx) : unsupportedFunc(platfOpenGLName, "glReadBuffer"); glImports["glReadPixels"] = ctx.readPixels.bind(ctx); glImports["glPolygonOffset"] = ctx.polygonOffset.bind(ctx); glImports["glLineWidth"] = ctx.lineWidth.bind(ctx); glImports["glGenBuffers"] = ctx.createBuffer.bind(ctx); glImports["glGenTextures"] = ctx.createTexture.bind(ctx); glImports["glCreateProgram"] = ctx.createProgram.bind(ctx); glImports["glCreateShader"] = ctx.createShader.bind(ctx); glImports["glCreateFramebuffer"] = ctx.createFramebuffer.bind(ctx); glImports["glCreateRenderbuffer"] = ctx.createRenderbuffer.bind(ctx); glImports["glGenQueries"] = glesVersIn >= 300 ? ctx.createQuery.bind(ctx) : unsupportedFunc(platfOpenGLName, "glGenQueries"); glImports["glDeleteBuffers"] = ctx.deleteBuffer.bind(ctx); glImports["glDeleteTextures"] = ctx.deleteTexture.bind(ctx); glImports["glDeleteProgram"] = ctx.deleteProgram.bind(ctx); glImports["glDeleteShader"] = ctx.deleteShader.bind(ctx); glImports["glDeleteFramebuffer"] = ctx.deleteFramebuffer.bind(ctx); glImports["glDeleteRenderbuffer"] = ctx.deleteRenderbuffer.bind(ctx); glImports["glDeleteQueries"] = glesVersIn >= 300 ? ctx.deleteQuery.bind(ctx) : unsupportedFunc(platfOpenGLName, "glDeleteQueries"); glImports["glBindBuffer"] = ctx.bindBuffer.bind(ctx); glImports["glBufferData"] = ctx.bufferData.bind(ctx); glImports["glBufferSubData"] = ctx.bufferSubData.bind(ctx); glImports["glEnableVertexAttribArray"] = ctx.enableVertexAttribArray.bind(ctx); glImports["glDisableVertexAttribArray"] = ctx.disableVertexAttribArray.bind(ctx); glImports["glVertexAttribPointer"] = ctx.vertexAttribPointer.bind(ctx); glImports["glActiveTexture"] = ctx.activeTexture.bind(ctx); glImports["glBindTexture"] = ctx.bindTexture.bind(ctx); glImports["glTexParameterf"] = ctx.texParameterf.bind(ctx); glImports["glTexParameteri"] = ctx.texParameteri.bind(ctx); glImports["glTexImage3D"] = glesVersIn >= 300 ? ctx.texImage3D.bind(ctx) : unsupportedFunc(platfOpenGLName, "glTexImage3D"); glImports["glTexImage2D"] = ctx.texImage2D.bind(ctx); glImports["glTexSubImage2D"] = ctx.texSubImage2D.bind(ctx); glImports["glCopyTexSubImage2D"] = ctx.copyTexSubImage2D.bind(ctx); glImports["glTexStorage2D"] = glesVersIn >= 300 ? ctx.texStorage2D.bind(ctx) : unsupportedFunc(platfOpenGLName, "glTexStorage2D"); glImports["glPixelStorei"] = ctx.pixelStorei.bind(ctx); glImports["glGenerateMipmap"] = ctx.generateMipmap.bind(ctx); glImports["glShaderSource"] = ctx.shaderSource.bind(ctx); glImports["glCompileShader"] = ctx.compileShader.bind(ctx); glImports["glGetShaderi"] = ctx.getShaderParameter.bind(ctx); glImports["glGetShaderInfoLog"] = ctx.getShaderInfoLog.bind(ctx); glImports["glUseProgram"] = ctx.useProgram.bind(ctx); glImports["glAttachShader"] = ctx.attachShader.bind(ctx); glImports["glDetachShader"] = ctx.detachShader.bind(ctx); glImports["glLinkProgram"] = ctx.linkProgram.bind(ctx); glImports["glGetProgrami"] = ctx.getProgramParameter.bind(ctx); glImports["glGetProgramInfoLog"] = ctx.getProgramInfoLog.bind(ctx); glImports["glDrawArrays"] = ctx.drawArrays.bind(ctx); glImports["glDrawElements"] = ctx.drawElements.bind(ctx); glImports["glBindAttribLocation"] = ctx.bindAttribLocation.bind(ctx); glImports["glGetAttribLocation"] = ctx.getAttribLocation.bind(ctx); glImports["glGetUniformLocation"] = ctx.getUniformLocation.bind(ctx); glImports["glGetUniformBlockIndex"] = glesVersIn >= 300 ? ctx.getUniformBlockIndex.bind(ctx) : unsupportedFunc(platfOpenGLName, "glGetUniformBlockIndex"); glImports["glBindBufferRange"] = glesVersIn >= 300 ? ctx.bindBufferRange.bind(ctx) : unsupportedFunc(platfOpenGLName, "glBindBufferRange"); glImports["glUniformBlockBinding"] = glesVersIn >= 300 ? ctx.uniformBlockBinding.bind(ctx) : unsupportedFunc(platfOpenGLName, "glUniformBlockBinding"); glImports["glUniform1f"] = ctx.uniform1f.bind(ctx); glImports["glUniform2f"] = ctx.uniform2f.bind(ctx); glImports["glUniform3f"] = ctx.uniform3f.bind(ctx); glImports["glUniform4f"] = ctx.uniform4f.bind(ctx); glImports["glUniform1i"] = ctx.uniform1i.bind(ctx); glImports["glUniform2i"] = ctx.uniform2i.bind(ctx); glImports["glUniform3i"] = ctx.uniform3i.bind(ctx); glImports["glUniform4i"] = ctx.uniform4i.bind(ctx); glImports["glUniformMatrix2fv"] = ctx.uniformMatrix2fv.bind(ctx); glImports["glUniformMatrix3fv"] = ctx.uniformMatrix3fv.bind(ctx); glImports["glUniformMatrix4fv"] = ctx.uniformMatrix4fv.bind(ctx); glImports["glUniformMatrix3x2fv"] = glesVersIn >= 300 ? ctx.uniformMatrix3x2fv.bind(ctx) : unsupportedFunc(platfOpenGLName, "glUniformMatrix3x2fv"); glImports["glUniformMatrix4x2fv"] = glesVersIn >= 300 ? ctx.uniformMatrix4x2fv.bind(ctx) : unsupportedFunc(platfOpenGLName, "glUniformMatrix4x2fv"); glImports["glUniformMatrix4x3fv"] = glesVersIn >= 300 ? ctx.uniformMatrix4x3fv.bind(ctx) : unsupportedFunc(platfOpenGLName, "glUniformMatrix4x3fv"); glImports["glBindFramebuffer"] = ctx.bindFramebuffer.bind(ctx); glImports["glCheckFramebufferStatus"] = ctx.checkFramebufferStatus.bind(ctx); glImports["glBlitFramebuffer"] = glesVersIn >= 300 ? ctx.blitFramebuffer.bind(ctx) : unsupportedFunc(platfOpenGLName, "glBlitFramebuffer"); glImports["glRenderbufferStorage"] = ctx.renderbufferStorage.bind(ctx); glImports["glFramebufferTexture2D"] = ctx.framebufferTexture2D.bind(ctx); glImports["glFramebufferTextureLayer"] = glesVersIn >= 300 ? ctx.framebufferTextureLayer.bind(ctx) : unsupportedFunc(platfOpenGLName, "glFramebufferTextureLayer"); glImports["glBindRenderbuffer"] = ctx.bindRenderbuffer.bind(ctx); glImports["glFramebufferRenderbuffer"] = ctx.framebufferRenderbuffer.bind(ctx); glImports["glGetError"] = ctx.getError.bind(ctx); glImports["getAllExtensions"] = ctx.getSupportedExtensions.bind(ctx); glImports["isContextLost"] = ctx.isContextLost.bind(ctx); const exts = []; if(hasANGLEInstancedArrays) exts.push("ANGLE_instanced_arrays"); if(hasEXTColorBufferFloat) exts.push("EXT_color_buffer_float"); if(hasEXTColorBufferHalfFloat) exts.push("EXT_color_buffer_half_float"); if(hasEXTShaderTextureLOD) exts.push("EXT_shader_texture_lod"); if(hasOESFBORenderMipmap) exts.push("OES_fbo_render_mipmap"); if(hasOESVertexArrayObject) exts.push("OES_vertex_array_object"); if(hasOESTextureFloat) exts.push("OES_texture_float"); if(hasOESTextureFloatLinear) exts.push("OES_texture_float_linear"); if(hasOESTextureHalfFloat) exts.push("OES_texture_half_float"); if(hasOESTextureHalfFloatLinear) exts.push("OES_texture_half_float_linear"); if(hasEXTTextureFilterAnisotropic) exts.push("EXT_texture_filter_anisotropic"); if(hasWEBGLDebugRendererInfo) exts.push("WEBGL_debug_renderer_info"); /** * @return {Array} */ glImports["dumpActiveExtensions"] = function() { return exts; }; /** * @param {number} p * @return {number} */ glImports["glGetInteger"] = function(p) { const ret = /** @type {*} */ (ctx.getParameter(p)); return (typeof ret === "number") ? (/** @type {number} */ (ret)) : 0; }; /** * @param {number} p * @return {string|null} */ glImports["glGetString"] = function(p) { var s; if(hasWEBGLDebugRendererInfo) { switch(p) { case 0x1f00: // VENDOR s = ctx.getParameter(0x9245); // UNMASKED_VENDOR_WEBGL if(s == null) { s = ctx.getParameter(0x1f00); // VENDOR } break; case 0x1f01: // RENDERER s = ctx.getParameter(0x9246); // UNMASKED_RENDERER_WEBGL if(s == null) { s = ctx.getParameter(0x1f01); // RENDERER } break; default: s = ctx.getParameter(p); break; } }else { s = ctx.getParameter(p); } if(typeof s === "string") { return s; }else { return null; } }; switch(vertexArrayImpl) { case VAO_IMPL_CORE: glImports["glGenVertexArrays"] = ctx.createVertexArray.bind(ctx); glImports["glDeleteVertexArrays"] = ctx.deleteVertexArray.bind(ctx); glImports["glBindVertexArray"] = ctx.bindVertexArray.bind(ctx); break; case VAO_IMPL_OES: glImports["glGenVertexArrays"] = wglExtVAO.createVertexArrayOES.bind(wglExtVAO); glImports["glDeleteVertexArrays"] = wglExtVAO.deleteVertexArrayOES.bind(wglExtVAO); glImports["glBindVertexArray"] = wglExtVAO.bindVertexArrayOES.bind(wglExtVAO); break; case VAO_IMPL_NONE: default: setUnsupportedFunc(glImports, platfOpenGLName, "glGenVertexArrays"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteVertexArrays"); setUnsupportedFunc(glImports, platfOpenGLName, "glBindVertexArray"); break; } switch(instancingImpl) { case INSTANCE_IMPL_CORE: glImports["glVertexAttribDivisor"] = ctx.vertexAttribDivisor.bind(ctx); glImports["glDrawArraysInstanced"] = ctx.drawArraysInstanced.bind(ctx); glImports["glDrawElementsInstanced"] = ctx.drawElementsInstanced.bind(ctx); break; case INSTANCE_IMPL_ANGLE: glImports["glVertexAttribDivisor"] = wglExtInstancing.vertexAttribDivisorANGLE.bind(wglExtInstancing); glImports["glDrawArraysInstanced"] = wglExtInstancing.drawArraysInstancedANGLE.bind(wglExtInstancing); glImports["glDrawElementsInstanced"] = wglExtInstancing.drawElementsInstancedANGLE.bind(wglExtInstancing); break; case INSTANCE_IMPL_NONE: default: setUnsupportedFunc(glImports, platfOpenGLName, "glVertexAttribDivisor"); setUnsupportedFunc(glImports, platfOpenGLName, "glDrawArraysInstanced"); setUnsupportedFunc(glImports, platfOpenGLName, "glDrawElementsInstanced"); break; } } function setNoGLContext(glImports) { setUnsupportedFunc(glImports, platfOpenGLName, "getCapBits"); setUnsupportedFunc(glImports, platfOpenGLName, "glEnable"); setUnsupportedFunc(glImports, platfOpenGLName, "glDisable"); setUnsupportedFunc(glImports, platfOpenGLName, "glClearColor"); setUnsupportedFunc(glImports, platfOpenGLName, "glClearDepth"); setUnsupportedFunc(glImports, platfOpenGLName, "glClear"); setUnsupportedFunc(glImports, platfOpenGLName, "glDepthFunc"); setUnsupportedFunc(glImports, platfOpenGLName, "glDepthMask"); setUnsupportedFunc(glImports, platfOpenGLName, "glCullFace"); setUnsupportedFunc(glImports, platfOpenGLName, "glViewport"); setUnsupportedFunc(glImports, platfOpenGLName, "glBlendFunc"); setUnsupportedFunc(glImports, platfOpenGLName, "glBlendFuncSeparate"); setUnsupportedFunc(glImports, platfOpenGLName, "glBlendEquation"); setUnsupportedFunc(glImports, platfOpenGLName, "glBlendColor"); setUnsupportedFunc(glImports, platfOpenGLName, "glColorMask"); setUnsupportedFunc(glImports, platfOpenGLName, "glDrawBuffers"); setUnsupportedFunc(glImports, platfOpenGLName, "glReadBuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glReadPixels"); setUnsupportedFunc(glImports, platfOpenGLName, "glPolygonOffset"); setUnsupportedFunc(glImports, platfOpenGLName, "glLineWidth"); setUnsupportedFunc(glImports, platfOpenGLName, "glGenBuffers"); setUnsupportedFunc(glImports, platfOpenGLName, "glGenTextures"); setUnsupportedFunc(glImports, platfOpenGLName, "glCreateProgram"); setUnsupportedFunc(glImports, platfOpenGLName, "glCreateShader"); setUnsupportedFunc(glImports, platfOpenGLName, "glCreateFramebuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glCreateRenderbuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glGenQueries"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteBuffers"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteTextures"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteProgram"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteShader"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteFramebuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteRenderbuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteQueries"); setUnsupportedFunc(glImports, platfOpenGLName, "glBindBuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glBufferData"); setUnsupportedFunc(glImports, platfOpenGLName, "glBufferSubData"); setUnsupportedFunc(glImports, platfOpenGLName, "glEnableVertexAttribArray"); setUnsupportedFunc(glImports, platfOpenGLName, "glDisableVertexAttribArray"); setUnsupportedFunc(glImports, platfOpenGLName, "glVertexAttribPointer"); setUnsupportedFunc(glImports, platfOpenGLName, "glActiveTexture"); setUnsupportedFunc(glImports, platfOpenGLName, "glBindTexture"); setUnsupportedFunc(glImports, platfOpenGLName, "glTexParameterf"); setUnsupportedFunc(glImports, platfOpenGLName, "glTexParameteri"); setUnsupportedFunc(glImports, platfOpenGLName, "glTexImage3D"); setUnsupportedFunc(glImports, platfOpenGLName, "glTexImage2D"); setUnsupportedFunc(glImports, platfOpenGLName, "glTexSubImage2D"); setUnsupportedFunc(glImports, platfOpenGLName, "glCopyTexSubImage2D"); setUnsupportedFunc(glImports, platfOpenGLName, "glTexStorage2D"); setUnsupportedFunc(glImports, platfOpenGLName, "glPixelStorei"); setUnsupportedFunc(glImports, platfOpenGLName, "glGenerateMipmap"); setUnsupportedFunc(glImports, platfOpenGLName, "glShaderSource"); setUnsupportedFunc(glImports, platfOpenGLName, "glCompileShader"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetShaderi"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetShaderInfoLog"); setUnsupportedFunc(glImports, platfOpenGLName, "glUseProgram"); setUnsupportedFunc(glImports, platfOpenGLName, "glAttachShader"); setUnsupportedFunc(glImports, platfOpenGLName, "glDetachShader"); setUnsupportedFunc(glImports, platfOpenGLName, "glLinkProgram"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetProgrami"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetProgramInfoLog"); setUnsupportedFunc(glImports, platfOpenGLName, "glDrawArrays"); setUnsupportedFunc(glImports, platfOpenGLName, "glDrawElements"); setUnsupportedFunc(glImports, platfOpenGLName, "glBindAttribLocation"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetAttribLocation"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetUniformLocation"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetUniformBlockIndex"); setUnsupportedFunc(glImports, platfOpenGLName, "glBindBufferRange"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniformBlockBinding"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform1f"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform2f"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform3f"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform4f"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform1i"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform2i"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform3i"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniform4i"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniformMatrix2fv"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniformMatrix3fv"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniformMatrix4fv"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniformMatrix3x2fv"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniformMatrix4x2fv"); setUnsupportedFunc(glImports, platfOpenGLName, "glUniformMatrix4x3fv") setUnsupportedFunc(glImports, platfOpenGLName, "glBindFramebuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glCheckFramebufferStatus"); setUnsupportedFunc(glImports, platfOpenGLName, "glBlitFramebuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glRenderbufferStorage"); setUnsupportedFunc(glImports, platfOpenGLName, "glFramebufferTexture2D"); setUnsupportedFunc(glImports, platfOpenGLName, "glFramebufferTextureLayer"); setUnsupportedFunc(glImports, platfOpenGLName, "glBindRenderbuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glFramebufferRenderbuffer"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetInteger"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetError"); setUnsupportedFunc(glImports, platfOpenGLName, "getAllExtensions"); setUnsupportedFunc(glImports, platfOpenGLName, "dumpActiveExtensions"); setUnsupportedFunc(glImports, platfOpenGLName, "glGetString"); setUnsupportedFunc(glImports, platfOpenGLName, "glGenVertexArrays"); setUnsupportedFunc(glImports, platfOpenGLName, "glDeleteVertexArrays"); setUnsupportedFunc(glImports, platfOpenGLName, "glBindVertexArray"); setUnsupportedFunc(glImports, platfOpenGLName, "glVertexAttribDivisor"); setUnsupportedFunc(glImports, platfOpenGLName, "glDrawArraysInstanced"); setUnsupportedFunc(glImports, platfOpenGLName, "glDrawElementsInstanced"); setUnsupportedFunc(glImports, platfOpenGLName, "isContextLost"); }