blob: 1ec729269b2bcff198e26da8a0202607821e2c47 [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;
ajumad9432e32015-11-30 19:43:44110 active_tree->IncrementRenderSurfaceListIdForTesting();
[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()),
aeliasc26b50b72015-07-14 20:18:25119 active_tree->OverscrollElasticityLayer(), 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,
weiliangc15346d2c2016-02-19 01:38:49124 &update_list, active_tree->current_render_surface_list_id(),
weiliangcf429c532016-02-17 21:28:23125 active_tree->property_trees());
[email protected]bebb1a82014-06-06 05:03:54126 LayerTreeHostCommon::CalculateDrawProperties(&inputs);
127 }
128};
129
Dana Jansensab277762015-06-12 23:52:55130class BspTreePerfTest : public CalcDrawPropsTest {
[email protected]2a021fb7b2014-08-02 07:53:49131 public:
awoloszynfae52bf2015-03-24 18:19:21132 BspTreePerfTest() : num_duplicates_(1) {}
khushalsagare0a38d42016-01-29 01:15:06133 void RunSortLayers() { RunTest(CompositorMode::SINGLE_THREADED, false); }
[email protected]2a021fb7b2014-08-02 07:53:49134
135 void SetNumberOfDuplicates(int num_duplicates) {
136 num_duplicates_ = num_duplicates;
137 }
138
dcheng716bedf2014-10-21 09:51:08139 void BeginTest() override { PostSetNeedsCommitToMainThread(); }
[email protected]2a021fb7b2014-08-02 07:53:49140
dcheng716bedf2014-10-21 09:51:08141 void DrawLayersOnThread(LayerTreeHostImpl* host_impl) override {
[email protected]2a021fb7b2014-08-02 07:53:49142 LayerTreeImpl* active_tree = host_impl->active_tree();
143 // First build the tree and then we'll start running tests on layersorter
144 // itself
145 bool can_render_to_separate_surface = true;
146 int max_texture_size = 8096;
147 DoCalcDrawPropertiesImpl(can_render_to_separate_surface,
148 max_texture_size,
149 active_tree,
150 host_impl);
151
152 LayerImplList base_list;
153 BuildLayerImplList(active_tree->root_layer(), &base_list);
154
155 int polygon_counter = 0;
danakj60bc3bc2016-04-09 00:24:48156 std::vector<std::unique_ptr<DrawPolygon>> polygon_list;
[email protected]2a021fb7b2014-08-02 07:53:49157 for (LayerImplList::iterator it = base_list.begin(); it != base_list.end();
158 ++it) {
ajumad9432e32015-11-30 19:43:44159 DrawPolygon* draw_polygon = new DrawPolygon(
160 NULL, gfx::RectF(gfx::SizeF((*it)->bounds())),
161 (*it)->draw_properties().target_space_transform, polygon_counter++);
danakj60bc3bc2016-04-09 00:24:48162 polygon_list.push_back(std::unique_ptr<DrawPolygon>(draw_polygon));
[email protected]2a021fb7b2014-08-02 07:53:49163 }
164
165 timer_.Reset();
166 do {
danakj60bc3bc2016-04-09 00:24:48167 std::deque<std::unique_ptr<DrawPolygon>> test_list;
[email protected]2a021fb7b2014-08-02 07:53:49168 for (int i = 0; i < num_duplicates_; i++) {
169 for (size_t i = 0; i < polygon_list.size(); i++) {
170 test_list.push_back(polygon_list[i]->CreateCopy());
171 }
172 }
173 BspTree bsp_tree(&test_list);
174 timer_.NextLap();
175 } while (!timer_.HasTimeLimitExpired());
176
177 EndTest();
178 }
179
awoloszyn3d8eb1d2015-03-12 14:38:32180 void BuildLayerImplList(LayerImpl* layer, LayerImplList* list) {
weiliangca1a2b002016-02-17 19:39:36181 if (layer->Is3dSorted() && !layer->bounds().IsEmpty()) {
awoloszyn3d8eb1d2015-03-12 14:38:32182 list->push_back(layer);
183 }
184
185 for (size_t i = 0; i < layer->children().size(); i++) {
vollick83fbfc82016-03-22 18:33:27186 BuildLayerImplList(layer->children()[i], list);
awoloszyn3d8eb1d2015-03-12 14:38:32187 }
188 }
189
[email protected]2a021fb7b2014-08-02 07:53:49190 private:
awoloszyn3d8eb1d2015-03-12 14:38:32191 LayerImplList base_list_;
[email protected]2a021fb7b2014-08-02 07:53:49192 int num_duplicates_;
193};
194
Dana Jansensab277762015-06-12 23:52:55195TEST_F(CalcDrawPropsTest, TenTen) {
[email protected]8428be22013-10-23 07:37:44196 SetTestName("10_10");
197 ReadTestFile("10_10_layer_tree");
198 RunCalcDrawProps();
199}
200
Dana Jansensab277762015-06-12 23:52:55201TEST_F(CalcDrawPropsTest, HeavyPage) {
[email protected]8428be22013-10-23 07:37:44202 SetTestName("heavy_page");
203 ReadTestFile("heavy_layer_tree");
204 RunCalcDrawProps();
205}
206
Dana Jansensab277762015-06-12 23:52:55207TEST_F(CalcDrawPropsTest, TouchRegionLight) {
[email protected]9d161d22013-10-29 20:54:10208 SetTestName("touch_region_light");
209 ReadTestFile("touch_region_light");
210 RunCalcDrawProps();
211}
212
Dana Jansensab277762015-06-12 23:52:55213TEST_F(CalcDrawPropsTest, TouchRegionHeavy) {
[email protected]9d161d22013-10-29 20:54:10214 SetTestName("touch_region_heavy");
215 ReadTestFile("touch_region_heavy");
216 RunCalcDrawProps();
217}
218
awoloszyn3d8eb1d2015-03-12 14:38:32219TEST_F(BspTreePerfTest, LayerSorterCubes) {
[email protected]bebb1a82014-06-06 05:03:54220 SetTestName("layer_sort_cubes");
221 ReadTestFile("layer_sort_cubes");
222 RunSortLayers();
223}
224
awoloszyn3d8eb1d2015-03-12 14:38:32225TEST_F(BspTreePerfTest, LayerSorterRubik) {
[email protected]bebb1a82014-06-06 05:03:54226 SetTestName("layer_sort_rubik");
227 ReadTestFile("layer_sort_rubik");
228 RunSortLayers();
229}
230
[email protected]2a021fb7b2014-08-02 07:53:49231TEST_F(BspTreePerfTest, BspTreeCubes) {
232 SetTestName("bsp_tree_cubes");
233 SetNumberOfDuplicates(1);
234 ReadTestFile("layer_sort_cubes");
235 RunSortLayers();
236}
237
238TEST_F(BspTreePerfTest, BspTreeRubik) {
239 SetTestName("bsp_tree_rubik");
240 SetNumberOfDuplicates(1);
241 ReadTestFile("layer_sort_rubik");
242 RunSortLayers();
243}
244
245TEST_F(BspTreePerfTest, BspTreeCubes_2) {
246 SetTestName("bsp_tree_cubes_2");
247 SetNumberOfDuplicates(2);
248 ReadTestFile("layer_sort_cubes");
249 RunSortLayers();
250}
251
252TEST_F(BspTreePerfTest, BspTreeCubes_4) {
253 SetTestName("bsp_tree_cubes_4");
254 SetNumberOfDuplicates(4);
255 ReadTestFile("layer_sort_cubes");
256 RunSortLayers();
257}
258
[email protected]8428be22013-10-23 07:37:44259} // namespace
260} // namespace cc