diff options
author | junov@chromium.org <junov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-21 15:16:28 +0000 |
---|---|---|
committer | junov@chromium.org <junov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-21 15:16:28 +0000 |
commit | b932a3f3bf4e891f44660c6d02152cd8c3c61d6d (patch) | |
tree | 4b1ba95ea47133f028e1266f27bc85407082e864 | |
parent | 91583716c93529a5012e841905970ffa797d9744 (diff) | |
download | chromium_src-b932a3f3bf4e891f44660c6d02152cd8c3c61d6d.zip chromium_src-b932a3f3bf4e891f44660c6d02152cd8c3c61d6d.tar.gz chromium_src-b932a3f3bf4e891f44660c6d02152cd8c3c61d6d.tar.bz2 |
Adding test content to the throughput tests to measure 2d canvas
blitting performance
BUG=http://code.google.com/p/chromium/issues/detail?id=97666
TEST=throughput tests
Review URL: https://chromiumcodereview.appspot.com/9355016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@122824 0039d316-1c4b-4281-b951-d872f2087c98
16 files changed, 429 insertions, 0 deletions
diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls.html b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls.html new file mode 100644 index 0000000..a7574f8 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <script src="parse_url.js"></script> + <script src="bouncing_balls.js"></script> + <style> + html, body { + width: 100%; + height: 100%; + margin: 0px; + padding: 0px; + overflow: hidden; + } + </style> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <title>Canvas 2D frame rate test: bouncing balls</title> +</head> +<body> + +<canvas id="canvas" width="500" height="500"> +</canvas> +<img id="ballImage" src="chromium.png" height="0" width="0"></img> +<img id="backImage" src="kiddie_logo.png" height="0" width="0"></img> +<script> + var canvas = document.getElementById('canvas'); + var canvasContext = canvas.getContext('2d'); +</script> +</body> +</html> diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls.js new file mode 100644 index 0000000..53596ee --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls.js @@ -0,0 +1,173 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// demo parameters +// maybe overridden in test file +var numBalls = 500; +var ballDiameter = 30; +var gravity = 0.5; //screen heights per second^2 +var maxInitVelocity = 0.2; +var maxAngularVelocity = 5; // rad per second +var elasticity = 0.7; +var joltInterval = 1.5; + +// globals +var balls = []; +var canvasWidth; +var canvasHeight; +var borderX; +var borderY; +var timeOfLastJolt = 0; + +function include(filename) { + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); + script.src = filename; + script.type = 'text/javascript'; + head.appendChild(script) +} + +include("bouncing_balls_draw_ball_as_" + getArgValue('ball') + ".js"); +include("bouncing_balls_draw_back_as_" + getArgValue('back') + ".js"); + +window.requestAnimFrame = (function(){ + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function( callback ){ + window.setTimeout(callback, 1000 / 60); + }; +})(); + +window.onload = init; + +function init(){ + handleResize(); + for (var i = 0; i < numBalls; i++) { + balls.push(new Ball()); + } + window.addEventListener("resize", handleResize, false); + drawBallInit(ballDiameter); // externally defined + window.requestAnimFrame(updateFrame); +} + +function handleResize() { + canvasWidth = window.innerWidth; + canvasHeight = window.innerHeight; + canvas.setAttribute('width', canvasWidth); + canvas.setAttribute('height', canvasHeight); + borderX = ballDiameter/canvasWidth; + borderY = ballDiameter/canvasHeight; + prepareBackground(); // externally defined +} + +function updateFrame() { + var now = new Date().getTime() / 1000; + var jolt = false; + if (now - timeOfLastJolt > joltInterval) { + jolt = true; + timeOfLastJolt = now; + } + drawBackground(); // externally defined + for (var i = 0; i < numBalls; i++) { + balls[i].step(jolt); + } + window.requestAnimFrame(updateFrame); +} + +function Ball(){ + var x = borderX + Math.random()*(1-2*borderX); + var y = borderY + Math.random()*(1-2*borderY); + var angle = Math.PI * 2 * Math.random(); + var velocityY = Math.random()*maxInitVelocity*2 - maxInitVelocity; + var velocityX = Math.random()*maxInitVelocity*2 - maxInitVelocity; + var angularVelocity = Math.random()*maxAngularVelocity*2 - + maxAngularVelocity; + var previousFrameTime = new Date().getTime(); + var previousBounceTime = 0; + var alive = true; + function step(jolt) { + var curTime = new Date().getTime(); + var timeStep = (curTime - previousFrameTime) / 1000; + previousFrameTime = curTime; + + // handle balls that are no longer bouncing + if (!alive) { + if (jolt) { + // If a jolt is applied, bump the rollong balls enough for them to + // reach between 0.75x and 1x the height of the window + velocityY = -Math.sqrt(2 * gravity * (1-2 * borderY) * (0.75 + 0.25 * + Math.random())) + velocityX = Math.random()*maxInitVelocity*2 - maxInitVelocity; + angularVelocity = Math.random()*maxAngularVelocity*2 - + maxAngularVelocity; + alive = true; + } else { + // rolling on the ground + angularVelocity = velocityX*canvasWidth/ballRadius; + } + } + + // Compute angular motion + angle += timeStep*angularVelocity; + // Compute horizontal motion + var remainingTime = timeStep; + var deltaX = velocityX*remainingTime; + while ((x+deltaX) < borderX || (x+deltaX) > (1-borderX)){ + if ((x+deltaX) < borderX) { + // left side bounce + remainingTime -= (borderX - x)/velocityX; + x = borderX; + } else { + // right side bounce + remainingTime -= ((1-borderX) - x)/velocityX; + x = 1 - borderX; + } + velocityX = -elasticity*velocityX; + deltaX = velocityX*remainingTime; + } + x += deltaX; + + // Compute vertical motion + remainingTime = timeStep; + var deltaY = alive ? velocityY*timeStep+gravity*timeStep*timeStep/2 : 0; + //Handle floor bounces + //To make sure the floor is air tight, we must be able to process multiple + //bounces per time step to avoid the "tunnel effect". + while ((y + deltaY) > (1 - borderY) && alive) { + // time to hit floor + var c = y-(1-borderY); + var b = velocityY; + var a = gravity/2; + // The greater root is always the right one + var subStep = (-b + Math.sqrt(b*b-4*a*c))/(2*a); + //velocity after floor hit + velocityY = -elasticity*(velocityY + gravity*subStep); + remainingTime -= subStep; + var bounceTime = curTime - remainingTime; + if (bounceTime - previousBounceTime < 0.005){ + // The number of iterations may not be finite within a timestep + // with elasticity < 1. This is due to power series convergence. + // To gard against hanging, we treat the ball as rolling on the ground + // once time between bounces is less than 5ms + alive = false; + deltaY = 0; + } else { + deltaY = velocityY*remainingTime+gravity*remainingTime*remainingTime/2; + } + previousBounceTime = bounceTime; + y = (1 - borderY); + } + y += deltaY; + velocityY += gravity*remainingTime; + + drawBall(x * canvasWidth, y * canvasHeight, angle); // externally defined + } + + return { + step: step + } +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_canvas.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_canvas.js new file mode 100644 index 0000000..79b1b19 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_canvas.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var backImageCanvas; + +function prepareBackground() { + var backImage = document.getElementById('backImage'); + backImageCanvas = document.createElement('canvas'); + backImageCanvas.width = canvasWidth; + backImageCanvas.height = canvasHeight; + var backContext = backImageCanvas.getContext('2d'); + backContext.drawImage(backImage, 0, 0, canvasWidth, canvasHeight); +} + +function drawBackground() { + canvasContext.drawImage(backImageCanvas, 0, 0); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_image_data.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_image_data.js new file mode 100644 index 0000000..94fabf6 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_aligned_image_data.js @@ -0,0 +1,19 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var backImageData; + +function prepareBackground() { + var backImage = document.getElementById('backImage'); + var backImageCanvas = document.createElement('canvas'); + backImageCanvas.width = canvasWidth; + backImageCanvas.height = canvasHeight; + var backContext = backImageCanvas.getContext('2d'); + backContext.drawImage(backImage, 0, 0, canvasWidth, canvasHeight); + backImageData = backContext.getImageData(0, 0, canvasWidth, canvasHeight) +} + +function drawBackground() { + canvasContext.putImageData(backImageData, 0, 0); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_canvas.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_canvas.js new file mode 100644 index 0000000..0b5b93c --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_canvas.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var backImageCanvas; + +function prepareBackground() { + var backImage = document.getElementById('backImage'); + backImageCanvas = document.createElement('canvas'); + backImageCanvas.width = backImage.naturalWidth; + backImageCanvas.height = backImage.naturalHeight; + var backContext = backImageCanvas.getContext('2d'); + backContext.drawImage(backImage, 0, 0); +} + +function drawBackground() { + canvasContext.drawImage(backImageCanvas, 0, 0, canvasWidth, canvasHeight); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_image.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_image.js new file mode 100644 index 0000000..925dcad --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_back_as_image.js @@ -0,0 +1,13 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var backImage; + +function prepareBackground() { + backImage = document.getElementById('backImage'); +} + +function drawBackground() { + canvasContext.drawImage(backImage, 0, 0, canvasWidth, canvasHeight); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_canvas_sprite.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_canvas_sprite.js new file mode 100644 index 0000000..549564f --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_canvas_sprite.js @@ -0,0 +1,41 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var spriteMap; +var ballRadius; +var spriteMapSize = 50; + +function drawBallInit(diameter) { + ballRadius = diameter / 2; + var ballImage = document.getElementById('ballImage'); + spriteMap = document.createElement("canvas"); + spriteMap.setAttribute('width', ballDiameter*spriteMapSize + 2); + spriteMap.setAttribute('height', ballDiameter + 2); + ctx = spriteMap.getContext("2d"); + ctx.clearRect(0,0, ballDiameter*spriteMapSize + 2, ballDiameter + 2); + ctx.translate(ballRadius + 1, ballRadius + 1); + for (var i = 0; i < spriteMapSize; i++) { + ctx.save(); + ctx.rotate(i * 2 * Math.PI / spriteMapSize ); + ctx.drawImage(ballImage, -ballRadius, -ballRadius, ballDiameter, + ballDiameter); + ctx.restore(); + ctx.translate(ballDiameter, 0); + } +} + +function safeMod(a, b) { + var q = Math.floor(a / b); + return a - q*b; +} + +function drawBall(x, y, angle) { + canvasContext.save(); + canvasContext.translate(x, y); + var idx = safeMod(Math.floor(angle * spriteMapSize / (2 * Math.PI)), + spriteMapSize); + canvasContext.drawImage(spriteMap, idx*ballDiameter + 1, 1, ballDiameter, + ballDiameter, -ballRadius, -ballRadius, ballDiameter, ballDiameter); + canvasContext.restore(); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_image.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_image.js new file mode 100644 index 0000000..7be8bc6 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_image.js @@ -0,0 +1,20 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var ballImage; +var ballRadius; + +function drawBallInit(diameter) { + ballRadius = diameter / 2; + ballImage = document.getElementById('ballImage'); +} + +function drawBall(x, y, angle) { + canvasContext.save(); + canvasContext.translate(x, y); + canvasContext.rotate(angle); + canvasContext.drawImage(ballImage, -ballRadius, -ballRadius, ballDiameter, + ballDiameter); + canvasContext.restore(); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_image_with_shadow.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_image_with_shadow.js new file mode 100644 index 0000000..0c30e66 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_image_with_shadow.js @@ -0,0 +1,24 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var ballImage; +var ballRadius; + +function drawBallInit(diameter) { + ballRadius = diameter / 2; + ballImage = document.getElementById('ballImage'); +} + +function drawBall(x, y, angle) { + canvasContext.save(); + canvasContext.shadowColor = 'black'; + canvasContext.shadowOffsetX = -ballRadius; + canvasContext.shadowOffsetY = ballRadius; + canvasContext.shadowBlur = ballRadius; + canvasContext.translate(x, y); + canvasContext.rotate(angle); + canvasContext.drawImage(ballImage, -ballRadius, -ballRadius, ballDiameter, + ballDiameter); + canvasContext.restore(); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_rect.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_rect.js new file mode 100644 index 0000000..e4e058b --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/bouncing_balls_draw_ball_as_rect.js @@ -0,0 +1,18 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var ballRadius; + +function drawBallInit(diameter) { + ballRadius = diameter / 2; +} + +function drawBall(x, y, angle) { + canvasContext.save(); + canvasContext.fillStyle = 'blue'; + canvasContext.translate(x, y); + canvasContext.rotate(angle); + canvasContext.fillRect(-ballRadius, -ballRadius, ballDiameter, ballDiameter); + canvasContext.restore(); +} diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/chromium.png b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/chromium.png Binary files differnew file mode 100644 index 0000000..9085a79 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/chromium.png diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/kiddie_logo.png b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/kiddie_logo.png Binary files differnew file mode 100644 index 0000000..61c7068 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/kiddie_logo.png diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/parse_url.js b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/parse_url.js new file mode 100644 index 0000000..5173e34 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_common/parse_url.js @@ -0,0 +1,26 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +function getArgValue(argname) +{ + var url = window.location.href; + var parts = url.split("?"); + if (parts.length == 0) + { + return ""; + } + var arglist = parts[1]; + var args = arglist.split("&"); + for (i=0;i<args.length;i++) + { + var parts = args[i].split("="); + if (parts[0] == argname) + { + value = parts[1]; + value = unescape(value); + return value; + } + } + return ""; +}
\ No newline at end of file diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_draw_from_canvas/index.html b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_draw_from_canvas/index.html new file mode 100644 index 0000000..7537fec --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_draw_from_canvas/index.html @@ -0,0 +1,7 @@ +<html> +<head> +<meta http-equiv="REFRESH" content="0;url=../canvas2d_balls_common/bouncing_balls.html?ball=canvas_sprite&back=canvas"> +</head> +<body> +</body> +</html>
\ No newline at end of file diff --git a/chrome/test/data/perf/rendering/throughput/canvas2d_balls_with_shadow/index.html b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_with_shadow/index.html new file mode 100644 index 0000000..aa93994 --- /dev/null +++ b/chrome/test/data/perf/rendering/throughput/canvas2d_balls_with_shadow/index.html @@ -0,0 +1,7 @@ +<html> +<head> +<meta http-equiv="REFRESH" content="0;url=../canvas2d_balls_common/bouncing_balls.html?ball=image_with_shadow&back=image"> +</head> +<body> +</body> +</html>
\ No newline at end of file diff --git a/chrome/test/perf/rendering/throughput_tests.cc b/chrome/test/perf/rendering/throughput_tests.cc index b1ba2c22..b6af54f 100644 --- a/chrome/test/perf/rendering/throughput_tests.cc +++ b/chrome/test/perf/rendering/throughput_tests.cc @@ -452,4 +452,20 @@ IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, CompositingHugeDivGPU) { RunTest("compositing_huge_div", kNone); } +IN_PROC_BROWSER_TEST_F(ThroughputTestSW, DrawImageShadowSW) { + RunTest("canvas2d_balls_with_shadow", kNone); +} + +IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, DrawImageShadowGPU) { + RunTest("canvas2d_balls_with_shadow", kNone); +} + +IN_PROC_BROWSER_TEST_F(ThroughputTestSW, CanvasToCanvasDrawSW) { + RunTest("canvas2d_balls_draw_from_canvas", kNone); +} + +IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, CanvasToCanvasDrawGPU) { + RunTest("canvas2d_balls_draw_from_canvas", kNone); +} + } // namespace |