/* Copyright (c) 2019 The Khronos Group Inc. Use of this source code is governed by an MIT-style license that can be found in the LICENSE.txt file. */ // Some variables that will be used in this file var canvas; var gl; var OES_vertex_array_object; var uniformLocation; var extension; var buffer; var framebuffer; var program; var renderbuffer; var shader; var texture; var arrayBuffer; var arrayBufferView; var vertexArrayObject; var imageData; var float32array; var int32array; var OES_texture_float; var new_WEBGL_lose_context; var allowRestore; var contextLostEventFired; var contextRestoredEventFired; var newExtension; function compareGLError(glError, evalStr) { var exception; try { eval(evalStr); } catch (e) { exception = e; } if (exception) { return false; } else { if (gl.getError() == glError) return true; return false; } } function contextCreation(contextType) { canvas = new OffscreenCanvas(10, 10); gl = canvas.getContext(contextType); if (contextType == 'webgl') { if (gl instanceof WebGLRenderingContext) return true; return false; } else if (contextType == 'webgl2') { if (gl instanceof WebGL2RenderingContext) return true; return false; } else { return false; } } function transferredOffscreenCanvasCreation(placeholder, width, height) { placeholder.width = width; placeholder.height = height; return placeholder.transferControlToOffscreen(); } function assertWidthAndHeight(entity, entityName, width, height) { if (entity.width == width && entity.height == height) { testPassed("The width and height of " + entityName + " are correct."); return; } var errMsg = ""; if (entity.width != width) { errMsg += "The width of " + entityName + " is " + entity.width + " while expected value is " + width + ". "; } if (entity.height != height) { errMsg += "The height of " + entityName + " is " + entity.height + " while expected value is " + height + ". "; } testFailed(errMsg); } var webgl1Methods = [ "getContextAttributes", "activeTexture", "attachShader", "bindAttribLocation", "bindBuffer", "bindFramebuffer", "bindRenderbuffer", "bindTexture", "blendColor", "blendEquation", "blendEquationSeparate", "blendFunc", "blendFuncSeparate", "bufferData", "bufferSubData", "checkFramebufferStatus", "clear", "clearColor", "clearDepth", "clearStencil", "colorMask", "compileShader", "compressedTexImage2D", "compressedTexSubImage2D", "copyTexImage2D", "copyTexSubImage2D", "createBuffer", "createFramebuffer", "createProgram", "createRenderbuffer", "createShader", "createTexture", "cullFace", "deleteBuffer", "deleteFramebuffer", "deleteProgram", "deleteRenderbuffer", "deleteShader", "deleteTexture", "depthFunc", "depthMask", "depthRange", "detachShader", "disable", "disableVertexAttribArray", "drawArrays", "drawElements", "enable", "enableVertexAttribArray", "finish", "flush", "framebufferRenderbuffer", "framebufferTexture2D", "frontFace", "generateMipmap", "getActiveAttrib", "getActiveUniform", "getAttachedShaders", "getAttribLocation", "getParameter", "getBufferParameter", "getError", "getExtension", "getFramebufferAttachmentParameter", "getProgramParameter", "getProgramInfoLog", "getRenderbufferParameter", "getShaderParameter", "getShaderInfoLog", "getShaderPrecisionFormat", "getShaderSource", "getSupportedExtensions", "getTexParameter", "getUniform", "getUniformLocation", "getVertexAttrib", "getVertexAttribOffset", "hint", "isBuffer", "isContextLost", "isEnabled", "isFramebuffer", "isProgram", "isRenderbuffer", "isShader", "isTexture", "lineWidth", "linkProgram", "pixelStorei", "polygonOffset", "readPixels", "renderbufferStorage", "sampleCoverage", "scissor", "shaderSource", "stencilFunc", "stencilFuncSeparate", "stencilMask", "stencilMaskSeparate", "stencilOp", "stencilOpSeparate", "texImage2D", "texParameterf", "texParameteri", "texSubImage2D", "uniform1f", "uniform1fv", "uniform1i", "uniform1iv", "uniform2f", "uniform2fv", "uniform2i", "uniform2iv", "uniform3f", "uniform3fv", "uniform3i", "uniform3iv", "uniform4f", "uniform4fv", "uniform4i", "uniform4iv", "uniformMatrix2fv", "uniformMatrix3fv", "uniformMatrix4fv", "useProgram", "validateProgram", "vertexAttrib1f", "vertexAttrib1fv", "vertexAttrib2f", "vertexAttrib2fv", "vertexAttrib3f", "vertexAttrib3fv", "vertexAttrib4f", "vertexAttrib4fv", "vertexAttribPointer", "viewport", ]; var webgl2Methods = [ "getBufferSubData", "copyBufferSubData", "blitFramebuffer", "framebufferTextureLayer", "getInternalformatParameter", "invalidateFramebuffer", "invalidateSubFramebuffer", "readBuffer", "renderbufferStorageMultisample", "texImage3D", "texStorage2D", "texStorage3D", "texSubImage3D", "copyTexSubImage3D", "compressedTexImage3D", "compressedTexSubImage3D", "getFragDataLocation", "uniform1ui", "uniform2ui", "uniform3ui", "uniform4ui", "uniform1uiv", "uniform2uiv", "uniform3uiv", "uniform4uiv", "uniformMatrix2x3fv", "uniformMatrix3x2fv", "uniformMatrix2x4fv", "uniformMatrix4x2fv", "uniformMatrix3x4fv", "uniformMatrix4x3fv", "vertexAttribI4i", "vertexAttribI4iv", "vertexAttribI4ui", "vertexAttribI4uiv", "vertexAttribIPointer", "vertexAttribDivisor", "drawArraysInstanced", "drawElementsInstanced", "drawRangeElements", "drawBuffers", "clearBufferiv", "clearBufferuiv", "clearBufferfv", "clearBufferfi", "createQuery", "deleteQuery", "isQuery", "beginQuery", "endQuery", "getQuery", "getQueryParameter", "createSampler", "deleteSampler", "isSampler", "bindSampler", "samplerParameteri", "samplerParameterf", "getSamplerParameter", "fenceSync", "isSync", "deleteSync", "clientWaitSync", "waitSync", "getSyncParameter", "createTransformFeedback", "deleteTransformFeedback", "isTransformFeedback", "bindTransformFeedback", "beginTransformFeedback", "endTransformFeedback", "transformFeedbackVaryings", "getTransformFeedbackVarying", "pauseTransformFeedback", "resumeTransformFeedback", "bindBufferBase", "bindBufferRange", "getIndexedParameter", "getUniformIndices", "getActiveUniforms", "getUniformBlockIndex", "getActiveUniformBlockParameter", "getActiveUniformBlockName", "uniformBlockBinding", "createVertexArray", "deleteVertexArray", "isVertexArray", "bindVertexArray", ]; function assertFunction(v, f) { try { if (typeof v[f] != "function") { return false; } else { return true; } } catch(e) { return false; } } function testAPIs(contextType) { canvas = new OffscreenCanvas(10, 10); gl = canvas.getContext(contextType); var passed = true; var methods; if (contextType == 'webgl') methods = webgl1Methods; else methods = webgl1Methods.concat(webgl2Methods); for (var i=0; i