OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "cc/trees/layer_tree_host_common.h" | |
6 | |
7 #include <sstream> | |
8 | |
9 #include "base/files/file_path.h" | |
10 #include "base/files/file_util.h" | |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "base/path_service.h" | |
13 #include "base/strings/string_piece.h" | |
14 #include "base/threading/thread.h" | |
15 #include "base/time/time.h" | |
16 #include "cc/base/scoped_ptr_deque.h" | |
17 #include "cc/base/scoped_ptr_vector.h" | |
18 #include "cc/debug/lap_timer.h" | |
19 #include "cc/layers/layer.h" | |
20 #include "cc/output/bsp_tree.h" | |
21 #include "cc/quads/draw_polygon.h" | |
22 #include "cc/quads/draw_quad.h" | |
23 #include "cc/test/fake_content_layer_client.h" | |
24 #include "cc/test/fake_layer_tree_host_client.h" | |
25 #include "cc/test/layer_tree_json_parser.h" | |
26 #include "cc/test/layer_tree_test.h" | |
27 #include "cc/test/paths.h" | |
28 #include "cc/trees/layer_tree_impl.h" | |
29 #include "testing/perf/perf_test.h" | |
30 | |
31 namespace cc { | |
32 namespace { | |
33 | |
34 static const int kTimeLimitMillis = 2000; | |
35 static const int kWarmupRuns = 5; | |
36 static const int kTimeCheckInterval = 10; | |
37 | |
38 class LayerTreeHostCommonPerfTest : public LayerTreeTest { | |
39 public: | |
40 LayerTreeHostCommonPerfTest() | |
41 : timer_(kWarmupRuns, | |
42 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), | |
43 kTimeCheckInterval) {} | |
44 | |
45 void ReadTestFile(const std::string& name) { | |
46 base::FilePath test_data_dir; | |
47 ASSERT_TRUE(PathService::Get(CCPaths::DIR_TEST_DATA, &test_data_dir)); | |
48 base::FilePath json_file = test_data_dir.AppendASCII(name + ".json"); | |
49 ASSERT_TRUE(base::ReadFileToString(json_file, &json_)); | |
50 } | |
51 | |
52 void SetupTree() override { | |
53 gfx::Size viewport = gfx::Size(720, 1038); | |
54 layer_tree_host()->SetViewportSize(viewport); | |
55 scoped_refptr<Layer> root = | |
56 ParseTreeFromJson(json_, &content_layer_client_); | |
57 ASSERT_TRUE(root.get()); | |
58 layer_tree_host()->SetRootLayer(root); | |
59 } | |
60 | |
61 void SetTestName(const std::string& name) { test_name_ = name; } | |
62 | |
63 void AfterTest() override { | |
64 CHECK(!test_name_.empty()) << "Must SetTestName() before TearDown()."; | |
65 perf_test::PrintResult("calc_draw_props_time", | |
66 "", | |
67 test_name_, | |
68 1000 * timer_.MsPerLap(), | |
69 "us", | |
70 true); | |
71 } | |
72 | |
73 protected: | |
74 FakeContentLayerClient content_layer_client_; | |
75 LapTimer timer_; | |
76 std::string test_name_; | |
77 std::string json_; | |
78 }; | |
79 | |
80 class CalcDrawPropsMainTest : public LayerTreeHostCommonPerfTest { | |
81 public: | |
82 void RunCalcDrawProps() { RunTest(false, false, false); } | |
83 | |
84 void BeginTest() override { | |
85 timer_.Reset(); | |
86 | |
87 do { | |
88 bool can_render_to_separate_surface = true; | |
89 int max_texture_size = 8096; | |
90 RenderSurfaceLayerList update_list; | |
91 LayerTreeHostCommon::CalcDrawPropsMainInputs inputs( | |
92 layer_tree_host()->root_layer(), | |
93 layer_tree_host()->device_viewport_size(), gfx::Transform(), | |
94 layer_tree_host()->device_scale_factor(), | |
95 layer_tree_host()->page_scale_factor(), | |
96 layer_tree_host()->overscroll_elasticity_layer(), | |
97 layer_tree_host()->elastic_overscroll(), | |
98 layer_tree_host()->page_scale_layer(), max_texture_size, | |
99 layer_tree_host()->settings().can_use_lcd_text, | |
100 layer_tree_host()->settings().layers_always_allowed_lcd_text, | |
101 can_render_to_separate_surface, | |
102 layer_tree_host() | |
103 ->settings() | |
104 .layer_transforms_should_scale_layer_contents, | |
105 layer_tree_host()->settings().verify_property_trees, | |
106 &update_list, 0); | |
107 LayerTreeHostCommon::CalculateDrawProperties(&inputs); | |
108 | |
109 timer_.NextLap(); | |
110 } while (!timer_.HasTimeLimitExpired()); | |
111 | |
112 EndTest(); | |
113 } | |
114 }; | |
115 | |
116 class CalcDrawPropsImplTest : public LayerTreeHostCommonPerfTest { | |
117 public: | |
118 void RunCalcDrawProps() { | |
119 RunTestWithImplSidePainting(); | |
120 } | |
121 | |
122 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
123 | |
124 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { | |
125 timer_.Reset(); | |
126 LayerTreeImpl* active_tree = host_impl->active_tree(); | |
127 | |
128 do { | |
129 bool can_render_to_separate_surface = true; | |
130 int max_texture_size = 8096; | |
131 DoCalcDrawPropertiesImpl(can_render_to_separate_surface, | |
132 max_texture_size, | |
133 active_tree, | |
134 host_impl); | |
135 | |
136 timer_.NextLap(); | |
137 } while (!timer_.HasTimeLimitExpired()); | |
138 | |
139 EndTest(); | |
140 } | |
141 | |
142 void DoCalcDrawPropertiesImpl(bool can_render_to_separate_surface, | |
143 int max_texture_size, | |
144 LayerTreeImpl* active_tree, | |
145 LayerTreeHostImpl* host_impl) { | |
146 LayerImplList update_list; | |
147 LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( | |
148 active_tree->root_layer(), active_tree->DrawViewportSize(), | |
149 host_impl->DrawTransform(), active_tree->device_scale_factor(), | |
150 active_tree->current_page_scale_factor(), | |
151 active_tree->InnerViewportContainerLayer(), | |
152 active_tree->elastic_overscroll()->Current(active_tree->IsActiveTree()), | |
153 active_tree->overscroll_elasticity_layer(), max_texture_size, | |
154 host_impl->settings().can_use_lcd_text, | |
155 host_impl->settings().layers_always_allowed_lcd_text, | |
156 can_render_to_separate_surface, | |
157 host_impl->settings().layer_transforms_should_scale_layer_contents, | |
158 host_impl->settings().verify_property_trees, | |
159 &update_list, 0); | |
160 LayerTreeHostCommon::CalculateDrawProperties(&inputs); | |
161 } | |
162 }; | |
163 | |
164 class BspTreePerfTest : public CalcDrawPropsImplTest { | |
165 public: | |
166 void RunSortLayers() { RunTest(false, false, false); } | |
167 | |
168 void SetNumberOfDuplicates(int num_duplicates) { | |
169 num_duplicates_ = num_duplicates; | |
170 } | |
171 | |
172 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
173 | |
174 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { | |
175 LayerTreeImpl* active_tree = host_impl->active_tree(); | |
176 // First build the tree and then we'll start running tests on layersorter | |
177 // itself | |
178 bool can_render_to_separate_surface = true; | |
179 int max_texture_size = 8096; | |
180 DoCalcDrawPropertiesImpl(can_render_to_separate_surface, | |
181 max_texture_size, | |
182 active_tree, | |
183 host_impl); | |
184 | |
185 LayerImplList base_list; | |
186 BuildLayerImplList(active_tree->root_layer(), &base_list); | |
187 | |
188 int polygon_counter = 0; | |
189 ScopedPtrVector<DrawPolygon> polygon_list; | |
190 for (LayerImplList::iterator it = base_list.begin(); it != base_list.end(); | |
191 ++it) { | |
192 DrawPolygon* draw_polygon = | |
193 new DrawPolygon(NULL, | |
194 gfx::RectF((*it)->content_bounds()), | |
195 (*it)->draw_transform(), | |
196 polygon_counter++); | |
197 polygon_list.push_back(scoped_ptr<DrawPolygon>(draw_polygon)); | |
198 } | |
199 | |
200 timer_.Reset(); | |
201 do { | |
202 ScopedPtrDeque<DrawPolygon> test_list; | |
203 for (int i = 0; i < num_duplicates_; i++) { | |
204 for (size_t i = 0; i < polygon_list.size(); i++) { | |
205 test_list.push_back(polygon_list[i]->CreateCopy()); | |
206 } | |
207 } | |
208 BspTree bsp_tree(&test_list); | |
209 timer_.NextLap(); | |
210 } while (!timer_.HasTimeLimitExpired()); | |
211 | |
212 EndTest(); | |
213 } | |
214 | |
215 void BuildLayerImplList(LayerImpl* layer, LayerImplList* list) { | |
216 if (layer->Is3dSorted()) { | |
217 list->push_back(layer); | |
218 } | |
219 | |
220 for (size_t i = 0; i < layer->children().size(); i++) { | |
221 BuildLayerImplList(layer->children()[i], list); | |
222 } | |
223 } | |
224 | |
225 private: | |
226 LayerImplList base_list_; | |
227 int num_duplicates_; | |
228 }; | |
229 | |
230 TEST_F(CalcDrawPropsMainTest, TenTen) { | |
231 SetTestName("10_10_main_thread"); | |
232 ReadTestFile("10_10_layer_tree"); | |
233 RunCalcDrawProps(); | |
234 } | |
235 | |
236 TEST_F(CalcDrawPropsMainTest, HeavyPage) { | |
237 SetTestName("heavy_page_main_thread"); | |
238 ReadTestFile("heavy_layer_tree"); | |
239 RunCalcDrawProps(); | |
240 } | |
241 | |
242 TEST_F(CalcDrawPropsMainTest, TouchRegionLight) { | |
243 SetTestName("touch_region_light_main_thread"); | |
244 ReadTestFile("touch_region_light"); | |
245 RunCalcDrawProps(); | |
246 } | |
247 | |
248 TEST_F(CalcDrawPropsMainTest, TouchRegionHeavy) { | |
249 SetTestName("touch_region_heavy_main_thread"); | |
250 ReadTestFile("touch_region_heavy"); | |
251 RunCalcDrawProps(); | |
252 } | |
253 | |
254 TEST_F(CalcDrawPropsImplTest, TenTen) { | |
255 SetTestName("10_10"); | |
256 ReadTestFile("10_10_layer_tree"); | |
257 RunCalcDrawProps(); | |
258 } | |
259 | |
260 TEST_F(CalcDrawPropsImplTest, HeavyPage) { | |
261 SetTestName("heavy_page"); | |
262 ReadTestFile("heavy_layer_tree"); | |
263 RunCalcDrawProps(); | |
264 } | |
265 | |
266 TEST_F(CalcDrawPropsImplTest, TouchRegionLight) { | |
267 SetTestName("touch_region_light"); | |
268 ReadTestFile("touch_region_light"); | |
269 RunCalcDrawProps(); | |
270 } | |
271 | |
272 TEST_F(CalcDrawPropsImplTest, TouchRegionHeavy) { | |
273 SetTestName("touch_region_heavy"); | |
274 ReadTestFile("touch_region_heavy"); | |
275 RunCalcDrawProps(); | |
276 } | |
277 | |
278 TEST_F(BspTreePerfTest, LayerSorterCubes) { | |
279 SetTestName("layer_sort_cubes"); | |
280 ReadTestFile("layer_sort_cubes"); | |
281 RunSortLayers(); | |
282 } | |
283 | |
284 TEST_F(BspTreePerfTest, LayerSorterRubik) { | |
285 SetTestName("layer_sort_rubik"); | |
286 ReadTestFile("layer_sort_rubik"); | |
287 // TODO(vollick): Remove verify_property_trees setting after | |
288 // crbug.com/444219 is fixed. | |
289 bool old_verify_property_trees = verify_property_trees(); | |
290 set_verify_property_trees(false); | |
291 RunSortLayers(); | |
292 set_verify_property_trees(old_verify_property_trees); | |
293 } | |
294 | |
295 TEST_F(BspTreePerfTest, BspTreeCubes) { | |
296 SetTestName("bsp_tree_cubes"); | |
297 SetNumberOfDuplicates(1); | |
298 ReadTestFile("layer_sort_cubes"); | |
299 RunSortLayers(); | |
300 } | |
301 | |
302 TEST_F(BspTreePerfTest, BspTreeRubik) { | |
303 SetTestName("bsp_tree_rubik"); | |
304 SetNumberOfDuplicates(1); | |
305 ReadTestFile("layer_sort_rubik"); | |
306 // TODO(vollick): Remove verify_property_trees setting after | |
307 // crbug.com/444219 is fixed. | |
308 bool old_verify_property_trees = verify_property_trees(); | |
309 set_verify_property_trees(false); | |
310 RunSortLayers(); | |
311 set_verify_property_trees(old_verify_property_trees); | |
312 } | |
313 | |
314 TEST_F(BspTreePerfTest, BspTreeCubes_2) { | |
315 SetTestName("bsp_tree_cubes_2"); | |
316 SetNumberOfDuplicates(2); | |
317 ReadTestFile("layer_sort_cubes"); | |
318 RunSortLayers(); | |
319 } | |
320 | |
321 TEST_F(BspTreePerfTest, BspTreeCubes_4) { | |
322 SetTestName("bsp_tree_cubes_4"); | |
323 SetNumberOfDuplicates(4); | |
324 ReadTestFile("layer_sort_cubes"); | |
325 RunSortLayers(); | |
326 } | |
327 | |
328 } // namespace | |
329 } // namespace cc | |
OLD | NEW |