| 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 |