summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordyen <dyen@chromium.org>2015-05-27 12:00:53 -0700
committerCommit bot <commit-bot@chromium.org>2015-05-27 19:01:34 +0000
commit9a7070b677a106eec194520562d32f0af071a408 (patch)
treec8f4e6ea4957d9f576cb38083dbb45e01a06fc47
parentaac0a90fac9ff1deef5a5a49ec16a5f509a9a1fa (diff)
downloadchromium_src-9a7070b677a106eec194520562d32f0af071a408.zip
chromium_src-9a7070b677a106eec194520562d32f0af071a408.tar.gz
chromium_src-9a7070b677a106eec194520562d32f0af071a408.tar.bz2
Added Tough Texture upload page set to smoothness benchmark.
Tough texture uploads need to be measured in our perf tests as well, these tests will give us a sense of when we have a regression in how we handle texture uploads. I have also written a couple of pages that continuously upload textures using WebGL. These tests upload textures of various sizes. R=dtu@chromium.org, nednguyen@chromium.org BUG=462078 CQ_EXTRA_TRYBOTS=tryserver.chromium.perf:linux_perf_bisect;tryserver.chromium.perf:mac_perf_bisect;tryserver.chromium.perf:win_perf_bisect;tryserver.chromium.perf:android_nexus5_perf_bisect Review URL: https://codereview.chromium.org/1159733003 Cr-Commit-Position: refs/heads/master@{#331616}
-rw-r--r--tools/perf/benchmarks/smoothness.py9
-rw-r--r--tools/perf/page_sets/tough_texture_upload_cases.py11
-rw-r--r--tools/perf/page_sets/tough_texture_upload_cases/extra_large_texture_uploads.html25
-rw-r--r--tools/perf/page_sets/tough_texture_upload_cases/large_texture_uploads.html25
-rw-r--r--tools/perf/page_sets/tough_texture_upload_cases/medium_texture_uploads.html25
-rw-r--r--tools/perf/page_sets/tough_texture_upload_cases/small_texture_uploads.html25
-rw-r--r--tools/perf/page_sets/tough_texture_upload_cases/texture_upload_experiment.js107
7 files changed, 224 insertions, 3 deletions
diff --git a/tools/perf/benchmarks/smoothness.py b/tools/perf/benchmarks/smoothness.py
index 0c26ca5..80ba26f 100644
--- a/tools/perf/benchmarks/smoothness.py
+++ b/tools/perf/benchmarks/smoothness.py
@@ -395,3 +395,12 @@ class SmoothnessToughAnimatedImageCases(perf_benchmark.PerfBenchmark):
@classmethod
def Name(cls):
return 'smoothness.tough_animated_image_cases'
+
+
+class SmoothnessToughTextureUploadCases(perf_benchmark.PerfBenchmark):
+ test = smoothness.Smoothness
+ page_set = page_sets.ToughTextureUploadCasesPageSet
+
+ @classmethod
+ def Name(cls):
+ return 'smoothness.tough_texture_upload_cases'
diff --git a/tools/perf/page_sets/tough_texture_upload_cases.py b/tools/perf/page_sets/tough_texture_upload_cases.py
index 2cef31d..2a712ca 100644
--- a/tools/perf/page_sets/tough_texture_upload_cases.py
+++ b/tools/perf/page_sets/tough_texture_upload_cases.py
@@ -15,8 +15,8 @@ class ToughTextureUploadCasesPage(page_module.Page):
page_set=page_set)
def RunPageInteractions(self, action_runner):
- with action_runner.CreateGestureInteraction('ScrollAction'):
- action_runner.ScrollPage()
+ with action_runner.CreateInteraction('Animation'):
+ action_runner.Wait(10)
class ToughTextureUploadCasesPageSet(page_set_module.PageSet):
@@ -35,7 +35,12 @@ class ToughTextureUploadCasesPageSet(page_set_module.PageSet):
# pylint: disable=C0301
'file://tough_texture_upload_cases/background_color_animation_with_gradient.html',
# pylint: disable=C0301
- 'file://tough_texture_upload_cases/background_color_animation_with_gradient_and_transform_animation.html']
+ 'file://tough_texture_upload_cases/background_color_animation_with_gradient_and_transform_animation.html',
+ 'file://tough_texture_upload_cases/small_texture_uploads.html',
+ 'file://tough_texture_upload_cases/medium_texture_uploads.html',
+ 'file://tough_texture_upload_cases/large_texture_uploads.html',
+ 'file://tough_texture_upload_cases/extra_large_texture_uploads.html',
+ ]
for url in urls_list:
self.AddUserStory(ToughTextureUploadCasesPage(url, self))
diff --git a/tools/perf/page_sets/tough_texture_upload_cases/extra_large_texture_uploads.html b/tools/perf/page_sets/tough_texture_upload_cases/extra_large_texture_uploads.html
new file mode 100644
index 0000000..4be38bf
--- /dev/null
+++ b/tools/perf/page_sets/tough_texture_upload_cases/extra_large_texture_uploads.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head><title>Large texture upload test.</title></head>
+ <script src="texture_upload_experiment.js"></script>
+ <body>
+ <canvas id="example" width=512 height=512></canvas>
+ <script type="text/javascript">
+ document.body.style.margin = "0";
+ document.body.style.webkitAnimationName = "texture-upload";
+ document.body.style.webkitAnimationDuration = "10s";
+ document.body.style.webkitAnimationIterationCount = "infinite";
+ document.body.style.webkitAnimationDirection = "alternate";
+
+ function startExperiment() {
+ var canvas = document.getElementById("example");
+ var gl = canvas.getContext("webgl");
+ var dimension = Math.min(gl.getParameter(gl.MAX_TEXTURE_SIZE), 4096);
+
+ DoTextureUploadBenchmark(gl, dimension);
+ }
+
+ window.addEventListener('load', startExperiment, false);
+ </script>
+ </body>
+</html>
diff --git a/tools/perf/page_sets/tough_texture_upload_cases/large_texture_uploads.html b/tools/perf/page_sets/tough_texture_upload_cases/large_texture_uploads.html
new file mode 100644
index 0000000..d151524
--- /dev/null
+++ b/tools/perf/page_sets/tough_texture_upload_cases/large_texture_uploads.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head><title>Large texture upload test.</title></head>
+ <script src="texture_upload_experiment.js"></script>
+ <body>
+ <canvas id="example" width=512 height=512></canvas>
+ <script type="text/javascript">
+ document.body.style.margin = "0";
+ document.body.style.webkitAnimationName = "texture-upload";
+ document.body.style.webkitAnimationDuration = "10s";
+ document.body.style.webkitAnimationIterationCount = "infinite";
+ document.body.style.webkitAnimationDirection = "alternate";
+
+ function startExperiment() {
+ var canvas = document.getElementById("example");
+ var gl = canvas.getContext("webgl");
+ var dimension = Math.min(gl.getParameter(gl.MAX_TEXTURE_SIZE), 2048);
+
+ DoTextureUploadBenchmark(gl, dimension);
+ }
+
+ window.addEventListener('load', startExperiment, false);
+ </script>
+ </body>
+</html>
diff --git a/tools/perf/page_sets/tough_texture_upload_cases/medium_texture_uploads.html b/tools/perf/page_sets/tough_texture_upload_cases/medium_texture_uploads.html
new file mode 100644
index 0000000..1125710
--- /dev/null
+++ b/tools/perf/page_sets/tough_texture_upload_cases/medium_texture_uploads.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head><title>Large texture upload test.</title></head>
+ <script src="texture_upload_experiment.js"></script>
+ <body>
+ <canvas id="example" width=512 height=512></canvas>
+ <script type="text/javascript">
+ document.body.style.margin = "0";
+ document.body.style.webkitAnimationName = "texture-upload";
+ document.body.style.webkitAnimationDuration = "10s";
+ document.body.style.webkitAnimationIterationCount = "infinite";
+ document.body.style.webkitAnimationDirection = "alternate";
+
+ function startExperiment() {
+ var canvas = document.getElementById("example");
+ var gl = canvas.getContext("webgl");
+ var dimension = Math.min(gl.getParameter(gl.MAX_TEXTURE_SIZE), 1024);
+
+ DoTextureUploadBenchmark(gl, dimension);
+ }
+
+ window.addEventListener('load', startExperiment, false);
+ </script>
+ </body>
+</html>
diff --git a/tools/perf/page_sets/tough_texture_upload_cases/small_texture_uploads.html b/tools/perf/page_sets/tough_texture_upload_cases/small_texture_uploads.html
new file mode 100644
index 0000000..aa0b822
--- /dev/null
+++ b/tools/perf/page_sets/tough_texture_upload_cases/small_texture_uploads.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+ <head><title>Large texture upload test.</title></head>
+ <script src="texture_upload_experiment.js"></script>
+ <body>
+ <canvas id="example" width=256 height=256></canvas>
+ <script type="text/javascript">
+ document.body.style.margin = "0";
+ document.body.style.webkitAnimationName = "texture-upload";
+ document.body.style.webkitAnimationDuration = "10s";
+ document.body.style.webkitAnimationIterationCount = "infinite";
+ document.body.style.webkitAnimationDirection = "alternate";
+
+ function startExperiment() {
+ var canvas = document.getElementById("example");
+ var gl = canvas.getContext("webgl");
+ var dimension = Math.min(gl.getParameter(gl.MAX_TEXTURE_SIZE), 256);
+
+ DoTextureUploadBenchmark(gl, dimension);
+ }
+
+ window.addEventListener('load', startExperiment, false);
+ </script>
+ </body>
+</html>
diff --git a/tools/perf/page_sets/tough_texture_upload_cases/texture_upload_experiment.js b/tools/perf/page_sets/tough_texture_upload_cases/texture_upload_experiment.js
new file mode 100644
index 0000000..808222a
--- /dev/null
+++ b/tools/perf/page_sets/tough_texture_upload_cases/texture_upload_experiment.js
@@ -0,0 +1,107 @@
+// Copyright 2015 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 SetupShaderProgram(gl) {
+ // Create Vertex Shader.
+ var vertex_shader = '' +
+ 'attribute vec4 vPosition;\n' +
+ 'attribute vec2 texCoord0;\n' +
+ 'varying vec2 texCoord;\n' +
+ 'void main() {\n' +
+ ' gl_Position = vPosition;\n' +
+ ' texCoord = texCoord0;\n' +
+ '}\n';
+ var vs = gl.createShader(gl.VERTEX_SHADER);
+ gl.shaderSource(vs, vertex_shader);
+ gl.compileShader(vs);
+
+ // Create Fragment Shader.
+ var fragment_shader = '' +
+ '#ifdef GL_ES\n' +
+ 'precision mediump float;\n' +
+ '#endif\n' +
+ 'uniform sampler2D tex;\n' +
+ 'varying vec2 texCoord;\n' +
+ 'void main() {\n' +
+ ' gl_FragData[0] = texture2D(tex, texCoord);\n' +
+ '}\n';
+ var fs = gl.createShader(gl.FRAGMENT_SHADER);
+ gl.shaderSource(fs, fragment_shader);
+ gl.compileShader(fs);
+
+ // Link Program.
+ var program = gl.createProgram();
+ gl.attachShader(program, vs);
+ gl.attachShader(program, fs);
+
+ gl.bindAttribLocation(program, 0, 'vPosition');
+ gl.bindAttribLocation(program, 1, 'texCoord0');
+ gl.linkProgram(program);
+
+ gl.deleteShader(fs);
+ gl.deleteShader(vs);
+ gl.useProgram(program);
+};
+
+function SetupQuad(gl) {
+ SetupShaderProgram(gl);
+
+ // Setup unit quad
+ var vertexObject = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+ 1.0, 1.0, 0.0,
+ -1.0, 1.0, 0.0,
+ -1.0, -1.0, 0.0,
+ 1.0, 1.0, 0.0,
+ -1.0, -1.0, 0.0,
+ 1.0, -1.0, 0.0]), gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(0);
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
+
+ var vertexObject = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+ 1.0, 1.0,
+ 0.0, 1.0,
+ 0.0, 0.0,
+ 1.0, 1.0,
+ 0.0, 0.0,
+ 1.0, 0.0]), gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(1);
+ gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
+};
+
+function DoTextureUploadBenchmark(gl, dimension) {
+ SetupShaderProgram(gl);
+ SetupQuad(gl);
+
+ var canvasTexture = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, canvasTexture);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+
+ var frame = 0;
+ var delta = 10;
+
+ function update_texture() {
+ requestAnimationFrame(update_texture);
+ var pixels = new Uint8Array(dimension * dimension * 4);
+ if (((frame + delta) < 0) || (frame + delta) >= 256 * 3)
+ delta *= -1;
+ frame += delta;
+
+ for (var i = 0; i < dimension * dimension; ++i) {
+ pixels[i*4] = Math.min(frame, 255);
+ pixels[i*4+1] = Math.max(256, Math.min(511, frame)) - 256;
+ pixels[i*4+2] = Math.max(512, frame) - 512;
+ pixels[i*4+3] = 0xFF;
+ }
+
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, dimension, dimension, 0,
+ gl.RGBA, gl.UNSIGNED_BYTE, pixels);
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
+ }
+ update_texture();
+}