diff options
author | dyen <dyen@chromium.org> | 2015-05-27 12:00:53 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-05-27 19:01:34 +0000 |
commit | 9a7070b677a106eec194520562d32f0af071a408 (patch) | |
tree | c8f4e6ea4957d9f576cb38083dbb45e01a06fc47 | |
parent | aac0a90fac9ff1deef5a5a49ec16a5f509a9a1fa (diff) | |
download | chromium_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}
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(); +} |