Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: cc/layer_tree_host_perftest.cc

Issue 11418235: Add perf tests based on json representation of layer tree (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Go up to 2 seconds per test, do correct math Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/cc_tests.gyp ('k') | cc/test/data/10_10_layer_tree.json » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layer_tree_host.h" 5 #include "cc/layer_tree_host.h"
6 6
7 #include "base/base_paths.h"
8 #include "base/file_path.h"
9 #include "base/file_util.h"
10 #include "base/json/json_reader.h"
11 #include "base/path_service.h"
12 #include "base/string_piece.h"
7 #include "cc/content_layer.h" 13 #include "cc/content_layer.h"
8 #include "cc/nine_patch_layer.h" 14 #include "cc/nine_patch_layer.h"
9 #include "cc/solid_color_layer.h" 15 #include "cc/solid_color_layer.h"
10 #include "cc/test/fake_content_layer_client.h" 16 #include "cc/test/fake_content_layer_client.h"
11 #include "cc/test/layer_tree_test_common.h" 17 #include "cc/test/layer_tree_test_common.h"
12 18
13 namespace cc { 19 namespace cc {
14 namespace { 20 namespace {
15 21
16 class LayerTreeHostPerfTest : public WebKitTests::ThreadedTest {}; 22 static const int kTimeLimitMillis = 2000;
17 23
18 class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest { 24 class LayerTreeHostPerfTest : public WebKitTests::ThreadedTest {
19 public: 25 public:
20 LayerTreeHostPerfTestSevenTabSwitcher() : num_draws_(0) { 26 LayerTreeHostPerfTest()
27 : num_draws_(0) {
21 fake_delegate_.setPaintAllOpaque(true); 28 fake_delegate_.setPaintAllOpaque(true);
22 } 29 }
23 30
31 virtual void beginTest() OVERRIDE {
32 buildTree();
33 start_time_ = base::TimeTicks::HighResNow();
34 postSetNeedsCommitToMainThread();
35 }
36
37 virtual void drawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE {
38 ++num_draws_;
39 if ((base::TimeTicks::HighResNow() - start_time_) >=
40 base::TimeDelta::FromMilliseconds(kTimeLimitMillis))
41 endTest();
42 impl->setNeedsRedraw();
43 }
44
45 virtual void buildTree() {}
46
47 virtual void afterTest() OVERRIDE {
48 base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_;
49 // Format matches chrome/test/perf/perf_test.h:PrintResult
50 printf("*RESULT %s: frames= %.2f runs/s\n",
51 test_name_.c_str(),
52 num_draws_ / elapsed.InSecondsF());
53 }
54
24 scoped_refptr<Layer> CreateLayer(float x, float y, int width, int height) { 55 scoped_refptr<Layer> CreateLayer(float x, float y, int width, int height) {
25 scoped_refptr<Layer> layer = Layer::create(); 56 scoped_refptr<Layer> layer = Layer::create();
26 layer->setAnchorPoint(gfx::Point()); 57 layer->setAnchorPoint(gfx::Point());
27 layer->setPosition(gfx::PointF(x, y)); 58 layer->setPosition(gfx::PointF(x, y));
28 layer->setBounds(gfx::Size(width, height)); 59 layer->setBounds(gfx::Size(width, height));
29 return layer; 60 return layer;
30 } 61 }
31 62
32 scoped_refptr<ContentLayer> CreateContentLayer(float x, float y, int width, in t height) { 63 scoped_refptr<ContentLayer> CreateContentLayer(float x, float y, int width, in t height) {
33 scoped_refptr<ContentLayer> layer = ContentLayer::create(&fake_delegate_); 64 scoped_refptr<ContentLayer> layer = ContentLayer::create(&fake_delegate_);
34 layer->setAnchorPoint(gfx::Point()); 65 layer->setAnchorPoint(gfx::Point());
35 layer->setPosition(gfx::PointF(x, y)); 66 layer->setPosition(gfx::PointF(x, y));
36 layer->setBounds(gfx::Size(width, height)); 67 layer->setBounds(gfx::Size(width, height));
37 layer->setIsDrawable(true); 68 layer->setIsDrawable(true);
38 return layer; 69 return layer;
39 } 70 }
40 71
41 scoped_refptr<SolidColorLayer> CreateColorLayer(float x, float y, int width, i nt height) { 72 scoped_refptr<SolidColorLayer> CreateColorLayer(float x, float y, int width, i nt height) {
42 scoped_refptr<SolidColorLayer> layer = SolidColorLayer::create(); 73 scoped_refptr<SolidColorLayer> layer = SolidColorLayer::create();
43 layer->setAnchorPoint(gfx::Point()); 74 layer->setAnchorPoint(gfx::Point());
44 layer->setPosition(gfx::PointF(x, y)); 75 layer->setPosition(gfx::PointF(x, y));
45 layer->setBounds(gfx::Size(width, height)); 76 layer->setBounds(gfx::Size(width, height));
46 layer->setIsDrawable(true); 77 layer->setIsDrawable(true);
47 return layer; 78 return layer;
48 } 79 }
49 80
50 scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int widt h, int height) { 81 scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int widt h, int height) {
82 return CreateDecorationLayer(x, y, width, height, gfx::Rect(0, 0, width, hei ght));
83 }
84
85 scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int widt h, int height, gfx::Rect aperture) {
51 scoped_refptr<NinePatchLayer> layer = NinePatchLayer::create(); 86 scoped_refptr<NinePatchLayer> layer = NinePatchLayer::create();
52 layer->setAnchorPoint(gfx::Point()); 87 layer->setAnchorPoint(gfx::Point());
53 layer->setPosition(gfx::PointF(x, y)); 88 layer->setPosition(gfx::PointF(x, y));
54 layer->setBounds(gfx::Size(width, height)); 89 layer->setBounds(gfx::Size(width, height));
55 layer->setIsDrawable(true); 90 layer->setIsDrawable(true);
56 91
57 SkBitmap bitmap; 92 SkBitmap bitmap;
58 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1); 93 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1);
59 bitmap.allocPixels(NULL, NULL); 94 bitmap.allocPixels(NULL, NULL);
60 layer->setBitmap(bitmap, gfx::Rect(0, 0, width, height)); 95 layer->setBitmap(bitmap, aperture);
61 96
62 return layer; 97 return layer;
63 } 98 }
64 99
65 scoped_refptr<Layer> addChild(scoped_refptr<Layer> parent, scoped_refptr<Layer > child) { 100 scoped_refptr<Layer> addChild(scoped_refptr<Layer> parent, scoped_refptr<Layer > child) {
66 parent->addChild(child); 101 parent->addChild(child);
67 return child; 102 return child;
68 } 103 }
69 104
70 virtual void beginTest() OVERRIDE { 105 protected:
106 base::TimeTicks start_time_;
107 int num_draws_;
108 std::string test_name_;
109 WebKitTests::FakeContentLayerClient fake_delegate_;
110 };
111
112 class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest {
113 public:
114 LayerTreeHostPerfTestSevenTabSwitcher()
115 : LayerTreeHostPerfTest() {
116 test_name_ = "SevenTabSwitcher";
117 }
118
119 virtual void buildTree() OVERRIDE {
71 scoped_refptr<Layer> root = CreateLayer(0, 0, 720, 1038); // 1 120 scoped_refptr<Layer> root = CreateLayer(0, 0, 720, 1038); // 1
72 scoped_refptr<Layer> layer; 121 scoped_refptr<Layer> layer;
73 122
74 gfx::Transform down_scale_matrix; 123 gfx::Transform down_scale_matrix;
75 down_scale_matrix.Scale(0.747, 0.747); 124 down_scale_matrix.Scale(0.747, 0.747);
76 125
77 layer = addChild(root, CreateLayer(0, 0, 0, 0)); // 2 126 layer = addChild(root, CreateLayer(0, 0, 0, 0)); // 2
78 127
79 layer = addChild(root, CreateLayer(628, 15, 0, 0)); // 5 128 layer = addChild(root, CreateLayer(628, 15, 0, 0)); // 5
80 layer = addChild(root, CreateDecorationLayer(564, -49, 665, 274)); // 13 129 layer = addChild(root, CreateDecorationLayer(564, -49, 665, 274)); // 13
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 layer->setTransform(down_scale_matrix); 218 layer->setTransform(down_scale_matrix);
170 219
171 layer = addChild(root, CreateLayer(30, 617, 0, 0)); // 120 220 layer = addChild(root, CreateLayer(30, 617, 0, 0)); // 120
172 layer = addChild(root, CreateDecorationLayer(14, 601, 569, 807)); // 124 221 layer = addChild(root, CreateDecorationLayer(14, 601, 569, 807)); // 124
173 layer = addChild(root, CreateDecorationLayer(229.135986f, 601, 354, 96)); // 123 222 layer = addChild(root, CreateDecorationLayer(229.135986f, 601, 354, 96)); // 123
174 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 122 223 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 122
175 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 121 224 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 121
176 225
177 m_layerTreeHost->setViewportSize(gfx::Size(720, 1038), gfx::Size(720, 1038)) ; 226 m_layerTreeHost->setViewportSize(gfx::Size(720, 1038), gfx::Size(720, 1038)) ;
178 m_layerTreeHost->setRootLayer(root); 227 m_layerTreeHost->setRootLayer(root);
179 postSetNeedsCommitToMainThread(); 228 }
229 };
230
231 TEST_F(LayerTreeHostPerfTestSevenTabSwitcher, runSingleThread) {
232 runTest(false);
233 }
234
235 class LayerTreeHostPerfTestJsonReader : public LayerTreeHostPerfTest {
236 public:
237 LayerTreeHostPerfTestJsonReader()
238 : LayerTreeHostPerfTest() {
180 } 239 }
181 240
182 virtual void drawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { 241 void readTestFile(std::string name) {
183 impl->setNeedsRedraw(); 242 test_name_ = name;
184 ++num_draws_; 243 FilePath filepath;
185 if (num_draws_ > 120) 244 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &filepath));
186 endTest(); 245 filepath = filepath.AppendASCII("cc").AppendASCII("test")
246 .AppendASCII("data").AppendASCII(name + ".json");
247 std::string json;
248 ASSERT_TRUE(file_util::ReadFileToString(filepath, &json));
249 tree_.reset(base::JSONReader::Read(json));
250 ASSERT_TRUE(tree_);
187 } 251 }
188 252
189 virtual void afterTest() OVERRIDE {} 253 scoped_refptr<Layer> parseLayer(base::Value* val) {
254 DictionaryValue* dict;
255 bool success = true;
256 success &= val->GetAsDictionary(&dict);
257 std::string layer_type;
258 success &= dict->GetString("LayerType", &layer_type);
259 ListValue* list;
260 success &= dict->GetList("Bounds", &list);
261 int width, height;
262 success &= list->GetInteger(0, &width);
263 success &= list->GetInteger(1, &height);
264 success &= dict->GetList("Position", &list);
265 double position_x, position_y;
266 success &= list->GetDouble(0, &position_x);
267 success &= list->GetDouble(1, &position_y);
268
269 scoped_refptr<Layer> new_layer;
270 if (layer_type == "SolidColorLayer") {
271 new_layer = CreateColorLayer(position_x, position_y, width, height);
272 } else if (layer_type == "ContentLayer") {
273 new_layer = CreateContentLayer(position_x, position_y, width, height);
274 } else if (layer_type == "NinePatchLayer") {
275 success &= dict->GetList("ImageAperture", &list);
276 int aperture_x, aperture_y, aperture_width, aperture_height;
277 success &= list->GetInteger(0, &aperture_x);
278 success &= list->GetInteger(1, &aperture_y);
279 success &= list->GetInteger(2, &aperture_width);
280 success &= list->GetInteger(3, &aperture_height);
281
282 new_layer = CreateDecorationLayer(
283 position_x, position_y, width, height,
284 gfx::Rect(aperture_x, aperture_y, aperture_width, aperture_height));
285
286 } else { // Type "Layer" or "unknown"
287 new_layer = CreateLayer(position_x, position_y, width, height);
288 }
289
290 success &= dict->GetList("DrawTransform", &list);
291 double transform[16];
292 for (int i = 0; i < 16; ++i)
293 success &= list->GetDouble(i, &transform[i]);
294
295 gfx::Transform gfxTransform;
296 gfxTransform.matrix().setColMajord(transform);
297 new_layer->setTransform(gfxTransform);
298
299 success &= dict->GetList("Children", &list);
300 for (ListValue::const_iterator it = list->begin();
301 it != list->end(); ++it) {
302 new_layer->addChild(parseLayer(*it));
303 }
304
305 if (!success)
306 ADD_FAILURE() << "Could not parse json data";
307
308 return new_layer;
309 }
310
311 virtual void buildTree() OVERRIDE {
312 gfx::Size viewport = gfx::Size(720, 1038);
313 m_layerTreeHost->setViewportSize(viewport, viewport);
314 m_layerTreeHost->setRootLayer(parseLayer(tree_.get()));
315 }
190 316
191 private: 317 private:
192 int num_draws_; 318 scoped_ptr<base::Value> tree_;
193 WebKitTests::FakeContentLayerClient fake_delegate_;
194 }; 319 };
195 320
196 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostPerfTestSevenTabSwitcher); 321 TEST_F(LayerTreeHostPerfTestJsonReader, tenTenSingleThread) {
322 readTestFile("10_10_layer_tree");
323 runTest(false);
324 }
197 325
198 } // namespace 326 } // namespace
199 } // namespace cc 327 } // namespace cc
OLDNEW
« no previous file with comments | « cc/cc_tests.gyp ('k') | cc/test/data/10_10_layer_tree.json » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698