1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/canvas/test/webgl-conformance/conformance/context/context-lost.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,325 @@ 1.4 +<!DOCTYPE html> 1.5 +<html> 1.6 +<head> 1.7 +<link rel="stylesheet" href="../../resources/js-test-style.css"/> 1.8 +<script src="../../resources/js-test-pre.js"></script> 1.9 +<script src="../resources/webgl-test.js"></script> 1.10 +<script src="../resources/webgl-test-utils.js"></script> 1.11 +<script> 1.12 +var wtu; 1.13 +var canvas; 1.14 +var gl; 1.15 +var shouldGenerateGLError; 1.16 +var extensionNames = [ 1.17 + "WEBKIT_WEBGL_lose_context", 1.18 + "MOZ_WEBGL_lose_context", 1.19 +]; 1.20 +var extensionName; 1.21 +var extension; 1.22 + 1.23 +var buffer; 1.24 +var framebuffer; 1.25 +var program; 1.26 +var renderbuffer; 1.27 +var shader; 1.28 +var texture; 1.29 +var uniformLocation; 1.30 +var arrayBuffer; 1.31 +var arrayBufferView 1.32 +var image; 1.33 +var video; 1.34 +var canvas2d; 1.35 +var ctx2d; 1.36 +var imageData; 1.37 +var float32array; 1.38 +var int32array; 1.39 + 1.40 +function init() 1.41 +{ 1.42 + wtu = WebGLTestUtils; 1.43 + canvas = document.getElementById("canvas"); 1.44 + gl = wtu.create3DContext(canvas); 1.45 + shouldGenerateGLError = wtu.shouldGenerateGLError; 1.46 + 1.47 + description("Tests behavior under a lost context"); 1.48 + 1.49 + if (window.initNonKhronosFramework) { 1.50 + window.initNonKhronosFramework(true); 1.51 + } 1.52 + 1.53 + // call testValidContext() before checking for the extension, because this is where we check 1.54 + // for the isContextLost() method, which we want to do regardless of the extension's presence. 1.55 + testValidContext(); 1.56 + 1.57 + for (var ii = 0; ii < extensionNames.length; ++ii) { 1.58 + extension = gl.getExtension(extensionNames[ii]); 1.59 + if (extension) { 1.60 + extensionName = extensionNames[ii]; 1.61 + break; 1.62 + } 1.63 + } 1.64 + if (!extension) { 1.65 + debug("Could not find lose_context extension under the following names: " + extensionNames.join(" ")); 1.66 + finishTest(); 1.67 + return false; 1.68 + } 1.69 + 1.70 + canvas.addEventListener("webglcontextlost", testLostContext, false); 1.71 + 1.72 + loseContext(); 1.73 +} 1.74 + 1.75 +function loseContext() 1.76 +{ 1.77 + debug(""); 1.78 + debug("Lose context"); 1.79 + 1.80 + // Note: this will cause the context to be lost, but the 1.81 + // webglcontextlost event listener to be queued. 1.82 + extension.loseContext(); 1.83 + debug(""); 1.84 +} 1.85 + 1.86 +function testValidContext() 1.87 +{ 1.88 + debug("Test valid context"); 1.89 + 1.90 + shouldBeFalse("gl.isContextLost()"); 1.91 + 1.92 + arrayBuffer = new ArrayBuffer(4); 1.93 + arrayBufferView = new Int8Array(arrayBuffer); 1.94 + 1.95 + // Generate resources for testing. 1.96 + buffer = gl.createBuffer(); 1.97 + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); 1.98 + framebuffer = gl.createFramebuffer(); 1.99 + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); 1.100 + program = wtu.setupSimpleTextureProgram(gl); 1.101 + renderbuffer = gl.createRenderbuffer(); 1.102 + gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer); 1.103 + shader = gl.createShader(gl.VERTEX_SHADER); 1.104 + texture = gl.createTexture(); 1.105 + gl.bindTexture(gl.TEXTURE_2D, texture); 1.106 + shouldBe("gl.getError()", "gl.NO_ERROR"); 1.107 + 1.108 + // Test is queries that will later be false 1.109 + shouldGenerateGLError(gl, gl.NO_ERROR, "gl.enable(gl.BLEND)"); 1.110 + shouldBeTrue("gl.isBuffer(buffer)"); 1.111 + shouldBeTrue("gl.isEnabled(gl.BLEND)"); 1.112 + shouldBeTrue("gl.isFramebuffer(framebuffer)"); 1.113 + shouldBeTrue("gl.isProgram(program)"); 1.114 + shouldBeTrue("gl.isRenderbuffer(renderbuffer)"); 1.115 + shouldBeTrue("gl.isShader(shader)"); 1.116 + shouldBeTrue("gl.isTexture(texture)"); 1.117 +} 1.118 + 1.119 +function testLostContext() 1.120 +{ 1.121 + debug("Test lost context"); 1.122 + 1.123 + // Functions with special return values. 1.124 + shouldBeTrue("gl.isContextLost()"); 1.125 + shouldBe("gl.getError()", "gl.CONTEXT_LOST_WEBGL"); 1.126 + shouldBe("gl.getError()", "gl.NO_ERROR"); 1.127 + shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_UNSUPPORTED"); 1.128 + shouldBe("gl.getAttribLocation(program, 'u_modelViewProjMatrix')", "-1"); 1.129 + shouldBe("gl.getVertexAttribOffset(0, gl.VERTEX_ATTRIB_ARRAY_POINTER)", "0"); 1.130 + 1.131 + // Test the extension itself. 1.132 + shouldGenerateGLError(gl, gl.INVALID_OPERATION, "extension.loseContext()"); 1.133 + 1.134 + image = document.createElement("img"); 1.135 + video = document.createElement("video"); 1.136 + canvas2d = document.createElement("canvas"); 1.137 + ctx2d = canvas2d.getContext("2d"); 1.138 + imageData = ctx2d.createImageData(1, 1); 1.139 + float32array = new Float32Array(1); 1.140 + int32array = new Int32Array(1); 1.141 + 1.142 + // Functions returning void should return immediately. 1.143 + // This is untestable, but we can at least be sure they cause no errors 1.144 + // and the codepaths are exercised. 1.145 + var voidTests = [ 1.146 + "gl.activeTexture(gl.TEXTURE0)", 1.147 + "gl.attachShader(program, shader)", 1.148 + "gl.bindBuffer(gl.ARRAY_BUFFER, buffer)", 1.149 + "gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer)", 1.150 + "gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer)", 1.151 + "gl.bindTexture(gl.TEXTURE_2D, texture)", 1.152 + "gl.blendColor(1.0, 1.0, 1.0, 1.0)", 1.153 + "gl.blendEquation(gl.FUNC_ADD)", 1.154 + "gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD)", 1.155 + "gl.blendFunc(gl.ONE, gl.ONE)", 1.156 + "gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE)", 1.157 + "gl.bufferData(gl.ARRAY_BUFFER, 0, gl.STATIC_DRAW)", 1.158 + "gl.bufferData(gl.ARRAY_BUFFER, arrayBufferView, gl.STATIC_DRAW)", 1.159 + "gl.bufferData(gl.ARRAY_BUFFER, arrayBuffer, gl.STATIC_DRAW)", 1.160 + "gl.bufferSubData(gl.ARRAY_BUFFRE, 0, arrayBufferView)", 1.161 + "gl.bufferSubData(gl.ARRAY_BUFFRE, 0, arrayBuffer)", 1.162 + "gl.clear(gl.COLOR_BUFFER_BIT)", 1.163 + "gl.clearColor(1, 1, 1, 1)", 1.164 + "gl.clearDepth(1)", 1.165 + "gl.clearStencil(0)", 1.166 + "gl.colorMask(1, 1, 1, 1)", 1.167 + "gl.compileShader(shader)", 1.168 + "gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, 0, 0, 0)", 1.169 + "gl.copyTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, 0, 0)", 1.170 + "gl.cullFace(gl.FRONT)", 1.171 + "gl.deleteBuffer(buffer)", 1.172 + "gl.deleteFramebuffer(framebuffer)", 1.173 + "gl.deleteProgram(program)", 1.174 + "gl.deleteRenderbuffer(renderbuffer)", 1.175 + "gl.deleteShader(shader)", 1.176 + "gl.deleteTexture(texture)", 1.177 + "gl.depthFunc(gl.NEVER)", 1.178 + "gl.depthMask(0)", 1.179 + "gl.depthRange(0, 1)", 1.180 + "gl.detachShader(program, shader)", 1.181 + "gl.disable(gl.BLEND)", 1.182 + "gl.disableVertexAttribArray(0)", 1.183 + "gl.drawArrays(gl.POINTS, 0, 0)", 1.184 + "gl.drawElements(gl.POINTS, 0, gl.UNSIGNED_SHORT, 0)", 1.185 + "gl.enable(gl.BLEND)", 1.186 + "gl.enableVertexAttribArray(0)", 1.187 + "gl.finish()", 1.188 + "gl.flush()", 1.189 + "gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbuffer)", 1.190 + "gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0)", 1.191 + "gl.frontFace(gl.CW)", 1.192 + "gl.generateMipmap(gl.TEXTURE_2D)", 1.193 + "gl.hint(gl.GENERATE_MIPMAP_HINT, gl.FASTEST)", 1.194 + "gl.lineWidth(0)", 1.195 + "gl.linkProgram(program)", 1.196 + "gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, 0)", 1.197 + "gl.polygonOffset(0, 0)", 1.198 + "gl.readPixels(0, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, arrayBufferView)", 1.199 + "gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 0, 0)", 1.200 + "gl.sampleCoverage(0, 0)", 1.201 + "gl.scissor(0, 0, 0, 0)", 1.202 + "gl.shaderSource(shader, '')", 1.203 + "gl.stencilFunc(gl.NEVER, 0, 0)", 1.204 + "gl.stencilFuncSeparate(gl.FRONT, gl.NEVER, 0, 0)", 1.205 + "gl.stencilMask(0)", 1.206 + "gl.stencilMaskSeparate(gl.FRONT, 0)", 1.207 + "gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP)", 1.208 + "gl.stencilOpSeparate(gl.FRONT, gl.KEEP, gl.KEEP, gl.KEEP)", 1.209 + "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, arrayBufferView)", 1.210 + "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, imageData)", 1.211 + "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image)", 1.212 + "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas)", 1.213 + "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video)", 1.214 + "gl.texParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)", 1.215 + "gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)", 1.216 + "gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, arrayBufferView)", 1.217 + "gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData)", 1.218 + "gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, image)", 1.219 + "gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, canvas)", 1.220 + "gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, video)", 1.221 + "gl.uniform1f(uniformLocation, 0)", 1.222 + "gl.uniform1fv(uniformLocation, float32array)", 1.223 + "gl.uniform1fv(uniformLocation, [0])", 1.224 + "gl.uniform1i(uniformLocation, 0)", 1.225 + "gl.uniform1iv(uniformLocation, int32array)", 1.226 + "gl.uniform1iv(uniformLocation, [0])", 1.227 + "gl.uniform2f(uniformLocation, 0, 0)", 1.228 + "gl.uniform2fv(uniformLocation, float32array)", 1.229 + "gl.uniform2fv(uniformLocation, [0, 0])", 1.230 + "gl.uniform2i(uniformLocation, 0, 0)", 1.231 + "gl.uniform2iv(uniformLocation, int32array)", 1.232 + "gl.uniform2iv(uniformLocation, [0, 0])", 1.233 + "gl.uniform3f(uniformLocation, 0, 0, 0)", 1.234 + "gl.uniform3fv(uniformLocation, float32array)", 1.235 + "gl.uniform3fv(uniformLocation, [0, 0, 0])", 1.236 + "gl.uniform3i(uniformLocation, 0, 0, 0)", 1.237 + "gl.uniform3iv(uniformLocation, int32array)", 1.238 + "gl.uniform3iv(uniformLocation, [0, 0, 0])", 1.239 + "gl.uniform4f(uniformLocation, 0, 0, 0, 0)", 1.240 + "gl.uniform4fv(uniformLocation, float32array)", 1.241 + "gl.uniform4fv(uniformLocation, [0, 0, 0, 0])", 1.242 + "gl.uniform4i(uniformLocation, 0, 0, 0, 0)", 1.243 + "gl.uniform4iv(uniformLocation, int32array)", 1.244 + "gl.uniform4iv(uniformLocation, [0, 0, 0, 0])", 1.245 + "gl.uniformMatrix2fv(uniformLocation, false, float32array)", 1.246 + "gl.uniformMatrix2fv(uniformLocation, false, [0, 0, 0, 0])", 1.247 + "gl.uniformMatrix3fv(uniformLocation, false, float32array)", 1.248 + "gl.uniformMatrix3fv(uniformLocation, false, [0, 0, 0, 0, 0, 0, 0, 0, 0])", 1.249 + "gl.uniformMatrix4fv(uniformLocation, false, float32array)", 1.250 + "gl.uniformMatrix4fv(uniformLocation, false, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])", 1.251 + "gl.useProgram(program)", 1.252 + "gl.validateProgram(program)", 1.253 + "gl.vertexAttrib1f(0, 0)", 1.254 + "gl.vertexAttrib1fv(0, float32array)", 1.255 + "gl.vertexAttrib1fv(0, [0])", 1.256 + "gl.vertexAttrib2f(0, 0, 0)", 1.257 + "gl.vertexAttrib2fv(0, float32array)", 1.258 + "gl.vertexAttrib2fv(0, [0, 0])", 1.259 + "gl.vertexAttrib3f(0, 0, 0, 0)", 1.260 + "gl.vertexAttrib3fv(0, float32array)", 1.261 + "gl.vertexAttrib3fv(0, [0, 0, 0])", 1.262 + "gl.vertexAttrib4f(0, 0, 0, 0, 0)", 1.263 + "gl.vertexAttrib4fv(0, float32array)", 1.264 + "gl.vertexAttrib4fv(0, [0, 0, 0, 0])", 1.265 + "gl.vertexAttribPointer(0, 0, gl.FLOAT, false, 0, 0)", 1.266 + "gl.viewport(0, 0, 0, 0)", 1.267 + ]; 1.268 + for (var i = 0; i < voidTests.length; ++i) { 1.269 + shouldGenerateGLError(gl, gl.NO_ERROR, voidTests[i]); 1.270 + } 1.271 + 1.272 + // Functions return nullable values should all return null. 1.273 + var nullTests = [ 1.274 + "gl.createBuffer()", 1.275 + "gl.createFramebuffer()", 1.276 + "gl.createProgram()", 1.277 + "gl.createRenderbuffer()", 1.278 + "gl.createShader(gl.GL_VERTEX_SHADER)", 1.279 + "gl.createTexture()", 1.280 + "gl.getActiveAttrib(program, 0)", 1.281 + "gl.getActiveUniform(program, 0)", 1.282 + "gl.getAttachedShaders(program)", 1.283 + "gl.getBufferParameter(gl.ARRAY_BUFFER, gl.BUFFER_SIZE)", 1.284 + // Disabled pending test suite issue: 1.285 + // "gl.getContextAttributes()", 1.286 + "gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME)", 1.287 + "gl.getParameter(gl.CURRENT_PROGRAM)", 1.288 + "gl.getProgramInfoLog(program)", 1.289 + "gl.getProgramParameter(program, gl.LINK_STATUS)", 1.290 + "gl.getRenderbufferParameter(gl.RENDERBUFFER, gl.RENDERBUFFER_WIDTH)", 1.291 + "gl.getShaderInfoLog(shader)", 1.292 + "gl.getShaderParameter(shader, gl.SHADER_TYPE)", 1.293 + "gl.getShaderSource(shader)", 1.294 + "gl.getTexParameter(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S)", 1.295 + "gl.getUniform(program, uniformLocation)", 1.296 + "gl.getUniformLocation(program, 'vPosition')", 1.297 + "gl.getVertexAttrib(0, gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING)", 1.298 + "gl.getSupportedExtensions()", 1.299 + "gl.getExtension('" + extensionName + "')", 1.300 + ]; 1.301 + for (var i = 0; i < nullTests.length; ++i) { 1.302 + shouldBeNull(nullTests[i]); 1.303 + } 1.304 + 1.305 + // "Is" queries should all return false. 1.306 + shouldBeFalse("gl.isBuffer(buffer)"); 1.307 + shouldBeFalse("gl.isEnabled(gl.BLEND)"); 1.308 + shouldBeFalse("gl.isFramebuffer(framebuffer)"); 1.309 + shouldBeFalse("gl.isProgram(program)"); 1.310 + shouldBeFalse("gl.isRenderbuffer(renderbuffer)"); 1.311 + shouldBeFalse("gl.isShader(shader)"); 1.312 + shouldBeFalse("gl.isTexture(texture)"); 1.313 + 1.314 + shouldBe("gl.getError()", "gl.NO_ERROR"); 1.315 + 1.316 + debug(""); 1.317 + 1.318 + finishTest(); 1.319 +} 1.320 + 1.321 +</script> 1.322 +</head> 1.323 +<body onload="init()"> 1.324 +<div id="description"></div> 1.325 +<div id="console"></div> 1.326 +<canvas id="canvas"> 1.327 +</body> 1.328 +</html>