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 "base/time/time.h" 6 #include "cc/resources/tile.h" 7 #include "cc/resources/tile_priority.h" 8 #include "cc/test/fake_output_surface.h" 9 #include "cc/test/fake_picture_pile_impl.h" 10 #include "cc/test/fake_tile_manager.h" 11 #include "cc/test/fake_tile_manager_client.h" 12 #include "cc/test/test_tile_priorities.h" 13 14 #include "testing/gtest/include/gtest/gtest.h" 15 16 namespace cc { 17 18 namespace { 19 20 static const int kTimeLimitMillis = 2000; 21 static const int kWarmupRuns = 5; 22 static const int kTimeCheckInterval = 10; 23 24 class TileManagerPerfTest : public testing::Test { 25 public: 26 typedef std::vector<scoped_refptr<Tile> > TileVector; 27 28 TileManagerPerfTest() : num_runs_(0) {} 29 30 // Overridden from testing::Test: 31 virtual void SetUp() OVERRIDE { 32 output_surface_ = FakeOutputSurface::Create3d(); 33 resource_provider_ = ResourceProvider::Create(output_surface_.get(), 0); 34 tile_manager_ = make_scoped_ptr( 35 new FakeTileManager(&tile_manager_client_, resource_provider_.get())); 36 37 GlobalStateThatImpactsTilePriority state; 38 gfx::Size tile_size = settings_.default_tile_size; 39 state.memory_limit_in_bytes = 40 10000 * 4 * tile_size.width() * tile_size.height(); 41 state.memory_limit_policy = ALLOW_ANYTHING; 42 state.tree_priority = SMOOTHNESS_TAKES_PRIORITY; 43 44 tile_manager_->SetGlobalState(state); 45 picture_pile_ = FakePicturePileImpl::CreatePile(); 46 } 47 48 virtual void TearDown() OVERRIDE { 49 tile_manager_.reset(NULL); 50 picture_pile_ = NULL; 51 } 52 53 void EndTest() { 54 elapsed_ = base::TimeTicks::HighResNow() - start_time_; 55 } 56 57 void AfterTest(const std::string test_name) { 58 // Format matches chrome/test/perf/perf_test.h:PrintResult 59 printf("*RESULT %s: %.2f runs/s\n", 60 test_name.c_str(), 61 num_runs_ / elapsed_.InSecondsF()); 62 } 63 64 bool DidRun() { 65 ++num_runs_; 66 if (num_runs_ == kWarmupRuns) 67 start_time_ = base::TimeTicks::HighResNow(); 68 69 if (!start_time_.is_null() && (num_runs_ % kTimeCheckInterval) == 0) { 70 base::TimeDelta elapsed = base::TimeTicks::HighResNow() - start_time_; 71 if (elapsed >= base::TimeDelta::FromMilliseconds(kTimeLimitMillis)) { 72 elapsed_ = elapsed; 73 return false; 74 } 75 } 76 77 return true; 78 } 79 80 void CreateBinTiles(int count, TilePriority priority, TileVector* tiles) { 81 for (int i = 0; i < count; ++i) { 82 scoped_refptr<Tile> tile = 83 make_scoped_refptr(new Tile(tile_manager_.get(), 84 picture_pile_.get(), 85 settings_.default_tile_size, 86 gfx::Rect(), 87 gfx::Rect(), 88 1.0, 89 0, 90 0, 91 true)); 92 tile->SetPriority(ACTIVE_TREE, priority); 93 tile->SetPriority(PENDING_TREE, priority); 94 tiles->push_back(tile); 95 } 96 } 97 98 void CreateTiles(int count, TileVector* tiles) { 99 // Roughly an equal amount of all bins. 100 int count_per_bin = count / NUM_BINS; 101 CreateBinTiles(count_per_bin, TilePriorityForNowBin(), tiles); 102 CreateBinTiles(count_per_bin, TilePriorityForSoonBin(), tiles); 103 CreateBinTiles(count_per_bin, TilePriorityForEventualBin(), tiles); 104 CreateBinTiles(count - 3 * count_per_bin, TilePriority(), tiles); 105 } 106 107 void RunManageTilesTest(const std::string test_name, 108 unsigned tile_count) { 109 start_time_ = base::TimeTicks(); 110 num_runs_ = 0; 111 TileVector tiles; 112 CreateTiles(tile_count, &tiles); 113 do { 114 tile_manager_->ManageTiles(); 115 } while (DidRun()); 116 117 AfterTest(test_name); 118 } 119 120 private: 121 FakeTileManagerClient tile_manager_client_; 122 LayerTreeSettings settings_; 123 scoped_ptr<FakeTileManager> tile_manager_; 124 scoped_refptr<FakePicturePileImpl> picture_pile_; 125 scoped_ptr<FakeOutputSurface> output_surface_; 126 scoped_ptr<ResourceProvider> resource_provider_; 127 128 base::TimeTicks start_time_; 129 base::TimeDelta elapsed_; 130 int num_runs_; 131 }; 132 133 TEST_F(TileManagerPerfTest, ManageTiles) { 134 RunManageTilesTest("manage_tiles_100", 100); 135 RunManageTilesTest("manage_tiles_1000", 1000); 136 RunManageTilesTest("manage_tiles_10000", 10000); 137 } 138 139 } // namespace 140 141 } // namespace cc 142