| |
| <html> |
| <head> |
| <script src="../../../resources/js-test.js"></script> |
| <script src="resources/webgl-test.js"> </script> |
| <script src="resources/webgl-test-utils.js"></script> |
| <style type="text/css"> |
| #cases { |
| width: 300px; |
| height: 50px; |
| } |
| #cases canvas { |
| width: 20px; |
| height: 20px; |
| background: purple; |
| } |
| #cases > span { |
| display: block; |
| margin: 1px; |
| float: left; |
| } |
| #cases > span.clipped { |
| position: relative; |
| overflow: hidden; |
| height: 0px; |
| width: 0px; |
| } |
| #cases canvas.notOnScreen { |
| position: relative; |
| top: -1000px; |
| } |
| </style> |
| </head> |
| <body> |
| <div id="cases"></div> |
| <div id="description"> |
| Test that test that WebGL canvas preserveDrawingBuffer = false clear behavior on |
| cases where compositor does not neccessarily display the element. |
| You should see no failures and some of the canvases as green on screen. |
| </div> |
| <div id="console"></div> |
| |
| <script type="text/javascript"> |
| |
| var wtu = WebGLTestUtils; |
| window.jsTestIsAsync = true; |
| |
| if (window.testRunner) { |
| testRunner.dumpAsText(true); |
| testRunner.waitUntilDone(); |
| } |
| |
| var gls = []; |
| var cases = [ |
| "ref", // Normal canvas for reference. |
| "clipped", // Case where canvas is clipped by its parent. |
| "notOnScreen", // Case where canvas is not on screen. |
| "displayToNone" // Case where canvas is drawn to and then made not visible |
| // by display:none, then drawn to, then made visible again, ... |
| ]; |
| for (let c of cases) |
| { |
| for (let i = 0; i < 4; ++i) |
| { |
| let attrs = { |
| 'alpha': (i & 1) == 1, |
| 'antialias': (i & 2) == 1 |
| }; |
| |
| let s = document.createElement("span"); |
| s.className = c; |
| let canvas = document.createElement("canvas"); |
| canvas.className = c; |
| s.appendChild(canvas); |
| document.getElementById("cases").appendChild(s); |
| gl = canvas.getContext("webgl", attrs); |
| gl.attrs = attrs; |
| gls.push(gl); |
| } |
| } |
| |
| // All cases are currently expected to prepare a new drawing buffer on each composite that is preceeded with a |
| // drawing command. This is not the only allowed behavior especially for elements that are not on screen, but |
| // it's the mode of operation. |
| async function composite(gl) |
| { |
| return new Promise(resolve => wtu.waitForComposite(gl, resolve )); |
| } |
| |
| async function runTests() |
| { |
| let iterations = 10; |
| for (let i = 0; i < iterations; ++i) |
| { |
| for (let gl of gls) |
| { |
| let alpha = gl.getContextAttributes().alpha == true ? 0 : 255; |
| wtu.checkCanvasRect(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight, [0, 0, 0, alpha], |
| `canvas: ${gl.canvas.className} attrs: ${JSON.stringify(gl.attrs)} is initialized to zero on iteration: ${i}`); |
| // Clear marker is selected so that uninitialized IOSurface contents of 1,0,0,1 is also seen. |
| gl.clearColor(1.0, 0.7, 0.5, 1.0); |
| if (i == (iterations - 1)) |
| gl.clearColor(0.0, 1.0, 0.0, 1.0); |
| gl.clear(gl.COLOR_BUFFER_BIT); |
| if (gl.canvas.className == "displayToNone") |
| gl.canvas.style = "display:" + ((i % 2) == 0 ? "none" : ""); |
| } |
| await composite(gls[0]); |
| } |
| finishTest(); |
| } |
| runTests(); |
| |
| var successfullyParsed = true; |
| </script> |
| </body> |