OLD | NEW |
---|---|
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 kMaxFrames = 120; |
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 impl->setNeedsRedraw(); | |
danakj
2012/11/30 01:21:00
Probly won't matter, but this should be the else c
| |
39 ++num_draws_; | |
40 if (num_draws_ > kMaxFrames) | |
41 endTest(); | |
42 } | |
43 | |
44 virtual void buildTree() {} | |
45 | |
46 virtual void afterTest() OVERRIDE { | |
47 base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_; | |
48 // Format matches chrome/test/perf/perf_test.h:PrintResult | |
49 printf("*RESULT %s: t= %.2f ms\n", test_name_.c_str(), | |
50 elapsed.InMillisecondsF()); | |
51 } | |
52 | |
24 scoped_refptr<Layer> CreateLayer(float x, float y, int width, int height) { | 53 scoped_refptr<Layer> CreateLayer(float x, float y, int width, int height) { |
25 scoped_refptr<Layer> layer = Layer::create(); | 54 scoped_refptr<Layer> layer = Layer::create(); |
26 layer->setAnchorPoint(gfx::Point()); | 55 layer->setAnchorPoint(gfx::Point()); |
27 layer->setPosition(gfx::PointF(x, y)); | 56 layer->setPosition(gfx::PointF(x, y)); |
28 layer->setBounds(gfx::Size(width, height)); | 57 layer->setBounds(gfx::Size(width, height)); |
29 return layer; | 58 return layer; |
30 } | 59 } |
31 | 60 |
32 scoped_refptr<ContentLayer> CreateContentLayer(float x, float y, int width, in t height) { | 61 scoped_refptr<ContentLayer> CreateContentLayer(float x, float y, int width, in t height) { |
33 scoped_refptr<ContentLayer> layer = ContentLayer::create(&fake_delegate_); | 62 scoped_refptr<ContentLayer> layer = ContentLayer::create(&fake_delegate_); |
34 layer->setAnchorPoint(gfx::Point()); | 63 layer->setAnchorPoint(gfx::Point()); |
35 layer->setPosition(gfx::PointF(x, y)); | 64 layer->setPosition(gfx::PointF(x, y)); |
36 layer->setBounds(gfx::Size(width, height)); | 65 layer->setBounds(gfx::Size(width, height)); |
37 layer->setIsDrawable(true); | 66 layer->setIsDrawable(true); |
38 return layer; | 67 return layer; |
39 } | 68 } |
40 | 69 |
41 scoped_refptr<SolidColorLayer> CreateColorLayer(float x, float y, int width, i nt height) { | 70 scoped_refptr<SolidColorLayer> CreateColorLayer(float x, float y, int width, i nt height) { |
42 scoped_refptr<SolidColorLayer> layer = SolidColorLayer::create(); | 71 scoped_refptr<SolidColorLayer> layer = SolidColorLayer::create(); |
43 layer->setAnchorPoint(gfx::Point()); | 72 layer->setAnchorPoint(gfx::Point()); |
44 layer->setPosition(gfx::PointF(x, y)); | 73 layer->setPosition(gfx::PointF(x, y)); |
45 layer->setBounds(gfx::Size(width, height)); | 74 layer->setBounds(gfx::Size(width, height)); |
46 layer->setIsDrawable(true); | 75 layer->setIsDrawable(true); |
47 return layer; | 76 return layer; |
48 } | 77 } |
49 | 78 |
50 scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int widt h, int height) { | 79 scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int widt h, int height) { |
80 return CreateDecorationLayer(x, y, width, height, gfx::Rect(0, 0, width, hei ght)); | |
81 } | |
82 | |
83 scoped_refptr<NinePatchLayer> CreateDecorationLayer(float x, float y, int widt h, int height, gfx::Rect aperture) { | |
51 scoped_refptr<NinePatchLayer> layer = NinePatchLayer::create(); | 84 scoped_refptr<NinePatchLayer> layer = NinePatchLayer::create(); |
52 layer->setAnchorPoint(gfx::Point()); | 85 layer->setAnchorPoint(gfx::Point()); |
53 layer->setPosition(gfx::PointF(x, y)); | 86 layer->setPosition(gfx::PointF(x, y)); |
54 layer->setBounds(gfx::Size(width, height)); | 87 layer->setBounds(gfx::Size(width, height)); |
55 layer->setIsDrawable(true); | 88 layer->setIsDrawable(true); |
56 | 89 |
57 SkBitmap bitmap; | 90 SkBitmap bitmap; |
58 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1); | 91 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 1, 1); |
59 bitmap.allocPixels(NULL, NULL); | 92 bitmap.allocPixels(NULL, NULL); |
60 layer->setBitmap(bitmap, gfx::Rect(0, 0, width, height)); | 93 layer->setBitmap(bitmap, aperture); |
61 | 94 |
62 return layer; | 95 return layer; |
63 } | 96 } |
64 | 97 |
65 scoped_refptr<Layer> addChild(scoped_refptr<Layer> parent, scoped_refptr<Layer > child) { | 98 scoped_refptr<Layer> addChild(scoped_refptr<Layer> parent, scoped_refptr<Layer > child) { |
66 parent->addChild(child); | 99 parent->addChild(child); |
67 return child; | 100 return child; |
68 } | 101 } |
69 | 102 |
70 virtual void beginTest() OVERRIDE { | 103 protected: |
104 base::TimeTicks start_time_; | |
105 int num_draws_; | |
106 std::string test_name_; | |
107 WebKitTests::FakeContentLayerClient fake_delegate_; | |
108 }; | |
109 | |
110 class LayerTreeHostPerfTestSevenTabSwitcher : public LayerTreeHostPerfTest { | |
111 public: | |
112 LayerTreeHostPerfTestSevenTabSwitcher() | |
113 : LayerTreeHostPerfTest() { | |
114 test_name_ = "SevenTabSwitcher"; | |
115 } | |
116 | |
117 virtual void buildTree() OVERRIDE { | |
71 scoped_refptr<Layer> root = CreateLayer(0, 0, 720, 1038); // 1 | 118 scoped_refptr<Layer> root = CreateLayer(0, 0, 720, 1038); // 1 |
72 scoped_refptr<Layer> layer; | 119 scoped_refptr<Layer> layer; |
73 | 120 |
74 gfx::Transform down_scale_matrix; | 121 gfx::Transform down_scale_matrix; |
75 down_scale_matrix.Scale(0.747, 0.747); | 122 down_scale_matrix.Scale(0.747, 0.747); |
76 | 123 |
77 layer = addChild(root, CreateLayer(0, 0, 0, 0)); // 2 | 124 layer = addChild(root, CreateLayer(0, 0, 0, 0)); // 2 |
78 | 125 |
79 layer = addChild(root, CreateLayer(628, 15, 0, 0)); // 5 | 126 layer = addChild(root, CreateLayer(628, 15, 0, 0)); // 5 |
80 layer = addChild(root, CreateDecorationLayer(564, -49, 665, 274)); // 13 | 127 layer = addChild(root, CreateDecorationLayer(564, -49, 665, 274)); // 13 |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
169 layer->setTransform(down_scale_matrix); | 216 layer->setTransform(down_scale_matrix); |
170 | 217 |
171 layer = addChild(root, CreateLayer(30, 617, 0, 0)); // 120 | 218 layer = addChild(root, CreateLayer(30, 617, 0, 0)); // 120 |
172 layer = addChild(root, CreateDecorationLayer(14, 601, 569, 807)); // 124 | 219 layer = addChild(root, CreateDecorationLayer(14, 601, 569, 807)); // 124 |
173 layer = addChild(root, CreateDecorationLayer(229.135986f, 601, 354, 96)); // 123 | 220 layer = addChild(root, CreateDecorationLayer(229.135986f, 601, 354, 96)); // 123 |
174 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 122 | 221 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 122 |
175 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 121 | 222 layer = addChild(root, CreateContentLayer(30, 617, 0, 0)); // 121 |
176 | 223 |
177 m_layerTreeHost->setViewportSize(gfx::Size(720, 1038), gfx::Size(720, 1038)) ; | 224 m_layerTreeHost->setViewportSize(gfx::Size(720, 1038), gfx::Size(720, 1038)) ; |
178 m_layerTreeHost->setRootLayer(root); | 225 m_layerTreeHost->setRootLayer(root); |
179 postSetNeedsCommitToMainThread(); | 226 } |
227 }; | |
228 | |
229 TEST_F(LayerTreeHostPerfTestSevenTabSwitcher, runSingleThread) { | |
230 runTest(false); | |
231 } | |
232 | |
233 class LayerTreeHostPerfTestJsonReader : public LayerTreeHostPerfTest { | |
234 public: | |
235 LayerTreeHostPerfTestJsonReader() | |
236 : LayerTreeHostPerfTest() { | |
180 } | 237 } |
181 | 238 |
182 virtual void drawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { | 239 void readTestFile(std::string name) { |
183 impl->setNeedsRedraw(); | 240 test_name_ = name; |
184 ++num_draws_; | 241 FilePath filepath; |
185 if (num_draws_ > 120) | 242 ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &filepath)); |
186 endTest(); | 243 filepath = filepath.AppendASCII("cc").AppendASCII("test") |
244 .AppendASCII("data").AppendASCII(name + ".json"); | |
245 std::string json; | |
246 ASSERT_TRUE(file_util::ReadFileToString(filepath, &json)); | |
247 tree_.reset(base::JSONReader::Read(json)); | |
248 ASSERT_TRUE(tree_); | |
187 } | 249 } |
188 | 250 |
189 virtual void afterTest() OVERRIDE {} | 251 scoped_refptr<Layer> parseLayer(base::Value* val) { |
252 DictionaryValue* dict; | |
253 bool success = true; | |
254 success &= val->GetAsDictionary(&dict); | |
255 std::string layer_type; | |
256 success &= dict->GetString("LayerType", &layer_type); | |
257 ListValue* list; | |
258 success &= dict->GetList("Bounds", &list); | |
259 int width, height; | |
260 success &= list->GetInteger(0, &width); | |
261 success &= list->GetInteger(1, &height); | |
262 success &= dict->GetList("Position", &list); | |
263 double position_x, position_y; | |
264 success &= list->GetDouble(0, &position_x); | |
265 success &= list->GetDouble(1, &position_y); | |
266 | |
267 scoped_refptr<Layer> new_layer; | |
268 if (layer_type == "SolidColorLayer") { | |
269 new_layer = CreateColorLayer(position_x, position_y, width, height); | |
270 } else if (layer_type == "ContentLayer") { | |
danakj
2012/11/30 01:21:00
aside: we should dump the opaque info for these an
| |
271 new_layer = CreateContentLayer(position_x, position_y, width, height); | |
272 } else if (layer_type == "NinePatchLayer") { | |
273 success &= dict->GetList("ImageAperture", &list); | |
274 int aperture_x, aperture_y, aperture_width, aperture_height; | |
275 success &= list->GetInteger(0, &aperture_x); | |
276 success &= list->GetInteger(1, &aperture_y); | |
277 success &= list->GetInteger(2, &aperture_width); | |
278 success &= list->GetInteger(3, &aperture_height); | |
279 | |
280 new_layer = CreateDecorationLayer( | |
281 position_x, position_y, width, height, | |
282 gfx::Rect(aperture_x, aperture_y, aperture_width, aperture_height)); | |
283 | |
284 } else { // Type "Layer" or unknown" | |
danakj
2012/11/30 01:21:00
mismatched "
| |
285 new_layer = CreateLayer(position_x, position_y, width, height); | |
286 } | |
287 | |
288 success &= dict->GetList("DrawTransform", &list); | |
289 double transform[16]; | |
290 for (int i=0; i<16; ++i) { | |
danakj
2012/11/30 01:21:00
no {}
danakj
2012/11/30 01:21:00
spaces around operators
| |
291 success &= list->GetDouble(i, &transform[i]); | |
292 } | |
293 | |
294 gfx::Transform gfxTransform; | |
295 gfxTransform.matrix().setColMajord(transform); | |
296 new_layer->setTransform(gfxTransform); | |
297 | |
298 success &= dict->GetList("Children", &list); | |
299 for (ListValue::const_iterator it = list->begin(); | |
300 it != list->end(); ++it) { | |
301 new_layer->addChild(parseLayer(*it)); | |
302 } | |
303 | |
304 if (!success) | |
305 ADD_FAILURE(); | |
danakj
2012/11/30 01:21:00
<< "Unable to parse layer."
| |
306 | |
307 return new_layer; | |
308 } | |
309 | |
310 virtual void buildTree() OVERRIDE { | |
311 gfx::Size viewport = gfx::Size(720, 1038); | |
danakj
2012/11/30 01:21:00
aside: maybe this should be in the json too, or be
| |
312 m_layerTreeHost->setViewportSize(viewport, viewport); | |
313 m_layerTreeHost->setRootLayer(parseLayer(tree_.get())); | |
314 } | |
190 | 315 |
191 private: | 316 private: |
192 int num_draws_; | 317 scoped_ptr<base::Value> tree_; |
193 WebKitTests::FakeContentLayerClient fake_delegate_; | |
194 }; | 318 }; |
195 | 319 |
196 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostPerfTestSevenTabSwitcher); | 320 TEST_F(LayerTreeHostPerfTestJsonReader, tenTenSingleThread) { |
321 readTestFile("10_10_layer_tree"); | |
322 runTest(false); | |
323 } | |
197 | 324 |
198 } // namespace | 325 } // namespace |
199 } // namespace cc | 326 } // namespace cc |
OLD | NEW |