blob: 45e509f50a3117dfd5892c9b7f2f7429a51868be [file] [log] [blame]
/*
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.
*/
IterableTest = (function() {
var wtu = WebGLTestUtils;
function run(test, iterations) {
var target = iterations || 10;
var count = 0;
function doNextTest() {
++count;
debug("Test " + count + " of " + target);
var success = test();
if (count < target && success !== false) {
wtu.dispatchPromise(doNextTest);
} else {
finishTest();
}
}
doNextTest();
}
// Creates a canvas and a texture then exits. There are
// no references to either so both should be garbage collected.
function createContextCreationAndDestructionTest() {
var textureSize = null;
return function() {
var canvas = document.createElement("canvas");
// This is safe for any device. See drawingBufferWidth in spec.
canvas.width = 2048;
canvas.height = 2048;
var gl = wtu.create3DContext(canvas);
if (textureSize === null) {
var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
textureSize = Math.min(1024, maxTextureSize);
}
var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, textureSize, textureSize, 0, gl.RGBA, gl.UNSIGNED_BYTE,
null);
gl.clear(gl.COLOR_BUFFER_BIT);
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");
return true;
};
}
// Creates many small canvases and attaches them to the DOM.
// This tests an edge case discovered in Chrome where the creation of multiple
// WebGL contexts would eventually lead to context creation failure.
// (crbug.com/319265) The test does not require that old contexts remain
// valid, only that new ones can be created.
function createContextCreationTest() {
return function() {
var canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
document.body.appendChild(canvas);
var gl = wtu.create3DContext(canvas);
if (!gl) {
return false;
}
gl.clear(gl.COLOR_BUFFER_BIT);
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");
return true;
};
}
// Draws rectangle on a passed canvas with preserveDrawingBuffer
// and antialiasing ON, tests rect color on every iteration.
function createMultisampleCorruptionTest(gl) {
var lastContext = null;
// Allocate a read back buffer in advance and reuse it for all iterations
// to avoid memory issues because of late garbage collection.
var readBackBuf = new Uint8Array(gl.canvas.width * gl.canvas.height * 4);
var program = wtu.loadStandardProgram(gl);
var uniforms = wtu.getUniformMap(gl, program);
gl.useProgram(program);
gl.clearColor(1.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
var vertexObject = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,2.5,0, 1.5,1.5,0, 2.5,1.5,0 ]), gl.STATIC_DRAW);
gl.enableVertexAttribArray(0);
gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
gl.vertexAttrib3f(1, 0.0, 0.0, 1.0);
var identityMat = new Float32Array([
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
]);
gl.uniformMatrix4fv(uniforms.u_modelViewProjMatrix.location, false, identityMat);
function test() {
var gl2 = wtu.create3DContext(null, {antialias: true});
gl2.canvas.width = gl2.canvas.height = 1024;
gl2.canvas.style.width = gl2.canvas.style.height = "1px";
document.body.appendChild(gl2.canvas);
gl2.clearColor(1.0, 0.0, 0.0, 1.0);
gl2.clear(gl2.COLOR_BUFFER_BIT);
if(lastContext) {
gl.drawArrays(gl.TRIANGLES, 0, 3);
var msg = "Canvas should be red";
wtu.checkCanvasRectColor(gl,
0, 0, gl.canvas.width, gl.canvas.height,
[255, 0, 0, 255], null,
function() {
testPassed(msg);
},
function() {
testFailed(msg);
return false;
},
debug, readBackBuf);
document.body.removeChild(lastContext.canvas);
}
lastContext = gl2;
return true;
};
// First pass does initialization
test();
return test;
}
// Draws repeatedly to a large canvas with preserveDrawingBuffer enabled to
// try and provoke a context loss.
function createPreserveDrawingBufferLeakTest(gl) {
var contextActive = true;
gl.canvas.addEventListener("webglcontextlost", () => {
testFailed("Context was lost");
contextActive = false;
});
function test() {
var x = Math.random() * gl.drawingBufferWidth;
var y = Math.random() * gl.drawingBufferHeight;
var width = Math.random() * (gl.drawingBufferWidth - x);
var height = Math.random() * (gl.drawingBufferHeight - y);
gl.enable(gl.SCISSOR_TEST);
gl.scissor(x, y, width, height);
gl.clearColor(Math.random(), Math.random(), Math.random(), 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors");
return contextActive;
};
return test;
}
return {
run: run,
createContextCreationAndDestructionTest: createContextCreationAndDestructionTest,
createContextCreationTest: createContextCreationTest,
createMultisampleCorruptionTest: createMultisampleCorruptionTest,
createPreserveDrawingBufferLeakTest: createPreserveDrawingBufferLeakTest
};
})();