OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <stddef.h> | 5 #include <stddef.h> |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 #include <memory> | 8 #include <memory> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
(...skipping 16 matching lines...) Expand all Loading... |
28 #include "cc/trees/layer_tree_impl.h" | 28 #include "cc/trees/layer_tree_impl.h" |
29 #include "testing/perf/perf_test.h" | 29 #include "testing/perf/perf_test.h" |
30 | 30 |
31 namespace cc { | 31 namespace cc { |
32 namespace { | 32 namespace { |
33 | 33 |
34 static const int kTimeLimitMillis = 2000; | 34 static const int kTimeLimitMillis = 2000; |
35 static const int kWarmupRuns = 5; | 35 static const int kWarmupRuns = 5; |
36 static const int kTimeCheckInterval = 10; | 36 static const int kTimeCheckInterval = 10; |
37 | 37 |
38 class LayerTreeHostCommonPerfTest : public LayerTreeTest { | 38 class BspTreePerfTest : public LayerTreeTest { |
39 public: | 39 public: |
40 LayerTreeHostCommonPerfTest() | 40 BspTreePerfTest() |
41 : timer_(kWarmupRuns, | 41 : timer_(kWarmupRuns, |
42 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), | 42 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), |
43 kTimeCheckInterval) {} | 43 kTimeCheckInterval) {} |
44 | 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 { | 45 void SetupTree() override { |
53 gfx::Size viewport = gfx::Size(720, 1038); | 46 gfx::Size viewport = gfx::Size(720, 1038); |
54 layer_tree()->SetViewportSize(viewport); | 47 layer_tree()->SetViewportSize(viewport); |
55 scoped_refptr<Layer> root = | 48 scoped_refptr<Layer> root = |
56 ParseTreeFromJson(json_, &content_layer_client_); | 49 ParseTreeFromJson(json_, &content_layer_client_); |
57 ASSERT_TRUE(root.get()); | 50 ASSERT_TRUE(root.get()); |
58 layer_tree()->SetRootLayer(root); | 51 layer_tree()->SetRootLayer(root); |
59 content_layer_client_.set_bounds(viewport); | 52 content_layer_client_.set_bounds(viewport); |
60 } | 53 } |
61 | 54 |
62 void SetTestName(const std::string& name) { test_name_ = name; } | 55 void SetTestName(const std::string& name) { test_name_ = name; } |
63 | 56 |
64 void AfterTest() override { | |
65 CHECK(!test_name_.empty()) << "Must SetTestName() before TearDown()."; | |
66 perf_test::PrintResult("calc_draw_props_time", | |
67 "", | |
68 test_name_, | |
69 1000 * timer_.MsPerLap(), | |
70 "us", | |
71 true); | |
72 } | |
73 | |
74 protected: | |
75 FakeContentLayerClient content_layer_client_; | |
76 LapTimer timer_; | |
77 std::string test_name_; | |
78 std::string json_; | |
79 }; | |
80 | |
81 class CalcDrawPropsTest : public LayerTreeHostCommonPerfTest { | |
82 public: | |
83 void RunCalcDrawProps() { RunTest(CompositorMode::SINGLE_THREADED); } | |
84 | |
85 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
86 | |
87 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { | |
88 timer_.Reset(); | |
89 LayerTreeImpl* active_tree = host_impl->active_tree(); | |
90 | |
91 do { | |
92 bool can_render_to_separate_surface = true; | |
93 int max_texture_size = 8096; | |
94 DoCalcDrawPropertiesImpl(can_render_to_separate_surface, | |
95 max_texture_size, | |
96 active_tree, | |
97 host_impl); | |
98 | |
99 timer_.NextLap(); | |
100 } while (!timer_.HasTimeLimitExpired()); | |
101 | |
102 EndTest(); | |
103 } | |
104 | |
105 void DoCalcDrawPropertiesImpl(bool can_render_to_separate_surface, | |
106 int max_texture_size, | |
107 LayerTreeImpl* active_tree, | |
108 LayerTreeHostImpl* host_impl) { | |
109 LayerImplList update_list; | |
110 LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( | |
111 active_tree->root_layer_for_testing(), active_tree->DrawViewportSize(), | |
112 host_impl->DrawTransform(), active_tree->device_scale_factor(), | |
113 active_tree->current_page_scale_factor(), | |
114 active_tree->InnerViewportContainerLayer(), | |
115 active_tree->InnerViewportScrollLayer(), | |
116 active_tree->OuterViewportScrollLayer(), | |
117 active_tree->elastic_overscroll()->Current(active_tree->IsActiveTree()), | |
118 active_tree->OverscrollElasticityLayer(), max_texture_size, | |
119 can_render_to_separate_surface, | |
120 host_impl->settings().layer_transforms_should_scale_layer_contents, | |
121 false, // do not verify_clip_tree_calculation for perf tests | |
122 false, // do not verify_transform_tree_calculation for perf tests | |
123 &update_list, active_tree->property_trees()); | |
124 LayerTreeHostCommon::CalculateDrawProperties(&inputs); | |
125 } | |
126 }; | |
127 | |
128 class BspTreePerfTest : public CalcDrawPropsTest { | |
129 public: | |
130 BspTreePerfTest() : num_duplicates_(1) {} | |
131 void RunSortLayers() { RunTest(CompositorMode::SINGLE_THREADED); } | |
132 | |
133 void SetNumberOfDuplicates(int num_duplicates) { | 57 void SetNumberOfDuplicates(int num_duplicates) { |
134 num_duplicates_ = num_duplicates; | 58 num_duplicates_ = num_duplicates; |
135 } | 59 } |
136 | 60 |
| 61 void ReadTestFile(const std::string& name) { |
| 62 base::FilePath test_data_dir; |
| 63 ASSERT_TRUE(PathService::Get(CCPaths::DIR_TEST_DATA, &test_data_dir)); |
| 64 base::FilePath json_file = test_data_dir.AppendASCII(name + ".json"); |
| 65 ASSERT_TRUE(base::ReadFileToString(json_file, &json_)); |
| 66 } |
| 67 |
137 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | 68 void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
138 | 69 |
139 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { | 70 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override { |
140 LayerTreeImpl* active_tree = host_impl->active_tree(); | 71 LayerTreeImpl* active_tree = host_impl->active_tree(); |
141 // First build the tree and then we'll start running tests on layersorter | 72 // First build the tree and then we'll start running tests on layersorter |
142 // itself | 73 // itself |
143 bool can_render_to_separate_surface = true; | 74 bool can_render_to_separate_surface = true; |
144 int max_texture_size = 8096; | 75 int max_texture_size = 8096; |
145 DoCalcDrawPropertiesImpl(can_render_to_separate_surface, | 76 DoCalcDrawPropertiesImpl(can_render_to_separate_surface, max_texture_size, |
146 max_texture_size, | 77 active_tree, host_impl); |
147 active_tree, | |
148 host_impl); | |
149 | 78 |
150 LayerImplList base_list; | 79 LayerImplList base_list; |
151 BuildLayerImplList(active_tree->root_layer_for_testing(), &base_list); | 80 BuildLayerImplList(active_tree->root_layer_for_testing(), &base_list); |
152 | 81 |
153 int polygon_counter = 0; | 82 int polygon_counter = 0; |
154 std::vector<std::unique_ptr<DrawPolygon>> polygon_list; | 83 std::vector<std::unique_ptr<DrawPolygon>> polygon_list; |
155 for (LayerImplList::iterator it = base_list.begin(); it != base_list.end(); | 84 for (LayerImplList::iterator it = base_list.begin(); it != base_list.end(); |
156 ++it) { | 85 ++it) { |
157 DrawPolygon* draw_polygon = new DrawPolygon( | 86 DrawPolygon* draw_polygon = new DrawPolygon( |
158 NULL, gfx::RectF(gfx::SizeF((*it)->bounds())), | 87 NULL, gfx::RectF(gfx::SizeF((*it)->bounds())), |
159 (*it)->draw_properties().target_space_transform, polygon_counter++); | 88 (*it)->draw_properties().target_space_transform, polygon_counter++); |
160 polygon_list.push_back(std::unique_ptr<DrawPolygon>(draw_polygon)); | 89 polygon_list.push_back(std::unique_ptr<DrawPolygon>(draw_polygon)); |
161 } | 90 } |
162 | 91 |
163 timer_.Reset(); | 92 timer_.Reset(); |
164 do { | 93 do { |
165 std::deque<std::unique_ptr<DrawPolygon>> test_list; | 94 std::deque<std::unique_ptr<DrawPolygon>> test_list; |
166 for (int i = 0; i < num_duplicates_; i++) { | 95 for (int i = 0; i < num_duplicates_; i++) { |
167 for (size_t i = 0; i < polygon_list.size(); i++) { | 96 for (size_t i = 0; i < polygon_list.size(); i++) { |
168 test_list.push_back(polygon_list[i]->CreateCopy()); | 97 test_list.push_back(polygon_list[i]->CreateCopy()); |
169 } | 98 } |
170 } | 99 } |
171 BspTree bsp_tree(&test_list); | 100 BspTree bsp_tree(&test_list); |
172 timer_.NextLap(); | 101 timer_.NextLap(); |
173 } while (!timer_.HasTimeLimitExpired()); | 102 } while (!timer_.HasTimeLimitExpired()); |
174 | 103 |
175 EndTest(); | 104 EndTest(); |
176 } | 105 } |
177 | 106 |
| 107 void DoCalcDrawPropertiesImpl(bool can_render_to_separate_surface, |
| 108 int max_texture_size, |
| 109 LayerTreeImpl* active_tree, |
| 110 LayerTreeHostImpl* host_impl) { |
| 111 LayerImplList update_list; |
| 112 LayerTreeHostCommon::CalcDrawPropsImplInputs inputs( |
| 113 active_tree->root_layer_for_testing(), active_tree->DrawViewportSize(), |
| 114 host_impl->DrawTransform(), active_tree->device_scale_factor(), |
| 115 active_tree->current_page_scale_factor(), |
| 116 active_tree->InnerViewportContainerLayer(), |
| 117 active_tree->InnerViewportScrollLayer(), |
| 118 active_tree->OuterViewportScrollLayer(), |
| 119 active_tree->elastic_overscroll()->Current(active_tree->IsActiveTree()), |
| 120 active_tree->OverscrollElasticityLayer(), max_texture_size, |
| 121 can_render_to_separate_surface, |
| 122 host_impl->settings().layer_transforms_should_scale_layer_contents, |
| 123 false, // do not verify_clip_tree_calculation for perf tests |
| 124 false, // do not verify_transform_tree_calculation for perf tests |
| 125 &update_list, active_tree->property_trees()); |
| 126 LayerTreeHostCommon::CalculateDrawProperties(&inputs); |
| 127 } |
| 128 |
178 void BuildLayerImplList(LayerImpl* layer, LayerImplList* list) { | 129 void BuildLayerImplList(LayerImpl* layer, LayerImplList* list) { |
179 for (auto* layer_impl : *layer->layer_tree_impl()) { | 130 for (auto* layer_impl : *layer->layer_tree_impl()) { |
180 if (layer_impl->Is3dSorted() && !layer_impl->bounds().IsEmpty()) { | 131 if (layer_impl->Is3dSorted() && !layer_impl->bounds().IsEmpty()) { |
181 list->push_back(layer_impl); | 132 list->push_back(layer_impl); |
182 } | 133 } |
183 } | 134 } |
184 } | 135 } |
185 | 136 |
| 137 void AfterTest() override { |
| 138 CHECK(!test_name_.empty()) << "Must SetTestName() before TearDown()."; |
| 139 perf_test::PrintResult("calc_draw_props_time", "", test_name_, |
| 140 1000 * timer_.MsPerLap(), "us", true); |
| 141 } |
| 142 |
186 private: | 143 private: |
| 144 FakeContentLayerClient content_layer_client_; |
| 145 LapTimer timer_; |
| 146 std::string test_name_; |
| 147 std::string json_; |
187 LayerImplList base_list_; | 148 LayerImplList base_list_; |
188 int num_duplicates_; | 149 int num_duplicates_ = 1; |
189 }; | 150 }; |
190 | 151 |
191 TEST_F(CalcDrawPropsTest, TenTen) { | |
192 SetTestName("10_10"); | |
193 ReadTestFile("10_10_layer_tree"); | |
194 RunCalcDrawProps(); | |
195 } | |
196 | |
197 TEST_F(CalcDrawPropsTest, HeavyPage) { | |
198 SetTestName("heavy_page"); | |
199 ReadTestFile("heavy_layer_tree"); | |
200 RunCalcDrawProps(); | |
201 } | |
202 | |
203 TEST_F(CalcDrawPropsTest, TouchRegionLight) { | |
204 SetTestName("touch_region_light"); | |
205 ReadTestFile("touch_region_light"); | |
206 RunCalcDrawProps(); | |
207 } | |
208 | |
209 TEST_F(CalcDrawPropsTest, TouchRegionHeavy) { | |
210 SetTestName("touch_region_heavy"); | |
211 ReadTestFile("touch_region_heavy"); | |
212 RunCalcDrawProps(); | |
213 } | |
214 | |
215 TEST_F(BspTreePerfTest, LayerSorterCubes) { | 152 TEST_F(BspTreePerfTest, LayerSorterCubes) { |
216 SetTestName("layer_sort_cubes"); | 153 SetTestName("layer_sort_cubes"); |
217 ReadTestFile("layer_sort_cubes"); | 154 ReadTestFile("layer_sort_cubes"); |
218 RunSortLayers(); | 155 RunTest(CompositorMode::SINGLE_THREADED); |
219 } | 156 } |
220 | 157 |
221 TEST_F(BspTreePerfTest, LayerSorterRubik) { | 158 TEST_F(BspTreePerfTest, LayerSorterRubik) { |
222 SetTestName("layer_sort_rubik"); | 159 SetTestName("layer_sort_rubik"); |
223 ReadTestFile("layer_sort_rubik"); | 160 ReadTestFile("layer_sort_rubik"); |
224 RunSortLayers(); | 161 RunTest(CompositorMode::SINGLE_THREADED); |
225 } | 162 } |
226 | 163 |
227 TEST_F(BspTreePerfTest, BspTreeCubes) { | 164 TEST_F(BspTreePerfTest, BspTreeCubes) { |
228 SetTestName("bsp_tree_cubes"); | 165 SetTestName("bsp_tree_cubes"); |
229 SetNumberOfDuplicates(1); | 166 SetNumberOfDuplicates(1); |
230 ReadTestFile("layer_sort_cubes"); | 167 ReadTestFile("layer_sort_cubes"); |
231 RunSortLayers(); | 168 RunTest(CompositorMode::SINGLE_THREADED); |
232 } | 169 } |
233 | 170 |
234 TEST_F(BspTreePerfTest, BspTreeRubik) { | 171 TEST_F(BspTreePerfTest, BspTreeRubik) { |
235 SetTestName("bsp_tree_rubik"); | 172 SetTestName("bsp_tree_rubik"); |
236 SetNumberOfDuplicates(1); | 173 SetNumberOfDuplicates(1); |
237 ReadTestFile("layer_sort_rubik"); | 174 ReadTestFile("layer_sort_rubik"); |
238 RunSortLayers(); | 175 RunTest(CompositorMode::SINGLE_THREADED); |
239 } | 176 } |
240 | 177 |
241 TEST_F(BspTreePerfTest, BspTreeCubes_2) { | 178 TEST_F(BspTreePerfTest, BspTreeCubes_2) { |
242 SetTestName("bsp_tree_cubes_2"); | 179 SetTestName("bsp_tree_cubes_2"); |
243 SetNumberOfDuplicates(2); | 180 SetNumberOfDuplicates(2); |
244 ReadTestFile("layer_sort_cubes"); | 181 ReadTestFile("layer_sort_cubes"); |
245 RunSortLayers(); | 182 RunTest(CompositorMode::SINGLE_THREADED); |
246 } | 183 } |
247 | 184 |
248 TEST_F(BspTreePerfTest, BspTreeCubes_4) { | 185 TEST_F(BspTreePerfTest, BspTreeCubes_4) { |
249 SetTestName("bsp_tree_cubes_4"); | 186 SetTestName("bsp_tree_cubes_4"); |
250 SetNumberOfDuplicates(4); | 187 SetNumberOfDuplicates(4); |
251 ReadTestFile("layer_sort_cubes"); | 188 ReadTestFile("layer_sort_cubes"); |
252 RunSortLayers(); | 189 RunTest(CompositorMode::SINGLE_THREADED); |
253 } | 190 } |
254 | 191 |
255 } // namespace | 192 } // namespace |
256 } // namespace cc | 193 } // namespace cc |
OLD | NEW |