rapid-resizing.html (4250B)
1 <!-- 2 Copyright (c) 2019 The Khronos Group Inc. 3 Use of this source code is governed by an MIT-style license that can be 4 found in the LICENSE.txt file. 5 --> 6 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <meta charset="utf-8"> 11 <title>WebGL Rapid Resizing Test</title> 12 <link rel="stylesheet" href="../../resources/js-test-style.css"/> 13 <script src="../../js/js-test-pre.js"></script> 14 <script src="../../js/webgl-test-utils.js"></script> 15 </head> 16 <body> 17 <div id="description"></div> 18 <canvas id="canvas1" style="width: 256px; height: 256px;"> </canvas> 19 <canvas id="canvas2" style="width: 256px; height: 256px;"> </canvas> 20 <div id="console"></div> 21 <script id="vshader" type="x-shader/x-vertex"> 22 attribute vec2 position; 23 void main() 24 { 25 gl_Position = vec4(position, 0.0, 1.0); 26 } 27 </script> 28 29 <script id="fshader" type="x-shader/x-fragment"> 30 void main() 31 { 32 gl_FragColor = vec4(0.0,1.0,0.0,1.0); 33 } 34 </script> 35 <script> 36 "use strict"; 37 38 description("Verifies that rapidly resizing the canvas works correctly."); 39 40 debug(""); 41 debug("Regression test for Chromium <a href='http://crbug.com/299371'>Issue 299371</a> and <a href='http://crbug.com/557848'>Issue 557848</a>"); 42 debug(""); 43 44 var err; 45 var wtu = WebGLTestUtils; 46 var canvas; 47 var largeSize = 256; 48 var smallSize = 128; 49 var currentSize; 50 var gl; 51 var program; 52 var numFrames = 0; 53 var testNumber = 0; 54 55 function nextTest() { 56 ++testNumber; 57 numFrames = 0; 58 currentSize = largeSize; 59 if (testNumber > 2) { 60 finishTest(); 61 return; 62 } 63 64 canvas = document.getElementById("canvas" + testNumber); 65 canvas.width = currentSize; 66 canvas.height = currentSize; 67 var usePreserveDrawingBuffer = (testNumber == 1) ? true : false; 68 debug("Testing preserveDrawingBuffer = " + usePreserveDrawingBuffer); 69 gl = wtu.create3DContext(canvas, { preserveDrawingBuffer: usePreserveDrawingBuffer }); 70 71 if (!gl) { 72 testFailed("context does not exist"); 73 74 wtu.requestAnimFrame(nextTest); 75 } else { 76 testPassed("context exists"); 77 78 gl.clearColor(0, 0, 0, 1); 79 80 program = wtu.setupProgram(gl, ["vshader", "fshader"], ["position"]); 81 shouldBeNonNull("program"); 82 83 // Prepare to draw quads 84 var quadSize = 0.1; 85 86 var vertexBuffer = gl.createBuffer(); 87 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); 88 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 89 // Lower left 90 -1, -1 + quadSize, 91 -1, -1, 92 -1 + quadSize, -1, 93 -1 + quadSize, -1 + quadSize, 94 95 // Lower right 96 1 - quadSize, -1 + quadSize, 97 1 - quadSize, -1, 98 1, -1, 99 1, -1 + quadSize, 100 101 // Upper right 102 1 - quadSize, 1, 103 1 - quadSize, 1 - quadSize, 104 1, 1 - quadSize, 105 1, 1, 106 107 // Upper left 108 -1, 1, 109 -1, 1 - quadSize, 110 -1 + quadSize, 1 - quadSize, 111 -1 + quadSize, 1 112 ]), gl.STATIC_DRAW); 113 gl.enableVertexAttribArray(0); 114 gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); 115 116 var indexBuffer = gl.createBuffer(); 117 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer); 118 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([ 119 0, 1, 2, 120 0, 2, 3, 121 122 4, 5, 6, 123 4, 6, 7, 124 125 8, 9, 10, 126 8, 10, 11, 127 128 12, 13, 14, 129 12, 14, 15 130 ]), gl.STATIC_DRAW); 131 132 wtu.requestAnimFrame(render); 133 } 134 } 135 136 function render() { 137 if (++numFrames < 30) { 138 if (currentSize == largeSize) { 139 canvas.height = smallSize; 140 currentSize = smallSize; 141 } else { 142 canvas.height = largeSize; 143 currentSize = largeSize; 144 } 145 } 146 147 gl.viewport(0, 0, largeSize, currentSize); 148 gl.clear(gl.COLOR_BUFFER_BIT); 149 gl.drawElements(gl.TRIANGLES, 24, gl.UNSIGNED_SHORT, 0); 150 151 // Check the four corners 152 var green = [ 0, 255, 0, 255 ]; 153 var inset = 3; 154 wtu.checkCanvasRect(gl, inset, inset, 1, 1, green, "lower left should be green", 1); 155 wtu.checkCanvasRect(gl, largeSize - inset, inset, 1, 1, green, "lower right should be green", 1); 156 wtu.checkCanvasRect(gl, inset, currentSize - inset, 1, 1, green, "upper left should be green", 1); 157 wtu.checkCanvasRect(gl, largeSize - inset, currentSize - inset, 1, 1, green, "upper right should be green", 1); 158 159 if (numFrames < 60) { 160 wtu.requestAnimFrame(render); 161 } else { 162 wtu.requestAnimFrame(nextTest); 163 } 164 } 165 166 wtu.requestAnimFrame(nextTest); 167 168 </script> 169 170 </body> 171 </html>