blob: 30b0cbcec7e8659613617208c76ec7f6a5e07a10 [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
avi02a4d172015-12-21 06:14:365#include <stddef.h>
6
vmpstr36d6abff2015-11-14 01:37:117#include <deque>
danakj60bc3bc2016-04-09 00:24:488#include <memory>
[email protected]8428be22013-10-23 07:37:449#include <sstream>
10
[email protected]8428be22013-10-23 07:37:4411#include "base/files/file_path.h"
thestig90a09082014-09-10 07:59:4612#include "base/files/file_util.h"
[email protected]8428be22013-10-23 07:37:4413#include "base/path_service.h"
14#include "base/strings/string_piece.h"
15#include "base/threading/thread.h"
16#include "base/time/time.h"
[email protected]29d39a42014-05-13 19:40:5817#include "cc/debug/lap_timer.h"
[email protected]8428be22013-10-23 07:37:4418#include "cc/layers/layer.h"
[email protected]2a021fb7b2014-08-02 07:53:4919#include "cc/output/bsp_tree.h"
20#include "cc/quads/draw_polygon.h"
21#include "cc/quads/draw_quad.h"
[email protected]8428be22013-10-23 07:37:4422#include "cc/test/fake_content_layer_client.h"
23#include "cc/test/fake_layer_tree_host_client.h"
[email protected]8428be22013-10-23 07:37:4424#include "cc/test/layer_tree_json_parser.h"
25#include "cc/test/layer_tree_test.h"
26#include "cc/test/paths.h"
danakj60bc3bc2016-04-09 00:24:4827#include "cc/trees/layer_tree_host_common.h"
[email protected]8428be22013-10-23 07:37:4428#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);
chrishtr01539b802015-11-24 08:11:3259 content_layer_client_.set_bounds(viewport);
[email protected]8428be22013-10-23 07:37:4460 }
61
62 void SetTestName(const std::string& name) { test_name_ = name; }
63
dcheng716bedf2014-10-21 09:51:0864 void AfterTest() override {
[email protected]8428be22013-10-23 07:37:4465 CHECK(!test_name_.empty()) << "Must SetTestName() before TearDown().";
[email protected]8428be22013-10-23 07:37:4466 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
Dana Jansensab277762015-06-12 23:52:5581class CalcDrawPropsTest : public LayerTreeHostCommonPerfTest {
[email protected]8428be22013-10-23 07:37:4482 public:
khushalsagare0a38d42016-01-29 01:15:0683 void RunCalcDrawProps() { RunTest(CompositorMode::SINGLE_THREADED, false); }
[email protected]8428be22013-10-23 07:37:4484
dcheng716bedf2014-10-21 09:51:0885 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]8428be22013-10-23 07:37:4486
dcheng716bedf2014-10-21 09:51:0887 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
[email protected]8428be22013-10-23 07:37:4488 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;
[email protected]bebb1a82014-06-06 05:03:5494 DoCalcDrawPropertiesImpl(can_render_to_separate_surface,
95 max_texture_size,
96 active_tree,
97 host_impl);
[email protected]8428be22013-10-23 07:37:4498
99 timer_.NextLap();
100 } while (!timer_.HasTimeLimitExpired());
101
102 EndTest();
103 }
[email protected]bebb1a82014-06-06 05:03:54104
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(
danakj3f76ace2014-11-18 16:56:00111 active_tree->root_layer(), active_tree->DrawViewportSize(),
112 host_impl->DrawTransform(), active_tree->device_scale_factor(),
aelias58eec0812014-12-04 01:04:40113 active_tree->current_page_scale_factor(),
ccameronb9aec4502014-12-05 19:31:00114 active_tree->InnerViewportContainerLayer(),
ajuma6b46da22015-06-25 21:53:02115 active_tree->InnerViewportScrollLayer(),
116 active_tree->OuterViewportScrollLayer(),
ccameronb9aec4502014-12-05 19:31:00117 active_tree->elastic_overscroll()->Current(active_tree->IsActiveTree()),
aeliasc26b50b72015-07-14 20:18:25118 active_tree->OverscrollElasticityLayer(), max_texture_size,
[email protected]bebb1a82014-06-06 05:03:54119 host_impl->settings().can_use_lcd_text,
danakj3f76ace2014-11-18 16:56:00120 host_impl->settings().layers_always_allowed_lcd_text,
[email protected]bebb1a82014-06-06 05:03:54121 can_render_to_separate_surface,
122 host_impl->settings().layer_transforms_should_scale_layer_contents,
ajuma0adb5902016-04-28 16:32:38123 &update_list, active_tree->property_trees());
[email protected]bebb1a82014-06-06 05:03:54124 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
125 }
126};
127
Dana Jansensab277762015-06-12 23:52:55128class BspTreePerfTest : public CalcDrawPropsTest {
[email protected]2a021fb7b2014-08-02 07:53:49129 public:
awoloszynfae52bf2015-03-24 18:19:21130 BspTreePerfTest() : num_duplicates_(1) {}
khushalsagare0a38d42016-01-29 01:15:06131 void RunSortLayers() { RunTest(CompositorMode::SINGLE_THREADED, false); }
[email protected]2a021fb7b2014-08-02 07:53:49132
133 void SetNumberOfDuplicates(int num_duplicates) {
134 num_duplicates_ = num_duplicates;
135 }
136
dcheng716bedf2014-10-21 09:51:08137 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]2a021fb7b2014-08-02 07:53:49138
dcheng716bedf2014-10-21 09:51:08139 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
[email protected]2a021fb7b2014-08-02 07:53:49140 LayerTreeImpl* active_tree = host_impl->active_tree();
141 // First build the tree and then we'll start running tests on layersorter
142 // itself
143 bool can_render_to_separate_surface = true;
144 int max_texture_size = 8096;
145 DoCalcDrawPropertiesImpl(can_render_to_separate_surface,
146 max_texture_size,
147 active_tree,
148 host_impl);
149
150 LayerImplList base_list;
151 BuildLayerImplList(active_tree->root_layer(), &base_list);
152
153 int polygon_counter = 0;
danakj60bc3bc2016-04-09 00:24:48154 std::vector<std::unique_ptr<DrawPolygon>> polygon_list;
[email protected]2a021fb7b2014-08-02 07:53:49155 for (LayerImplList::iterator it = base_list.begin(); it != base_list.end();
156 ++it) {
ajumad9432e32015-11-30 19:43:44157 DrawPolygon* draw_polygon = new DrawPolygon(
158 NULL, gfx::RectF(gfx::SizeF((*it)->bounds())),
159 (*it)->draw_properties().target_space_transform, polygon_counter++);
danakj60bc3bc2016-04-09 00:24:48160 polygon_list.push_back(std::unique_ptr<DrawPolygon>(draw_polygon));
[email protected]2a021fb7b2014-08-02 07:53:49161 }
162
163 timer_.Reset();
164 do {
danakj60bc3bc2016-04-09 00:24:48165 std::deque<std::unique_ptr<DrawPolygon>> test_list;
[email protected]2a021fb7b2014-08-02 07:53:49166 for (int i = 0; i < num_duplicates_; i++) {
167 for (size_t i = 0; i < polygon_list.size(); i++) {
168 test_list.push_back(polygon_list[i]->CreateCopy());
169 }
170 }
171 BspTree bsp_tree(&test_list);
172 timer_.NextLap();
173 } while (!timer_.HasTimeLimitExpired());
174
175 EndTest();
176 }
177
awoloszyn3d8eb1d2015-03-12 14:38:32178 void BuildLayerImplList(LayerImpl* layer, LayerImplList* list) {
sunxd1ae6803f2016-04-21 20:15:12179 for (auto* layer_impl : *layer->layer_tree_impl()) {
180 if (layer_impl->Is3dSorted() && !layer_impl->bounds().IsEmpty()) {
181 list->push_back(layer_impl);
182 }
awoloszyn3d8eb1d2015-03-12 14:38:32183 }
184 }
185
[email protected]2a021fb7b2014-08-02 07:53:49186 private:
awoloszyn3d8eb1d2015-03-12 14:38:32187 LayerImplList base_list_;
[email protected]2a021fb7b2014-08-02 07:53:49188 int num_duplicates_;
189};
190
Dana Jansensab277762015-06-12 23:52:55191TEST_F(CalcDrawPropsTest, TenTen) {
[email protected]8428be22013-10-23 07:37:44192 SetTestName("10_10");
193 ReadTestFile("10_10_layer_tree");
194 RunCalcDrawProps();
195}
196
Dana Jansensab277762015-06-12 23:52:55197TEST_F(CalcDrawPropsTest, HeavyPage) {
[email protected]8428be22013-10-23 07:37:44198 SetTestName("heavy_page");
199 ReadTestFile("heavy_layer_tree");
200 RunCalcDrawProps();
201}
202
Dana Jansensab277762015-06-12 23:52:55203TEST_F(CalcDrawPropsTest, TouchRegionLight) {
[email protected]9d161d22013-10-29 20:54:10204 SetTestName("touch_region_light");
205 ReadTestFile("touch_region_light");
206 RunCalcDrawProps();
207}
208
Dana Jansensab277762015-06-12 23:52:55209TEST_F(CalcDrawPropsTest, TouchRegionHeavy) {
[email protected]9d161d22013-10-29 20:54:10210 SetTestName("touch_region_heavy");
211 ReadTestFile("touch_region_heavy");
212 RunCalcDrawProps();
213}
214
awoloszyn3d8eb1d2015-03-12 14:38:32215TEST_F(BspTreePerfTest, LayerSorterCubes) {
[email protected]bebb1a82014-06-06 05:03:54216 SetTestName("layer_sort_cubes");
217 ReadTestFile("layer_sort_cubes");
218 RunSortLayers();
219}
220
awoloszyn3d8eb1d2015-03-12 14:38:32221TEST_F(BspTreePerfTest, LayerSorterRubik) {
[email protected]bebb1a82014-06-06 05:03:54222 SetTestName("layer_sort_rubik");
223 ReadTestFile("layer_sort_rubik");
224 RunSortLayers();
225}
226
[email protected]2a021fb7b2014-08-02 07:53:49227TEST_F(BspTreePerfTest, BspTreeCubes) {
228 SetTestName("bsp_tree_cubes");
229 SetNumberOfDuplicates(1);
230 ReadTestFile("layer_sort_cubes");
231 RunSortLayers();
232}
233
234TEST_F(BspTreePerfTest, BspTreeRubik) {
235 SetTestName("bsp_tree_rubik");
236 SetNumberOfDuplicates(1);
237 ReadTestFile("layer_sort_rubik");
238 RunSortLayers();
239}
240
241TEST_F(BspTreePerfTest, BspTreeCubes_2) {
242 SetTestName("bsp_tree_cubes_2");
243 SetNumberOfDuplicates(2);
244 ReadTestFile("layer_sort_cubes");
245 RunSortLayers();
246}
247
248TEST_F(BspTreePerfTest, BspTreeCubes_4) {
249 SetTestName("bsp_tree_cubes_4");
250 SetNumberOfDuplicates(4);
251 ReadTestFile("layer_sort_cubes");
252 RunSortLayers();
253}
254
[email protected]8428be22013-10-23 07:37:44255} // namespace
256} // namespace cc