blob: 49831328d1ee5eb917d151776677e9249b220035 [file] [log] [blame]
[email protected]8428be22013-10-23 07:37:441// 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
[email protected]8428be22013-10-23 07:37:449#include "base/files/file_path.h"
thestig90a09082014-09-10 07:59:4610#include "base/files/file_util.h"
[email protected]2a021fb7b2014-08-02 07:53:4911#include "base/memory/scoped_ptr.h"
[email protected]8428be22013-10-23 07:37:4412#include "base/path_service.h"
13#include "base/strings/string_piece.h"
14#include "base/threading/thread.h"
15#include "base/time/time.h"
[email protected]2a021fb7b2014-08-02 07:53:4916#include "cc/base/scoped_ptr_deque.h"
17#include "cc/base/scoped_ptr_vector.h"
[email protected]29d39a42014-05-13 19:40:5818#include "cc/debug/lap_timer.h"
[email protected]8428be22013-10-23 07:37:4419#include "cc/layers/layer.h"
[email protected]2a021fb7b2014-08-02 07:53:4920#include "cc/output/bsp_tree.h"
21#include "cc/quads/draw_polygon.h"
22#include "cc/quads/draw_quad.h"
[email protected]8428be22013-10-23 07:37:4423#include "cc/test/fake_content_layer_client.h"
24#include "cc/test/fake_layer_tree_host_client.h"
[email protected]8428be22013-10-23 07:37:4425#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
31namespace cc {
32namespace {
33
34static const int kTimeLimitMillis = 2000;
35static const int kWarmupRuns = 5;
36static const int kTimeCheckInterval = 10;
37
38class 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;
[email protected]e51444a2013-12-10 23:05:0147 ASSERT_TRUE(PathService::Get(CCPaths::DIR_TEST_DATA, &test_data_dir));
[email protected]8428be22013-10-23 07:37:4448 base::FilePath json_file = test_data_dir.AppendASCII(name + ".json");
49 ASSERT_TRUE(base::ReadFileToString(json_file, &json_));
50 }
51
dcheng716bedf2014-10-21 09:51:0852 void SetupTree() override {
[email protected]8428be22013-10-23 07:37:4453 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
dcheng716bedf2014-10-21 09:51:0863 void AfterTest() override {
[email protected]8428be22013-10-23 07:37:4464 CHECK(!test_name_.empty()) << "Must SetTestName() before TearDown().";
[email protected]8428be22013-10-23 07:37:4465 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
Dana Jansensab277762015-06-12 23:52:5580class CalcDrawPropsTest : public LayerTreeHostCommonPerfTest {
[email protected]8428be22013-10-23 07:37:4481 public:
Dana Jansensab277762015-06-12 23:52:5582 void RunCalcDrawProps() { RunTest(false, false); }
[email protected]8428be22013-10-23 07:37:4483
dcheng716bedf2014-10-21 09:51:0884 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]8428be22013-10-23 07:37:4485
dcheng716bedf2014-10-21 09:51:0886 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
[email protected]8428be22013-10-23 07:37:4487 timer_.Reset();
88 LayerTreeImpl* active_tree = host_impl->active_tree();
89
90 do {
91 bool can_render_to_separate_surface = true;
92 int max_texture_size = 8096;
[email protected]bebb1a82014-06-06 05:03:5493 DoCalcDrawPropertiesImpl(can_render_to_separate_surface,
94 max_texture_size,
95 active_tree,
96 host_impl);
[email protected]8428be22013-10-23 07:37:4497
98 timer_.NextLap();
99 } while (!timer_.HasTimeLimitExpired());
100
101 EndTest();
102 }
[email protected]bebb1a82014-06-06 05:03:54103
104 void DoCalcDrawPropertiesImpl(bool can_render_to_separate_surface,
105 int max_texture_size,
106 LayerTreeImpl* active_tree,
107 LayerTreeHostImpl* host_impl) {
108 LayerImplList update_list;
ennec3011472015-04-09 01:27:25109 PropertyTrees property_trees;
vollick19b86192015-04-01 16:17:36110 bool verify_property_trees = false;
[email protected]bebb1a82014-06-06 05:03:54111 LayerTreeHostCommon::CalcDrawPropsImplInputs inputs(
danakj3f76ace2014-11-18 16:56:00112 active_tree->root_layer(), active_tree->DrawViewportSize(),
113 host_impl->DrawTransform(), active_tree->device_scale_factor(),
aelias58eec0812014-12-04 01:04:40114 active_tree->current_page_scale_factor(),
ccameronb9aec4502014-12-05 19:31:00115 active_tree->InnerViewportContainerLayer(),
ajuma6b46da22015-06-25 21:53:02116 active_tree->InnerViewportScrollLayer(),
117 active_tree->OuterViewportScrollLayer(),
ccameronb9aec4502014-12-05 19:31:00118 active_tree->elastic_overscroll()->Current(active_tree->IsActiveTree()),
119 active_tree->overscroll_elasticity_layer(), max_texture_size,
[email protected]bebb1a82014-06-06 05:03:54120 host_impl->settings().can_use_lcd_text,
danakj3f76ace2014-11-18 16:56:00121 host_impl->settings().layers_always_allowed_lcd_text,
[email protected]bebb1a82014-06-06 05:03:54122 can_render_to_separate_surface,
123 host_impl->settings().layer_transforms_should_scale_layer_contents,
ennec3011472015-04-09 01:27:25124 verify_property_trees, &update_list, 0, &property_trees);
[email protected]bebb1a82014-06-06 05:03:54125 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
126 }
127};
128
Dana Jansensab277762015-06-12 23:52:55129class BspTreePerfTest : public CalcDrawPropsTest {
[email protected]2a021fb7b2014-08-02 07:53:49130 public:
awoloszynfae52bf2015-03-24 18:19:21131 BspTreePerfTest() : num_duplicates_(1) {}
Dana Jansensab277762015-06-12 23:52:55132 void RunSortLayers() { RunTest(false, false); }
[email protected]2a021fb7b2014-08-02 07:53:49133
134 void SetNumberOfDuplicates(int num_duplicates) {
135 num_duplicates_ = num_duplicates;
136 }
137
dcheng716bedf2014-10-21 09:51:08138 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]2a021fb7b2014-08-02 07:53:49139
dcheng716bedf2014-10-21 09:51:08140 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
[email protected]2a021fb7b2014-08-02 07:53:49141 LayerTreeImpl* active_tree = host_impl->active_tree();
142 // First build the tree and then we'll start running tests on layersorter
143 // itself
144 bool can_render_to_separate_surface = true;
145 int max_texture_size = 8096;
146 DoCalcDrawPropertiesImpl(can_render_to_separate_surface,
147 max_texture_size,
148 active_tree,
149 host_impl);
150
151 LayerImplList base_list;
152 BuildLayerImplList(active_tree->root_layer(), &base_list);
153
154 int polygon_counter = 0;
155 ScopedPtrVector<DrawPolygon> polygon_list;
156 for (LayerImplList::iterator it = base_list.begin(); it != base_list.end();
157 ++it) {
158 DrawPolygon* draw_polygon =
Dana Jansensc46d3742015-06-18 01:33:14159 new DrawPolygon(NULL, gfx::RectF((*it)->bounds()),
160 (*it)->draw_transform(), polygon_counter++);
[email protected]2a021fb7b2014-08-02 07:53:49161 polygon_list.push_back(scoped_ptr<DrawPolygon>(draw_polygon));
162 }
163
164 timer_.Reset();
165 do {
166 ScopedPtrDeque<DrawPolygon> test_list;
167 for (int i = 0; i < num_duplicates_; i++) {
168 for (size_t i = 0; i < polygon_list.size(); i++) {
169 test_list.push_back(polygon_list[i]->CreateCopy());
170 }
171 }
172 BspTree bsp_tree(&test_list);
173 timer_.NextLap();
174 } while (!timer_.HasTimeLimitExpired());
175
176 EndTest();
177 }
178
awoloszyn3d8eb1d2015-03-12 14:38:32179 void BuildLayerImplList(LayerImpl* layer, LayerImplList* list) {
180 if (layer->Is3dSorted()) {
181 list->push_back(layer);
182 }
183
184 for (size_t i = 0; i < layer->children().size(); i++) {
185 BuildLayerImplList(layer->children()[i], list);
186 }
187 }
188
[email protected]2a021fb7b2014-08-02 07:53:49189 private:
awoloszyn3d8eb1d2015-03-12 14:38:32190 LayerImplList base_list_;
[email protected]2a021fb7b2014-08-02 07:53:49191 int num_duplicates_;
192};
193
Dana Jansensab277762015-06-12 23:52:55194TEST_F(CalcDrawPropsTest, TenTen) {
[email protected]8428be22013-10-23 07:37:44195 SetTestName("10_10");
196 ReadTestFile("10_10_layer_tree");
197 RunCalcDrawProps();
198}
199
Dana Jansensab277762015-06-12 23:52:55200TEST_F(CalcDrawPropsTest, HeavyPage) {
[email protected]8428be22013-10-23 07:37:44201 SetTestName("heavy_page");
202 ReadTestFile("heavy_layer_tree");
203 RunCalcDrawProps();
204}
205
Dana Jansensab277762015-06-12 23:52:55206TEST_F(CalcDrawPropsTest, TouchRegionLight) {
[email protected]9d161d22013-10-29 20:54:10207 SetTestName("touch_region_light");
208 ReadTestFile("touch_region_light");
209 RunCalcDrawProps();
210}
211
Dana Jansensab277762015-06-12 23:52:55212TEST_F(CalcDrawPropsTest, TouchRegionHeavy) {
[email protected]9d161d22013-10-29 20:54:10213 SetTestName("touch_region_heavy");
214 ReadTestFile("touch_region_heavy");
215 RunCalcDrawProps();
216}
217
awoloszyn3d8eb1d2015-03-12 14:38:32218TEST_F(BspTreePerfTest, LayerSorterCubes) {
[email protected]bebb1a82014-06-06 05:03:54219 SetTestName("layer_sort_cubes");
220 ReadTestFile("layer_sort_cubes");
221 RunSortLayers();
222}
223
awoloszyn3d8eb1d2015-03-12 14:38:32224TEST_F(BspTreePerfTest, LayerSorterRubik) {
[email protected]bebb1a82014-06-06 05:03:54225 SetTestName("layer_sort_rubik");
226 ReadTestFile("layer_sort_rubik");
hendrikw3c8dfa22014-12-22 21:52:29227 // TODO(vollick): Remove verify_property_trees setting after
228 // crbug.com/444219 is fixed.
229 bool old_verify_property_trees = verify_property_trees();
230 set_verify_property_trees(false);
[email protected]bebb1a82014-06-06 05:03:54231 RunSortLayers();
hendrikw3c8dfa22014-12-22 21:52:29232 set_verify_property_trees(old_verify_property_trees);
[email protected]bebb1a82014-06-06 05:03:54233}
234
[email protected]2a021fb7b2014-08-02 07:53:49235TEST_F(BspTreePerfTest, BspTreeCubes) {
236 SetTestName("bsp_tree_cubes");
237 SetNumberOfDuplicates(1);
238 ReadTestFile("layer_sort_cubes");
239 RunSortLayers();
240}
241
242TEST_F(BspTreePerfTest, BspTreeRubik) {
243 SetTestName("bsp_tree_rubik");
244 SetNumberOfDuplicates(1);
245 ReadTestFile("layer_sort_rubik");
hendrikw3c8dfa22014-12-22 21:52:29246 // TODO(vollick): Remove verify_property_trees setting after
247 // crbug.com/444219 is fixed.
248 bool old_verify_property_trees = verify_property_trees();
249 set_verify_property_trees(false);
[email protected]2a021fb7b2014-08-02 07:53:49250 RunSortLayers();
hendrikw3c8dfa22014-12-22 21:52:29251 set_verify_property_trees(old_verify_property_trees);
[email protected]2a021fb7b2014-08-02 07:53:49252}
253
254TEST_F(BspTreePerfTest, BspTreeCubes_2) {
255 SetTestName("bsp_tree_cubes_2");
256 SetNumberOfDuplicates(2);
257 ReadTestFile("layer_sort_cubes");
258 RunSortLayers();
259}
260
261TEST_F(BspTreePerfTest, BspTreeCubes_4) {
262 SetTestName("bsp_tree_cubes_4");
263 SetNumberOfDuplicates(4);
264 ReadTestFile("layer_sort_cubes");
265 RunSortLayers();
266}
267
[email protected]8428be22013-10-23 07:37:44268} // namespace
269} // namespace cc