picture_layer_tiling_perftest.cc revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
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/resources/picture_layer_tiling.h"
6#include "cc/test/fake_picture_layer_tiling_client.h"
7
8#include "testing/gtest/include/gtest/gtest.h"
9
10namespace cc {
11
12namespace {
13
14static const int kTimeLimitMillis = 2000;
15static const int kWarmupRuns = 5;
16static const int kTimeCheckInterval = 10;
17
18class PictureLayerTilingPerfTest : public testing::Test {
19 public:
20  PictureLayerTilingPerfTest() : num_runs_(0) {}
21
22  virtual void SetUp() OVERRIDE {
23    picture_layer_tiling_client_.SetTileSize(gfx::Size(256, 256));
24    picture_layer_tiling_ = PictureLayerTiling::Create(
25        1, gfx::Size(256 * 50, 256 * 50), &picture_layer_tiling_client_);
26    picture_layer_tiling_->CreateAllTilesForTesting();
27  }
28
29  virtual void TearDown() OVERRIDE {
30    picture_layer_tiling_.reset(NULL);
31  }
32
33  void EndTest() {
34    elapsed_ = base::TimeTicks::HighResNow() - start_time_;
35  }
36
37  void AfterTest(const std::string& test_name) {
38    printf("*RESULT %s: %.2f runs/s\n",
39           test_name.c_str(),
40           num_runs_ / elapsed_.InSecondsF());
41  }
42
43  bool DidRun() {
44    ++num_runs_;
45    if (num_runs_ == kWarmupRuns)
46      start_time_ = base::TimeTicks::HighResNow();
47
48    if (!start_time_.is_null() && (num_runs_ % kTimeCheckInterval) == 0) {
49      base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_;
50      if (elapsed >= base::TimeDelta::FromMilliseconds(kTimeLimitMillis)) {
51        elapsed_ = elapsed;
52        return false;
53      }
54    }
55    return true;
56  }
57
58  void RunInvalidateTest(const std::string& test_name, const Region& region) {
59    start_time_ = base::TimeTicks();
60    num_runs_ = 0;
61    do {
62      picture_layer_tiling_->Invalidate(region);
63    } while (DidRun());
64
65    AfterTest(test_name);
66  }
67
68  void RunUpdateTilePrioritiesStationaryTest(
69      const std::string& test_name,
70      const gfx::Transform& transform) {
71    start_time_ = base::TimeTicks();
72    num_runs_ = 0;
73
74    gfx::Size layer_bounds(50 * 256, 50 * 256);
75    do {
76      picture_layer_tiling_->UpdateTilePriorities(
77        ACTIVE_TREE,
78        layer_bounds,
79        gfx::Rect(layer_bounds),
80        gfx::Rect(layer_bounds),
81        layer_bounds,
82        layer_bounds,
83        1.f,
84        1.f,
85        transform,
86        transform,
87        num_runs_ + 1,
88        250);
89    } while (DidRun());
90
91    AfterTest(test_name);
92  }
93
94  void RunUpdateTilePrioritiesScrollingTest(
95      const std::string& test_name,
96      const gfx::Transform& transform) {
97    start_time_ = base::TimeTicks();
98    num_runs_ = 0;
99
100    gfx::Size layer_bounds(50 * 256, 50 * 256);
101    gfx::Size viewport_size(1024, 768);
102    gfx::Rect viewport_rect(viewport_size);
103    int xoffsets[] = {10, 0, -10, 0};
104    int yoffsets[] = {0, 10, 0, -10};
105    int offsetIndex = 0;
106    int offsetCount = 0;
107    const int maxOffsetCount = 1000;
108    do {
109      picture_layer_tiling_->UpdateTilePriorities(
110        ACTIVE_TREE,
111        viewport_size,
112        viewport_rect,
113        gfx::Rect(layer_bounds),
114        layer_bounds,
115        layer_bounds,
116        1.f,
117        1.f,
118        transform,
119        transform,
120        num_runs_ + 1,
121        250);
122
123      viewport_rect = gfx::Rect(
124        viewport_rect.x() + xoffsets[offsetIndex],
125        viewport_rect.y() + yoffsets[offsetIndex],
126        viewport_rect.width(),
127        viewport_rect.height());
128
129      if (++offsetCount > maxOffsetCount) {
130        offsetCount = 0;
131        offsetIndex = (offsetIndex + 1) % 4;
132      }
133    } while (DidRun());
134
135    AfterTest(test_name);
136  }
137
138 private:
139  FakePictureLayerTilingClient picture_layer_tiling_client_;
140  scoped_ptr<PictureLayerTiling> picture_layer_tiling_;
141
142  base::TimeTicks start_time_;
143  base::TimeDelta elapsed_;
144  int num_runs_;
145};
146
147TEST_F(PictureLayerTilingPerfTest, Invalidate) {
148  Region one_tile(gfx::Rect(256, 256));
149  RunInvalidateTest("invalidation_1x1", one_tile);
150
151  Region half_region(gfx::Rect(25 * 256, 50 * 256));
152  RunInvalidateTest("invalidation_25x50", half_region);
153
154  Region full_region(gfx::Rect(50 * 256, 50 * 256));
155  RunInvalidateTest("invalidation_50x50", full_region);
156}
157
158TEST_F(PictureLayerTilingPerfTest, UpdateTilePriorities) {
159  gfx::Transform transform;
160  RunUpdateTilePrioritiesStationaryTest(
161      "update_tile_priorities_stationary_no_transform",
162      transform);
163  RunUpdateTilePrioritiesScrollingTest(
164      "update_tile_priorities_scrolling_no_transform",
165      transform);
166
167  transform.Rotate(10);
168  RunUpdateTilePrioritiesStationaryTest(
169      "update_tile_priorities_stationary_rotation",
170      transform);
171  RunUpdateTilePrioritiesScrollingTest(
172      "update_tile_priorities_scrolling_rotation",
173      transform);
174
175  transform.ApplyPerspectiveDepth(10);
176  RunUpdateTilePrioritiesStationaryTest(
177      "update_tile_priorities_stationary_perspective",
178      transform);
179  RunUpdateTilePrioritiesScrollingTest(
180      "update_tile_priorities_scrolling_perspective",
181      transform);
182}
183
184}  // namespace
185
186}  // namespace cc
187