picture_layer_tiling_perftest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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#include "testing/perf/perf_test.h" 10 11namespace cc { 12 13namespace { 14 15static const int kTimeLimitMillis = 2000; 16static const int kWarmupRuns = 5; 17static const int kTimeCheckInterval = 10; 18 19class PictureLayerTilingPerfTest : public testing::Test { 20 public: 21 PictureLayerTilingPerfTest() : num_runs_(0) {} 22 23 virtual void SetUp() OVERRIDE { 24 picture_layer_tiling_client_.SetTileSize(gfx::Size(256, 256)); 25 picture_layer_tiling_client_.set_max_tiles_for_interest_area(250); 26 picture_layer_tiling_ = PictureLayerTiling::Create( 27 1, gfx::Size(256 * 50, 256 * 50), &picture_layer_tiling_client_); 28 picture_layer_tiling_->CreateAllTilesForTesting(); 29 } 30 31 virtual void TearDown() OVERRIDE { 32 picture_layer_tiling_.reset(NULL); 33 } 34 35 void EndTest() { 36 elapsed_ = base::TimeTicks::HighResNow() - start_time_; 37 } 38 39 bool DidRun() { 40 ++num_runs_; 41 if (num_runs_ == kWarmupRuns) 42 start_time_ = base::TimeTicks::HighResNow(); 43 44 if (!start_time_.is_null() && (num_runs_ % kTimeCheckInterval) == 0) { 45 base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_; 46 if (elapsed >= base::TimeDelta::FromMilliseconds(kTimeLimitMillis)) { 47 elapsed_ = elapsed; 48 return false; 49 } 50 } 51 return true; 52 } 53 54 void RunInvalidateTest(const std::string& test_name, const Region& region) { 55 start_time_ = base::TimeTicks(); 56 num_runs_ = 0; 57 do { 58 picture_layer_tiling_->Invalidate(region); 59 } while (DidRun()); 60 61 perf_test::PrintResult("invalidation", "", test_name, 62 num_runs_ / elapsed_.InSecondsF(), "runs/s", true); 63 } 64 65 void RunUpdateTilePrioritiesStationaryTest(const std::string& test_name, 66 const gfx::Transform& transform) { 67 start_time_ = base::TimeTicks(); 68 num_runs_ = 0; 69 70 gfx::Size layer_bounds(50 * 256, 50 * 256); 71 gfx::Rect viewport_rect(0, 0, 1024, 768); 72 do { 73 picture_layer_tiling_->UpdateTilePriorities( 74 ACTIVE_TREE, viewport_rect, 1.f, num_runs_ + 1); 75 } while (DidRun()); 76 77 perf_test::PrintResult("update_tile_priorities_stationary", 78 "", 79 test_name, 80 num_runs_ / elapsed_.InSecondsF(), 81 "runs/s", 82 true); 83 } 84 85 void RunUpdateTilePrioritiesScrollingTest(const std::string& test_name, 86 const gfx::Transform& transform) { 87 start_time_ = base::TimeTicks(); 88 num_runs_ = 0; 89 90 gfx::Size layer_bounds(50 * 256, 50 * 256); 91 gfx::Size viewport_size(1024, 768); 92 gfx::Rect viewport_rect(viewport_size); 93 int xoffsets[] = {10, 0, -10, 0}; 94 int yoffsets[] = {0, 10, 0, -10}; 95 int offsetIndex = 0; 96 int offsetCount = 0; 97 const int maxOffsetCount = 1000; 98 do { 99 picture_layer_tiling_->UpdateTilePriorities( 100 ACTIVE_TREE, viewport_rect, 1.f, num_runs_ + 1); 101 102 viewport_rect = gfx::Rect(viewport_rect.x() + xoffsets[offsetIndex], 103 viewport_rect.y() + yoffsets[offsetIndex], 104 viewport_rect.width(), 105 viewport_rect.height()); 106 107 if (++offsetCount > maxOffsetCount) { 108 offsetCount = 0; 109 offsetIndex = (offsetIndex + 1) % 4; 110 } 111 } while (DidRun()); 112 113 perf_test::PrintResult("update_tile_priorities_scrolling", 114 "", 115 test_name, 116 num_runs_ / elapsed_.InSecondsF(), 117 "runs/s", 118 true); 119 } 120 121 private: 122 FakePictureLayerTilingClient picture_layer_tiling_client_; 123 scoped_ptr<PictureLayerTiling> picture_layer_tiling_; 124 125 base::TimeTicks start_time_; 126 base::TimeDelta elapsed_; 127 int num_runs_; 128}; 129 130TEST_F(PictureLayerTilingPerfTest, Invalidate) { 131 Region one_tile(gfx::Rect(256, 256)); 132 RunInvalidateTest("1x1", one_tile); 133 134 Region half_region(gfx::Rect(25 * 256, 50 * 256)); 135 RunInvalidateTest("25x50", half_region); 136 137 Region full_region(gfx::Rect(50 * 256, 50 * 256)); 138 RunInvalidateTest("50x50", full_region); 139} 140 141#if defined(OS_ANDROID) 142// TODO(vmpstr): Investigate why this is noisy (crbug.com/310220). 143TEST_F(PictureLayerTilingPerfTest, DISABLED_UpdateTilePriorities) { 144#else 145TEST_F(PictureLayerTilingPerfTest, UpdateTilePriorities) { 146#endif // defined(OS_ANDROID) 147 gfx::Transform transform; 148 149 RunUpdateTilePrioritiesStationaryTest("no_transform", transform); 150 RunUpdateTilePrioritiesScrollingTest("no_transform", transform); 151 152 transform.Rotate(10); 153 RunUpdateTilePrioritiesStationaryTest("rotation", transform); 154 RunUpdateTilePrioritiesScrollingTest("rotation", transform); 155 156 transform.ApplyPerspectiveDepth(10); 157 RunUpdateTilePrioritiesStationaryTest("perspective", transform); 158 RunUpdateTilePrioritiesScrollingTest("perspective", transform); 159} 160 161} // namespace 162 163} // namespace cc 164