compositing-test.js (4172B)
1 var createCompositingTestFn = (function() { 2 3 const width = 20; 4 const height = 20; 5 6 function waitForComposite() { 7 debug('wait for composite'); 8 return new Promise(resolve => wtu.waitForComposite(resolve)); 9 } 10 11 async function testPreserveDrawingBufferFalse(gl, drawFn, clear) { 12 debug(''); 13 debug(`test preserveDrawingBuffer: false with ${drawFn.name} ${clear ? 'with' : 'without'} clear`); 14 15 if (clear) { 16 gl.clearColor(0, 0, 0, 0); 17 gl.clear(gl.COLOR_BUFFER_BIT); 18 } 19 20 if (drawFn(gl)) { 21 debug('skipped: extension does not exist'); 22 return; 23 } 24 25 wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red"); 26 27 // enable scissor here, before compositing, to make sure it's correctly 28 // ignored and restored 29 const halfWidth = gl.canvas.width / 2; 30 const halfHeight = gl.canvas.height / 2; 31 gl.scissor(0, halfHeight, halfWidth, halfHeight); 32 gl.enable(gl.SCISSOR_TEST); 33 34 await waitForComposite(); 35 36 // scissor was set earlier 37 gl.clearColor(0, 0, 1, 1); 38 gl.clear(gl.COLOR_BUFFER_BIT); 39 40 wtu.checkCanvasRect(gl, 0, halfHeight, halfWidth, halfHeight, [0, 0, 255, 255], 41 "cleared corner should be blue, stencil should be preserved"); 42 wtu.checkCanvasRect(gl, 0, 0, halfWidth, halfHeight, [0, 0, 0, 0], 43 "remainder of buffer should be cleared"); 44 45 gl.disable(gl.SCISSOR_TEST); 46 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 47 } 48 49 async function testPreserveDrawingBufferTrue(gl, drawFn, clear) { 50 debug(''); 51 debug(`test preserveDrawingBuffer: true with ${drawFn.name} ${clear ? 'with' : 'without'} clear`); 52 53 if (clear) { 54 gl.clearColor(0, 0, 0, 0); 55 gl.clear(gl.COLOR_BUFFER_BIT); 56 } 57 58 const skipTest = drawFn(gl); 59 if (skipTest) { 60 debug('skipped: extension does not exist'); 61 return; 62 } 63 64 wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red"); 65 66 await waitForComposite(); 67 68 wtu.checkCanvas(gl, [255, 0, 0, 255], "canvas should be red"); 69 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "there should be no errors"); 70 } 71 72 function setupWebGL({ 73 webglVersion, 74 shadersFn, 75 attribs, 76 }) { 77 const existingCanvases = document.querySelectorAll('canvas'); 78 const canvas = document.createElement('canvas'); 79 canvas.width = width; 80 canvas.height = height; 81 canvas.style.display = 'block'; 82 canvas.style.position = 'fixed'; 83 canvas.style.left = `${existingCanvases.length * 25}px`; 84 canvas.style.top = '0'; 85 // The canvas needs to be visible or the test will fail. 86 document.body.insertBefore(canvas, [...existingCanvases].pop()); 87 const gl = wtu.create3DContext(canvas, attribs, webglVersion); 88 if (!gl) { 89 testFailed('WebGL context creation failed'); 90 return gl; 91 } 92 93 const shaders = shadersFn(gl); 94 const program = wtu.setupProgram(gl, shaders, ["position"]); 95 if (!program) { 96 debug(`program failed to compile: ${wtu.getLastError()}`); 97 } 98 const positionBuf = gl.createBuffer(); 99 gl.bindBuffer(gl.ARRAY_BUFFER, positionBuf); 100 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 101 -1, -1, 102 1, -1, 103 -1, 1, 104 -1, 1, 105 1, -1, 106 1, 1, 107 ]), gl.STATIC_DRAW); 108 gl.enableVertexAttribArray(0); 109 gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0); 110 const indexBuf = gl.createBuffer(); 111 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuf); 112 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array([0, 1, 2, 3, 4, 5]), gl.STATIC_DRAW); 113 return gl; 114 } 115 116 function createCompositingTestFn(options) { 117 const glPreserveDrawingBufferFalse = setupWebGL({ 118 ...options, 119 attribs: {antialias: false}, 120 }); 121 const glPreserveDrawingBufferTrue = setupWebGL({ 122 ...options, 123 attribs: {antialias: false, preserveDrawingBuffer: true}, 124 }); 125 return async function(drawFn) { 126 debug('---'); 127 await testPreserveDrawingBufferFalse(glPreserveDrawingBufferFalse, drawFn, false); 128 await testPreserveDrawingBufferFalse(glPreserveDrawingBufferFalse, drawFn, true); 129 130 await testPreserveDrawingBufferTrue(glPreserveDrawingBufferTrue, drawFn, false); 131 await testPreserveDrawingBufferTrue(glPreserveDrawingBufferTrue, drawFn, true); 132 }; 133 } 134 135 return createCompositingTestFn; 136 }());