content/canvas/test/webgl-conformance/conformance/context/context-lost.html

changeset 0
6474c204b198
     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>

mercurial