1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/time/time.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/debug/lap_timer.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "cc/resources/raster_buffer.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/resources/tile.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/resources/tile_priority.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "cc/test/begin_frame_args_test.h"
11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "cc/test/fake_impl_proxy.h"
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "cc/test/fake_layer_tree_host_impl.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_output_surface.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "cc/test/fake_output_surface_client.h"
15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "cc/test/fake_picture_layer_impl.h"
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "cc/test/fake_picture_pile_impl.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_tile_manager.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "cc/test/fake_tile_manager_client.h"
19e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "cc/test/impl_side_painting_settings.h"
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "cc/test/test_shared_bitmap_manager.h"
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "cc/test/test_tile_priorities.h"
22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "cc/trees/layer_tree_impl.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/perf/perf_test.h"
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/gfx/frame_time.h"
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace cc {
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace {
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)static const int kTimeLimitMillis = 2000;
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)static const int kWarmupRuns = 5;
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)static const int kTimeCheckInterval = 10;
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class FakeRasterizerImpl : public Rasterizer, public RasterizerTaskClient {
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from Rasterizer:
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetClient(RasterizerClient* client) OVERRIDE {}
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Shutdown() OVERRIDE {}
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void ScheduleTasks(RasterTaskQueue* queue) OVERRIDE {
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (RasterTaskQueue::Item::Vector::const_iterator it =
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             queue->items.begin();
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         it != queue->items.end();
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         ++it) {
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RasterTask* task = it->task;
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      task->WillSchedule();
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      task->ScheduleOnOriginThread(this);
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      task->DidSchedule();
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      completed_tasks_.push_back(task);
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
55424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void CheckForCompletedTasks() OVERRIDE {
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (RasterTask::Vector::iterator it = completed_tasks_.begin();
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         it != completed_tasks_.end();
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)         ++it) {
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      RasterTask* task = it->get();
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      task->WillComplete();
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      task->CompleteOnOriginThread(this);
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      task->DidComplete();
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      task->RunReplyOnOriginThread();
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    }
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    completed_tasks_.clear();
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from RasterizerTaskClient:
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual scoped_ptr<RasterBuffer> AcquireBufferForRaster(
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const Resource* resource) OVERRIDE {
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return scoped_ptr<RasterBuffer>();
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ReleaseBufferForRaster(
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<RasterBuffer> buffer) OVERRIDE {}
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RasterTask::Vector completed_tasks_;
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)base::LazyInstance<FakeRasterizerImpl> g_fake_rasterizer =
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class TileManagerPerfTest : public testing::Test {
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public:
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TileManagerPerfTest()
88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      : memory_limit_policy_(ALLOW_ANYTHING),
89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        max_tiles_(10000),
90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        id_(7),
91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        proxy_(base::MessageLoopProxy::current()),
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        host_impl_(ImplSidePaintingSettings(10000),
93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                   &proxy_,
94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                   &shared_bitmap_manager_),
95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        timer_(kWarmupRuns,
96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch               base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch               kTimeCheckInterval) {}
98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void SetTreePriority(TreePriority tree_priority) {
100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    GlobalStateThatImpactsTilePriority state;
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    gfx::Size tile_size(256, 256);
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    state.soft_memory_limit_in_bytes = 100 * 1000 * 1000;
104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    state.num_resources_limit = max_tiles_;
105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    state.hard_memory_limit_in_bytes = state.soft_memory_limit_in_bytes * 2;
106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    state.memory_limit_policy = memory_limit_policy_;
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    state.tree_priority = tree_priority;
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    global_state_ = state;
1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    host_impl_.resource_pool()->SetResourceUsageLimits(
1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        state.soft_memory_limit_in_bytes, 0, state.num_resources_limit);
112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_impl_.tile_manager()->SetGlobalStateForTesting(state);
113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void SetUp() OVERRIDE {
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    picture_pile_ = FakePicturePileImpl::CreateInfiniteFilledPile();
117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    InitializeRenderer();
118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  virtual void InitializeRenderer() {
122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_impl_.InitializeRenderer(
123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        FakeOutputSurface::Create3d().PassAs<OutputSurface>());
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    tile_manager()->SetRasterizerForTesting(g_fake_rasterizer.Pointer());
125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void SetupDefaultTrees(const gfx::Size& layer_bounds) {
128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    gfx::Size tile_size(100, 100);
129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    scoped_refptr<FakePicturePileImpl> pending_pile =
131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    scoped_refptr<FakePicturePileImpl> active_pile =
133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SetupTrees(pending_pile, active_pile);
136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void ActivateTree() {
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    host_impl_.ActivateSyncTree();
140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    CHECK(!host_impl_.pending_tree());
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_root_layer_ = NULL;
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    active_root_layer_ = static_cast<FakePictureLayerImpl*>(
143e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        host_impl_.active_tree()->LayerById(id_));
144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds,
147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                                          const gfx::Size& tile_size) {
148e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SetupDefaultTrees(layer_bounds);
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_root_layer_->set_fixed_tile_size(tile_size);
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    active_root_layer_->set_fixed_tile_size(tile_size);
151e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void SetupTrees(scoped_refptr<PicturePileImpl> pending_pile,
154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                  scoped_refptr<PicturePileImpl> active_pile) {
155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SetupPendingTree(active_pile);
156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ActivateTree();
157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SetupPendingTree(pending_pile);
158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void SetupPendingTree(scoped_refptr<PicturePileImpl> pile) {
161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    host_impl_.CreatePendingTree();
162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    LayerTreeImpl* pending_tree = host_impl_.pending_tree();
163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Clear recycled tree.
164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    pending_tree->DetachLayerTree();
165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    scoped_ptr<FakePictureLayerImpl> pending_layer =
167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    pending_layer->SetDrawsContent(true);
169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_root_layer_ = static_cast<FakePictureLayerImpl*>(
172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        host_impl_.pending_tree()->LayerById(id_));
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_root_layer_->DoPostCommitInitializationIfNeeded();
174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  void CreateHighLowResAndSetAllTilesVisible() {
177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    // Active layer must get updated first so pending layer can share from it.
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    active_root_layer_->CreateDefaultTilingsAndTiles();
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    active_root_layer_->SetAllTilesVisible();
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_root_layer_->CreateDefaultTilingsAndTiles();
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_root_layer_->SetAllTilesVisible();
182e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunRasterQueueConstructTest(const std::string& test_name,
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                   int layer_count) {
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 SMOOTHNESS_TAKES_PRIORITY,
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 NEW_CONTENT_TAKES_PRIORITY};
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int priority_count = 0;
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<LayerImpl*> layers = CreateLayers(layer_count, 10);
19234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    bool resourceless_software_draw = false;
19334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    for (unsigned i = 0; i < layers.size(); ++i) {
19434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      layers[i]->UpdateTiles(Occlusion(), resourceless_software_draw);
19534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    }
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    timer_.Reset();
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    do {
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      RasterTilePriorityQueue queue;
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      host_impl_.BuildRasterQueue(&queue, priorities[priority_count]);
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      priority_count = (priority_count + 1) % arraysize(priorities);
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      timer_.NextLap();
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } while (!timer_.HasTimeLimitExpired());
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    perf_test::PrintResult("tile_manager_raster_tile_queue_construct",
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           "",
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           test_name,
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           timer_.LapsPerSecond(),
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           "runs/s",
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           true);
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunRasterQueueConstructAndIterateTest(const std::string& test_name,
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             int layer_count,
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             unsigned tile_count) {
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 SMOOTHNESS_TAKES_PRIORITY,
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 NEW_CONTENT_TAKES_PRIORITY};
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<LayerImpl*> layers = CreateLayers(layer_count, 100);
22134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    bool resourceless_software_draw = false;
22234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    for (unsigned i = 0; i < layers.size(); ++i) {
22334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      layers[i]->UpdateTiles(Occlusion(), resourceless_software_draw);
22434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    }
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int priority_count = 0;
227e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    timer_.Reset();
228e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    do {
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int count = tile_count;
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      RasterTilePriorityQueue queue;
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      host_impl_.BuildRasterQueue(&queue, priorities[priority_count]);
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      while (count--) {
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ASSERT_FALSE(queue.IsEmpty());
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ASSERT_TRUE(queue.Top() != NULL);
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        queue.Pop();
236e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      }
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      priority_count = (priority_count + 1) % arraysize(priorities);
238e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      timer_.NextLap();
239e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    } while (!timer_.HasTimeLimitExpired());
240e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    perf_test::PrintResult(
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "tile_manager_raster_tile_queue_construct_and_iterate",
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "",
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        test_name,
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        timer_.LapsPerSecond(),
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "runs/s",
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        true);
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunEvictionQueueConstructTest(const std::string& test_name,
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                     int layer_count) {
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 SMOOTHNESS_TAKES_PRIORITY,
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 NEW_CONTENT_TAKES_PRIORITY};
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int priority_count = 0;
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<LayerImpl*> layers = CreateLayers(layer_count, 10);
25834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    bool resourceless_software_draw = false;
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (unsigned i = 0; i < layers.size(); ++i) {
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      FakePictureLayerImpl* layer =
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          static_cast<FakePictureLayerImpl*>(layers[i]);
26234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      layer->UpdateTiles(Occlusion(), resourceless_software_draw);
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      for (size_t j = 0; j < layer->GetTilings()->num_tilings(); ++j) {
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        tile_manager()->InitializeTilesWithResourcesForTesting(
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            layer->GetTilings()->tiling_at(j)->AllTilesForTesting());
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    timer_.Reset();
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    do {
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EvictionTilePriorityQueue queue;
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      host_impl_.BuildEvictionQueue(&queue, priorities[priority_count]);
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      priority_count = (priority_count + 1) % arraysize(priorities);
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      timer_.NextLap();
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } while (!timer_.HasTimeLimitExpired());
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    perf_test::PrintResult("tile_manager_eviction_tile_queue_construct",
278e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                           "",
279e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                           test_name,
280e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                           timer_.LapsPerSecond(),
281e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                           "runs/s",
282e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch                           true);
283e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  }
284e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunEvictionQueueConstructAndIterateTest(const std::string& test_name,
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                               int layer_count,
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                               unsigned tile_count) {
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 SMOOTHNESS_TAKES_PRIORITY,
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                 NEW_CONTENT_TAKES_PRIORITY};
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int priority_count = 0;
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    std::vector<LayerImpl*> layers = CreateLayers(layer_count, tile_count);
29434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    bool resourceless_software_draw = false;
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (unsigned i = 0; i < layers.size(); ++i) {
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      FakePictureLayerImpl* layer =
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          static_cast<FakePictureLayerImpl*>(layers[i]);
29834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      layer->UpdateTiles(Occlusion(), resourceless_software_draw);
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      for (size_t j = 0; j < layer->GetTilings()->num_tilings(); ++j) {
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        tile_manager()->InitializeTilesWithResourcesForTesting(
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            layer->GetTilings()->tiling_at(j)->AllTilesForTesting());
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    timer_.Reset();
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    do {
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int count = tile_count;
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EvictionTilePriorityQueue queue;
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      host_impl_.BuildEvictionQueue(&queue, priorities[priority_count]);
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      while (count--) {
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ASSERT_FALSE(queue.IsEmpty());
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ASSERT_TRUE(queue.Top() != NULL);
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        queue.Pop();
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      priority_count = (priority_count + 1) % arraysize(priorities);
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      timer_.NextLap();
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } while (!timer_.HasTimeLimitExpired());
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    perf_test::PrintResult(
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "tile_manager_eviction_tile_queue_construct_and_iterate",
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "",
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        test_name,
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        timer_.LapsPerSecond(),
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        "runs/s",
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        true);
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::vector<LayerImpl*> CreateLayers(int layer_count,
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       int tiles_per_layer_count) {
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Compute the width/height required for high res to get
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // tiles_per_layer_count tiles.
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    float width = std::sqrt(static_cast<float>(tiles_per_layer_count));
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    float height = tiles_per_layer_count / width;
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Adjust the width and height to account for the fact that tiles
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // are bigger than 1x1. Also, account for the fact that that we
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // will be creating one high res and one low res tiling. That is,
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // width and height should be smaller by sqrt(1 + low_res_scale).
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // This gives us _approximately_ correct counts.
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    width *= settings_.default_tile_size.width() /
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)             std::sqrt(1 + settings_.low_res_contents_scale_factor);
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    height *= settings_.default_tile_size.height() /
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              std::sqrt(1 + settings_.low_res_contents_scale_factor);
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Ensure that we start with blank trees and no tiles.
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host_impl_.ResetTreesForTesting();
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tile_manager()->FreeResourcesAndCleanUpReleasedTilesForTesting();
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Size layer_bounds(width, height);
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Size viewport(width / 5, height / 5);
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host_impl_.SetViewportSize(viewport);
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SetupDefaultTreesWithFixedTileSize(layer_bounds,
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       settings_.default_tile_size);
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    active_root_layer_->CreateDefaultTilingsAndTiles();
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pending_root_layer_->CreateDefaultTilingsAndTiles();
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<LayerImpl*> layers;
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Pending layer counts as one layer.
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    layers.push_back(pending_root_layer_);
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int next_id = id_ + 1;
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Create the rest of the layers as children of the root layer.
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    while (static_cast<int>(layers.size()) < layer_count) {
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      scoped_ptr<FakePictureLayerImpl> layer =
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          FakePictureLayerImpl::CreateWithPile(
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)              host_impl_.pending_tree(), next_id, picture_pile_);
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      layer->SetBounds(layer_bounds);
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      layers.push_back(layer.get());
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pending_root_layer_->AddChild(layer.PassAs<LayerImpl>());
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      FakePictureLayerImpl* fake_layer =
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          static_cast<FakePictureLayerImpl*>(layers.back());
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      fake_layer->SetDrawsContent(true);
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      fake_layer->DoPostCommitInitializationIfNeeded();
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      fake_layer->CreateDefaultTilingsAndTiles();
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ++next_id;
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return layers;
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  GlobalStateThatImpactsTilePriority GlobalStateForTest() {
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    GlobalStateThatImpactsTilePriority state;
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Size tile_size = settings_.default_tile_size;
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    state.soft_memory_limit_in_bytes =
389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        10000u * 4u *
390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        static_cast<size_t>(tile_size.width() * tile_size.height());
391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    state.hard_memory_limit_in_bytes = state.soft_memory_limit_in_bytes;
392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    state.num_resources_limit = 10000;
393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    state.memory_limit_policy = ALLOW_ANYTHING;
394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    state.tree_priority = SMOOTHNESS_TAKES_PRIORITY;
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return state;
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RunManageTilesTest(const std::string& test_name,
399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          int layer_count,
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                          int approximate_tile_count_per_layer) {
401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<LayerImpl*> layers =
402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        CreateLayers(layer_count, approximate_tile_count_per_layer);
403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    timer_.Reset();
40434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)    bool resourceless_software_draw = false;
405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    do {
40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      BeginFrameArgs args = CreateBeginFrameArgsForTesting();
40703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      host_impl_.UpdateCurrentBeginFrameArgs(args);
40834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      for (unsigned i = 0; i < layers.size(); ++i) {
40934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)        layers[i]->UpdateTiles(Occlusion(), resourceless_software_draw);
41034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)      }
411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GlobalStateThatImpactsTilePriority global_state(GlobalStateForTest());
413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      tile_manager()->ManageTiles(global_state);
414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      tile_manager()->UpdateVisibleTiles();
415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      timer_.NextLap();
41603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      host_impl_.ResetCurrentBeginFrameArgsForNextFrame();
417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    } while (!timer_.HasTimeLimitExpired());
418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    perf_test::PrintResult(
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "manage_tiles", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
423e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  TileManager* tile_manager() { return host_impl_.tile_manager(); }
424e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
425e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch protected:
426e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  GlobalStateThatImpactsTilePriority global_state_;
427e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
428e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  TestSharedBitmapManager shared_bitmap_manager_;
429e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  TileMemoryLimitPolicy memory_limit_policy_;
430e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  int max_tiles_;
431e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  int id_;
432e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeImplProxy proxy_;
433e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  FakeLayerTreeHostImpl host_impl_;
434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakePictureLayerImpl* pending_root_layer_;
435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakePictureLayerImpl* active_root_layer_;
436e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  LapTimer timer_;
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<FakePicturePileImpl> picture_pile_;
438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LayerTreeSettings settings_;
439e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch};
440e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(TileManagerPerfTest, ManageTiles) {
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunManageTilesTest("2_100", 2, 100);
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunManageTilesTest("2_500", 2, 500);
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunManageTilesTest("2_1000", 2, 1000);
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunManageTilesTest("10_100", 10, 100);
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunManageTilesTest("10_500", 10, 500);
447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunManageTilesTest("10_1000", 10, 1000);
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunManageTilesTest("50_100", 100, 100);
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunManageTilesTest("50_500", 100, 500);
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunManageTilesTest("50_1000", 100, 1000);
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TileManagerPerfTest, RasterTileQueueConstruct) {
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructTest("2", 2);
4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructTest("10", 10);
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructTest("50", 50);
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TileManagerPerfTest, RasterTileQueueConstructAndIterate) {
4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("2_16", 2, 16);
4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("2_32", 2, 32);
4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("2_64", 2, 64);
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("2_128", 2, 128);
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("10_16", 10, 16);
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("10_32", 10, 32);
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("10_64", 10, 64);
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("10_128", 10, 128);
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("50_16", 50, 16);
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("50_32", 50, 32);
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("50_64", 50, 64);
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunRasterQueueConstructAndIterateTest("50_128", 50, 128);
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TileManagerPerfTest, EvictionTileQueueConstruct) {
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructTest("2", 2);
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructTest("10", 10);
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructTest("50", 50);
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
479e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(TileManagerPerfTest, EvictionTileQueueConstructAndIterate) {
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("2_16", 2, 16);
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("2_32", 2, 32);
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("2_64", 2, 64);
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("2_128", 2, 128);
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("10_16", 10, 16);
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("10_32", 10, 32);
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("10_64", 10, 64);
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("10_128", 10, 128);
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("50_16", 50, 16);
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("50_32", 50, 32);
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("50_64", 50, 64);
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunEvictionQueueConstructAndIterateTest("50_128", 50, 128);
493e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
494e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
495a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace cc
498