layer_tree_host_common_perftest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// 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
9#include "base/file_util.h"
10#include "base/files/file_path.h"
11#include "base/path_service.h"
12#include "base/strings/string_piece.h"
13#include "base/threading/thread.h"
14#include "base/time/time.h"
15#include "cc/layers/layer.h"
16#include "cc/test/fake_content_layer_client.h"
17#include "cc/test/fake_layer_tree_host_client.h"
18#include "cc/test/lap_timer.h"
19#include "cc/test/layer_tree_json_parser.h"
20#include "cc/test/layer_tree_test.h"
21#include "cc/test/paths.h"
22#include "cc/trees/layer_tree_impl.h"
23#include "testing/perf/perf_test.h"
24
25namespace cc {
26namespace {
27
28static const int kTimeLimitMillis = 2000;
29static const int kWarmupRuns = 5;
30static const int kTimeCheckInterval = 10;
31
32class LayerTreeHostCommonPerfTest : public LayerTreeTest {
33 public:
34  LayerTreeHostCommonPerfTest()
35      : timer_(kWarmupRuns,
36               base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
37               kTimeCheckInterval) {}
38
39  void ReadTestFile(const std::string& name) {
40    base::FilePath test_data_dir;
41    ASSERT_TRUE(PathService::Get(CCPaths::DIR_TEST_DATA, &test_data_dir));
42    base::FilePath json_file = test_data_dir.AppendASCII(name + ".json");
43    ASSERT_TRUE(base::ReadFileToString(json_file, &json_));
44  }
45
46  virtual void SetupTree() OVERRIDE {
47    gfx::Size viewport = gfx::Size(720, 1038);
48    layer_tree_host()->SetViewportSize(viewport);
49    scoped_refptr<Layer> root =
50        ParseTreeFromJson(json_, &content_layer_client_);
51    ASSERT_TRUE(root.get());
52    layer_tree_host()->SetRootLayer(root);
53  }
54
55  void SetTestName(const std::string& name) { test_name_ = name; }
56
57  virtual void AfterTest() OVERRIDE {
58    CHECK(!test_name_.empty()) << "Must SetTestName() before TearDown().";
59    perf_test::PrintResult("calc_draw_props_time",
60                           "",
61                           test_name_,
62                           1000 * timer_.MsPerLap(),
63                           "us",
64                           true);
65  }
66
67 protected:
68  FakeContentLayerClient content_layer_client_;
69  LapTimer timer_;
70  std::string test_name_;
71  std::string json_;
72};
73
74class CalcDrawPropsMainTest : public LayerTreeHostCommonPerfTest {
75 public:
76  void RunCalcDrawProps() {
77    RunTest(false, false, false);
78  }
79
80  virtual void BeginTest() OVERRIDE {
81    timer_.Reset();
82
83    do {
84      bool can_render_to_separate_surface = true;
85      int max_texture_size = 8096;
86      RenderSurfaceLayerList update_list;
87      LayerTreeHostCommon::CalcDrawPropsMainInputs inputs(
88          layer_tree_host()->root_layer(),
89          layer_tree_host()->device_viewport_size(),
90          gfx::Transform(),
91          layer_tree_host()->device_scale_factor(),
92          layer_tree_host()->page_scale_factor(),
93          layer_tree_host()->page_scale_layer(),
94          max_texture_size,
95          layer_tree_host()->settings().can_use_lcd_text,
96          can_render_to_separate_surface,
97          layer_tree_host()
98              ->settings()
99              .layer_transforms_should_scale_layer_contents,
100          &update_list);
101      LayerTreeHostCommon::CalculateDrawProperties(&inputs);
102
103      timer_.NextLap();
104    } while (!timer_.HasTimeLimitExpired());
105
106    EndTest();
107  }
108};
109
110class CalcDrawPropsImplTest : public LayerTreeHostCommonPerfTest {
111 public:
112  void RunCalcDrawProps() {
113    RunTestWithImplSidePainting();
114  }
115
116  virtual void BeginTest() OVERRIDE {
117    PostSetNeedsCommitToMainThread();
118  }
119
120  virtual void DrawLayersOnThread(LayerTreeHostImpl* host_impl) OVERRIDE {
121    timer_.Reset();
122    LayerTreeImpl* active_tree = host_impl->active_tree();
123
124    do {
125      bool can_render_to_separate_surface = true;
126      int max_texture_size = 8096;
127      LayerImplList update_list;
128      LayerTreeHostCommon::CalcDrawPropsImplInputs inputs(
129          active_tree->root_layer(),
130          active_tree->DrawViewportSize(),
131          host_impl->DrawTransform(),
132          active_tree->device_scale_factor(),
133          active_tree->total_page_scale_factor(),
134          active_tree->InnerViewportContainerLayer(),
135          max_texture_size,
136          host_impl->settings().can_use_lcd_text,
137          can_render_to_separate_surface,
138          host_impl->settings().layer_transforms_should_scale_layer_contents,
139          &update_list);
140      LayerTreeHostCommon::CalculateDrawProperties(&inputs);
141
142      timer_.NextLap();
143    } while (!timer_.HasTimeLimitExpired());
144
145    EndTest();
146  }
147};
148
149TEST_F(CalcDrawPropsMainTest, TenTen) {
150  SetTestName("10_10_main_thread");
151  ReadTestFile("10_10_layer_tree");
152  RunCalcDrawProps();
153}
154
155TEST_F(CalcDrawPropsMainTest, HeavyPage) {
156  SetTestName("heavy_page_main_thread");
157  ReadTestFile("heavy_layer_tree");
158  RunCalcDrawProps();
159}
160
161TEST_F(CalcDrawPropsMainTest, TouchRegionLight) {
162  SetTestName("touch_region_light_main_thread");
163  ReadTestFile("touch_region_light");
164  RunCalcDrawProps();
165}
166
167TEST_F(CalcDrawPropsMainTest, TouchRegionHeavy) {
168  SetTestName("touch_region_heavy_main_thread");
169  ReadTestFile("touch_region_heavy");
170  RunCalcDrawProps();
171}
172
173TEST_F(CalcDrawPropsImplTest, TenTen) {
174  SetTestName("10_10");
175  ReadTestFile("10_10_layer_tree");
176  RunCalcDrawProps();
177}
178
179TEST_F(CalcDrawPropsImplTest, HeavyPage) {
180  SetTestName("heavy_page");
181  ReadTestFile("heavy_layer_tree");
182  RunCalcDrawProps();
183}
184
185TEST_F(CalcDrawPropsImplTest, TouchRegionLight) {
186  SetTestName("touch_region_light");
187  ReadTestFile("touch_region_light");
188  RunCalcDrawProps();
189}
190
191TEST_F(CalcDrawPropsImplTest, TouchRegionHeavy) {
192  SetTestName("touch_region_heavy");
193  ReadTestFile("touch_region_heavy");
194  RunCalcDrawProps();
195}
196
197}  // namespace
198}  // namespace cc
199