1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/canvas/test/webgl-conformance/extra/fbo-lost-context.html Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,199 @@ 1.4 +<!-- 1.5 +Copyright (c) 2009 The Chromium Authors. All rights reserved. 1.6 +Use of this source code is governed by a BSD-style license that can be 1.7 +found in the LICENSE file. 1.8 + --> 1.9 +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 1.10 + "http://www.w3.org/TR/html4/loose.dtd"> 1.11 +<html> 1.12 +<head> 1.13 +<meta charset="utf-8"> 1.14 +<title>WebGL FBO Lost Context Test</title> 1.15 +<link rel="stylesheet" href="../resources/js-test-style.css"/> 1.16 +<script src="../resources/desktop-gl-constants.js" type="text/javascript"></script> 1.17 +<script src="../../debug/webgl-debug.js"></script> 1.18 +<script src="../resources/js-test-pre.js"></script> 1.19 +<script src="../conformance/resources/webgl-test.js"></script> 1.20 +</head> 1.21 +<body> 1.22 +<div id="description"></div> 1.23 +<div id="console"></div> 1.24 +<script id="vshader" type="x-shader/x-vertex"> 1.25 +attribute vec4 vPosition; 1.26 +attribute vec2 texCoord0; 1.27 +uniform mat4 world; 1.28 +varying vec2 texCoord; 1.29 +void main() 1.30 +{ 1.31 + gl_Position = vPosition * world; 1.32 + texCoord = texCoord0; 1.33 +} 1.34 +</script> 1.35 + 1.36 +<script id="fshader" type="x-shader/x-fragment"> 1.37 +precision mediump float; 1.38 +uniform sampler2D tex; 1.39 +varying vec2 texCoord; 1.40 +void main() 1.41 +{ 1.42 + gl_FragColor = texture2D(tex, texCoord); 1.43 +} 1.44 +</script> 1.45 +<canvas id="canvas" width="1024" height="1024"> </canvas> 1.46 +<script> 1.47 +description("This test is to help see if an WebGL app *can* get lost context."); 1.48 + 1.49 +debug(""); 1.50 +debug("Canvas.getContext"); 1.51 +var g_worldLoc; 1.52 +var g_texLoc; 1.53 +var g_textures = []; 1.54 +gl = initWebGL("canvas", "vshader", "fshader", [ "vPosition", "texCoord0"], [ 0, 0, 0, 1 ], 1); 1.55 +if (!gl) { 1.56 + testFailed("context does not exist"); 1.57 +} else { 1.58 + testPassed("context exists"); 1.59 + 1.60 + debug(""); 1.61 + debug("Checking for out of memory handling."); 1.62 + 1.63 + var size = gl.getParameter(gl.MAX_RENDERBUFFER_SIZE); 1.64 + debug("max render buffer size: " + size); 1.65 + size = size / 2; 1.66 + debug("size used: " + size); 1.67 + 1.68 + var allocateFramebuffers = true; 1.69 + var itervalId; 1.70 + var count = 0; 1.71 + 1.72 + gl = WebGLDebugUtils.makeDebugContext(gl, function(err, functionName, args) { 1.73 + window.clearInterval(intervalId); 1.74 + assertMsg(err == gl.OUT_OF_MEMORY, 1.75 + "correctly returns gl.OUT_OF_MEMORY when out of memory"); 1.76 + finish(); 1.77 + }); 1.78 + 1.79 + function createFBO() { 1.80 + var tex = gl.createTexture(); 1.81 + gl.bindTexture(gl.TEXTURE_2D, tex); 1.82 + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); 1.83 + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); 1.84 + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 1.85 + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 1.86 + gl.texImage2D(gl.TEXTURE_2D, 1.87 + 0, // level 1.88 + gl.RGBA, // internalFormat 1.89 + size, // width 1.90 + size, // height 1.91 + 0, // border 1.92 + gl.RGBA, // format 1.93 + gl.UNSIGNED_BYTE, // type 1.94 + null); // data 1.95 + var fb = gl.createFramebuffer(); 1.96 + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 1.97 + gl.framebufferTexture2D( 1.98 + gl.FRAMEBUFFER, 1.99 + gl.COLOR_ATTACHMENT0, 1.100 + gl.TEXTURE_2D, 1.101 + tex, 1.102 + 0); 1.103 + var status = gl.checkFramebufferStatus(gl.FRAMEBUFFER); 1.104 + if (status != gl.FRAMEBUFFER_COMPLETE) { 1.105 + testFailed("gl.checkFramebufferStatus() returned " + WebGLDebugUtils.glEnumToString(status)); 1.106 + } 1.107 + return { fb: fb, tex: tex }; 1.108 + } 1.109 + 1.110 + gl.disable(gl.DEPTH_TEST); 1.111 + 1.112 + var numFBOs = 32; 1.113 + for (var ii = 0; ii < numFBOs; ++ii) { 1.114 + createFBO(); 1.115 + var t = createFBO(); 1.116 + tex = t.tex; 1.117 + fb = t.fb; 1.118 + 1.119 + gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 1.120 + gl.scissor(0, 0, size, size); 1.121 + gl.clearColor(0, ii / numFBOs, 1 - ii / numFBOs, 1); 1.122 + gl.clear(gl.COLOR_BUFFER_BIT); 1.123 + g_textures.push(tex); 1.124 + } 1.125 + 1.126 + gl.bindFramebuffer(gl.FRAMEBUFFER, null); 1.127 + 1.128 + var vertexObject = gl.createBuffer(); 1.129 + gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject); 1.130 + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 1.131 + -1,1,0, 1,1,0, -1,-1,0, 1.132 + -1,-1,0, 1,1,0, 1,-1,0 1.133 + ]), gl.STATIC_DRAW); 1.134 + gl.enableVertexAttribArray(0); 1.135 + gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0); 1.136 + 1.137 + var vertexObject = gl.createBuffer(); 1.138 + gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject); 1.139 + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 1.140 + 0,0, 1,0, 0,1, 1.141 + 0,1, 1,0, 1,1 1.142 + ]), gl.STATIC_DRAW); 1.143 + gl.enableVertexAttribArray(1); 1.144 + gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0); 1.145 + 1.146 + gl.bindTexture(gl.TEXTURE_2D, tex); 1.147 + g_texLoc = gl.getUniformLocation(gl.program, "tex"); 1.148 + gl.uniform1i(g_texLoc, 0); 1.149 + g_worldLoc = gl.getUniformLocation(gl.program, "world"); 1.150 + gl.uniformMatrix4fv(g_worldLoc, false, [ 1.151 + 0, 0, 0, 0, 1.152 + 0, 0, 0, 0, 1.153 + 0, 0, 1, 0, 1.154 + 0, 0, 0, 1]); 1.155 + 1.156 + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); 1.157 + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); 1.158 + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); 1.159 + 1.160 + setInterval(render, 1000/60); 1.161 +} 1.162 + 1.163 +var g_angle = 0; 1.164 +var g_texIndex = 0; 1.165 +function render() { 1.166 + g_angle += 0.1; 1.167 + g_texIndex++; 1.168 + if (g_texIndex >= g_textures.length) { 1.169 + g_texIndex = 0; 1.170 + } 1.171 + gl.bindTexture(gl.TEXTURE_2D, g_textures[g_texIndex]); 1.172 + gl.uniformMatrix4fv(g_worldLoc, false, rotationZ(g_angle)); 1.173 + gl.clearColor(1,0,0,1); 1.174 + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); 1.175 + gl.drawArrays(gl.TRIANGLES, 0, 6); 1.176 +} 1.177 + 1.178 +/** 1.179 + * Creates a 4-by-4 matrix which rotates around the z-axis by the given angle. 1.180 + * @param {number} angle The angle by which to rotate (in radians). 1.181 + * @return {!o3djs.math.Matrix4} The rotation matrix. 1.182 + */ 1.183 +function rotationZ(angle) { 1.184 + var c = Math.cos(angle); 1.185 + var s = Math.sin(angle); 1.186 + 1.187 + return [ 1.188 + c, s, 0, 0, 1.189 + -s, c, 0, 0, 1.190 + 0, 0, 1, 0, 1.191 + 0, 0, 0, 1 1.192 + ]; 1.193 +}; 1.194 + 1.195 +debug(""); 1.196 +successfullyParsed = true; 1.197 +</script> 1.198 +<script> 1.199 +</script> 1.200 + 1.201 +</body> 1.202 +</html>