| Index: content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html
|
| diff --git a/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html b/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html
|
| index 02f3a123349302090c3c2026608a2e0a11a9730a..6b20de9c388eb9abb7e6376d66c250763eef5c86 100644
|
| --- a/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html
|
| +++ b/content/test/data/gpu/pixel_offscreenCanvas_2d_commit_worker.html
|
| @@ -8,59 +8,94 @@ that the baseline images are regenerated on the next run.
|
|
|
| <html>
|
| <head>
|
| -<title>OffscreenCanvas 2d commit flow on worker thread: Four-color square on white background.</title>
|
| +<title>OffscreenCanvas 2d commit flow on worker thread: Two Canvases</title>
|
| <style type="text/css">
|
| .nomargin {
|
| margin: 0px auto;
|
| }
|
| </style>
|
| <script id="myWorker" type="text/worker">
|
| +/* This pixel test checks the following:
|
| + 1. Whether submission of frames for multiple canvases happen about the same
|
| + time for OffscreenCanvas.commit() that are invoked in the same JS task.
|
| + 2. Whether overdraw frame in one animation loop is handled well.
|
| + 3. Whether the drawn 2d image is position upright in commit().
|
| + 4. Drawing to OffscreenCanvas without commit() has no rendering results.
|
|
|
| -var g_offscreen2d;
|
| -var g_animationFrameNumber = 0;
|
| + Correct end result of this test: The left canvas shows a seven-spike skyblue
|
| + star on the top-left corner of a green background and the right canvas shows
|
| + a sky-blue fill.
|
| +*/
|
| +var g_ctx1, g_ctx2;
|
| +var g_asyncCallbackNumber = 2;
|
|
|
| self.onmessage = function(e) {
|
| - var transferredCanvas = e.data;
|
| - g_offscreen2d = transferredCanvas.getContext("2d");
|
| - g_offscreen2d.fillStyle = "red";
|
| - g_offscreen2d.fillRect(0, 0, 200, 200);
|
| - drawLoop();
|
| + g_ctx1 = e.data.offscreenCanvas1.getContext("2d");
|
| + g_ctx2 = e.data.offscreenCanvas2.getContext("2d");
|
| +
|
| + startTest();
|
| }
|
|
|
| -function drawLoop()
|
| -{
|
| - if (g_animationFrameNumber < 10) {
|
| - g_animationFrameNumber++;
|
| - // Purposely intersperse overdraw and non-overdraw commit cases to see
|
| - // if OffscreenCanvas commit() handles both cases well.
|
| - if (0 == g_animationFrameNumber % 2) {
|
| - // When promise is used, the next drawLoop() is called after the first
|
| - // frame is resolved; therefore there is no overdraw in this case.
|
| - g_offscreen2d.commit().then(drawLoop);
|
| - } else {
|
| - // When the next drawLoop() is invoked regardless the promise resolve
|
| - // status of the previous commit(), the frame committed in the next
|
| - // drawLoop() is very likely to be overdrawn.
|
| - g_offscreen2d.commit();
|
| - drawLoop();
|
| +function startTest() {
|
| + g_ctx1.fillStyle = "green";
|
| + g_ctx1.fillRect(0, 0, 300, 300);
|
| + // The promise returned by this g_ctx1.commit() must be resolved at
|
| + // about the same time as the other g_ctx2.commit() below as they are in the
|
| + // same JS task.
|
| + g_ctx1.commit().then(function() {
|
| + g_ctx2.fillRect(0, 0, 300, 300);
|
| + // This g_ctx2.commit() must happen after the other g_ctx2.commit() below.
|
| + g_ctx2.commit();
|
| + if (--g_asyncCallbackNumber == 0) self.postMessage("");
|
| + });
|
| +
|
| + function drawStar(ctx, cx, cy, spikes, outerRadius, innerRadius) {
|
| + var rot = Math.PI / 2 * 3;
|
| + var x = cx;
|
| + var y = cy;
|
| + var step = Math.PI / spikes;
|
| +
|
| + ctx.beginPath();
|
| + ctx.moveTo(cx, cy - outerRadius);
|
| + for (i = 0; i < spikes; i++) {
|
| + x = cx + Math.cos(rot) * outerRadius;
|
| + y = cy + Math.sin(rot) * outerRadius;
|
| + ctx.lineTo(x, y);
|
| + rot += step;
|
| +
|
| + x = cx + Math.cos(rot) * innerRadius;
|
| + y = cy + Math.sin(rot) * innerRadius;
|
| + ctx.lineTo(x, y);
|
| + rot += step;
|
| }
|
| - } else {
|
| - g_offscreen2d.fillStyle = "red";
|
| - g_offscreen2d.fillRect(0, 0, 100, 100);
|
| - g_offscreen2d.fillStyle = "green";
|
| - g_offscreen2d.fillRect(100, 0, 100, 100);
|
| - g_offscreen2d.fillStyle = "blue";
|
| - g_offscreen2d.fillRect(0, 100, 100, 100);
|
| - g_offscreen2d.fillStyle = "black";
|
| - g_offscreen2d.fillRect(100, 100, 100, 100);
|
| - g_offscreen2d.commit()
|
| + ctx.lineTo(cx, cy - outerRadius);
|
| + ctx.closePath();
|
| + ctx.lineWidth = 5;
|
| + ctx.strokeStyle = 'black';
|
| + ctx.stroke();
|
| + ctx.fillStyle = 'skyblue';
|
| + ctx.fill();
|
| + }
|
| +
|
| + // Do something complex to g_ctx2.
|
| + g_ctx2.fillStyle = "blue";
|
| + g_ctx2.fillRect(0, 0, 300, 300);
|
| + drawStar(g_ctx2, 150, 150, 25, 80, 60);
|
| + // This g_ctx2.commit() must be resolved at about the same time as the first
|
| + // g_ctx1.commit() above because they are in the same JS task, no matter how
|
| + // complex the drawing operation is.
|
| + g_ctx2.commit().then(function() {
|
| + drawStar(g_ctx1, 100, 100, 7, 80, 30);
|
| + g_ctx1.commit();
|
|
|
| // The following fill is never committed
|
| - g_offscreen2d.fillStyle = "blue";
|
| - g_offscreen2d.fillRect(0, 0, 200, 200);
|
| - self.postMessage("");
|
| - }
|
| + g_ctx1.fillStyle = "red";
|
| + g_ctx1.fillRect(0, 0, 200, 200);
|
| + if (--g_asyncCallbackNumber == 0) self.postMessage("");
|
| + });
|
| +
|
| }
|
| +
|
| </script>
|
| <script>
|
| var g_swapsBeforeAck = 15;
|
| @@ -79,27 +114,32 @@ function waitForFinish()
|
| } else {
|
| g_swapsBeforeAck--;
|
| document.getElementById('container').style.zIndex = g_swapsBeforeAck + 1;
|
| - window.requestAnimationFrame(waitForFinish);
|
| + requestAnimationFrame(waitForFinish);
|
| }
|
| }
|
|
|
| function main()
|
| {
|
| - var canvas2D = document.getElementById("c");
|
| - var offscreenCanvas = canvas2D.transferControlToOffscreen();
|
| + var offscreenCanvas1 = document.getElementById("canvas1").transferControlToOffscreen();
|
| + var offscreenCanvas2 = document.getElementById("canvas2").transferControlToOffscreen();
|
| +
|
| var worker = makeWorker(document.getElementById("myWorker").textContent);
|
| worker.onmessage = function (e) {
|
| waitForFinish();
|
| };
|
| - worker.postMessage(offscreenCanvas, [offscreenCanvas]);
|
| + worker.postMessage(
|
| + {offscreenCanvas1: offscreenCanvas1,
|
| + offscreenCanvas2: offscreenCanvas2},
|
| + [offscreenCanvas1, offscreenCanvas2]);
|
| }
|
| </script>
|
| </head>
|
| <body onload="main()">
|
| -<div style="position:relative; width:300px; height:300px; background-color:white">
|
| +<div style="position:relative; width:600px; height:300px; background-color:white">
|
| </div>
|
| <div id="container" style="position:absolute; top:0px; left:0px">
|
| -<canvas id="c" width="200" height="200" class="nomargin"></canvas>
|
| +<canvas id="canvas1" width="300" height="300" class="nomargin"></canvas>
|
| +<canvas id="canvas2" width="300" height="300" class="nomargin"></canvas>
|
| </div>
|
| </body>
|
| </html>
|
|
|