Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / cc / resources / tile_manager_perftest.cc
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/debug/lap_timer.h"
7 #include "cc/resources/tile.h"
8 #include "cc/resources/tile_priority.h"
9 #include "cc/test/fake_impl_proxy.h"
10 #include "cc/test/fake_layer_tree_host_impl.h"
11 #include "cc/test/fake_output_surface.h"
12 #include "cc/test/fake_output_surface_client.h"
13 #include "cc/test/fake_picture_layer_impl.h"
14 #include "cc/test/fake_picture_pile_impl.h"
15 #include "cc/test/fake_tile_manager.h"
16 #include "cc/test/fake_tile_manager_client.h"
17 #include "cc/test/impl_side_painting_settings.h"
18 #include "cc/test/test_shared_bitmap_manager.h"
19 #include "cc/test/test_tile_priorities.h"
20 #include "cc/trees/layer_tree_impl.h"
21
22 #include "testing/gtest/include/gtest/gtest.h"
23 #include "testing/perf/perf_test.h"
24
25 namespace cc {
26
27 namespace {
28
29 static const int kTimeLimitMillis = 2000;
30 static const int kWarmupRuns = 5;
31 static const int kTimeCheckInterval = 10;
32
33 class FakeRasterizerImpl : public Rasterizer, public RasterizerTaskClient {
34  public:
35   // Overridden from Rasterizer:
36   virtual void SetClient(RasterizerClient* client) OVERRIDE {}
37   virtual void Shutdown() OVERRIDE {}
38   virtual void ScheduleTasks(RasterTaskQueue* queue) OVERRIDE {
39     for (RasterTaskQueue::Item::Vector::const_iterator it =
40              queue->items.begin();
41          it != queue->items.end();
42          ++it) {
43       RasterTask* task = it->task;
44
45       task->WillSchedule();
46       task->ScheduleOnOriginThread(this);
47       task->DidSchedule();
48
49       completed_tasks_.push_back(task);
50     }
51   }
52   virtual void CheckForCompletedTasks() OVERRIDE {
53     for (RasterTask::Vector::iterator it = completed_tasks_.begin();
54          it != completed_tasks_.end();
55          ++it) {
56       RasterTask* task = it->get();
57
58       task->WillComplete();
59       task->CompleteOnOriginThread(this);
60       task->DidComplete();
61
62       task->RunReplyOnOriginThread();
63     }
64     completed_tasks_.clear();
65   }
66
67   // Overridden from RasterizerTaskClient:
68   virtual SkCanvas* AcquireCanvasForRaster(RasterTask* task) OVERRIDE {
69     return NULL;
70   }
71   virtual void ReleaseCanvasForRaster(RasterTask* task) OVERRIDE {}
72
73  private:
74   RasterTask::Vector completed_tasks_;
75 };
76 base::LazyInstance<FakeRasterizerImpl> g_fake_rasterizer =
77     LAZY_INSTANCE_INITIALIZER;
78
79 class TileManagerPerfTest : public testing::Test {
80  public:
81   TileManagerPerfTest()
82       : memory_limit_policy_(ALLOW_ANYTHING),
83         max_tiles_(10000),
84         id_(7),
85         proxy_(base::MessageLoopProxy::current()),
86         host_impl_(ImplSidePaintingSettings(10000),
87                    &proxy_,
88                    &shared_bitmap_manager_),
89         timer_(kWarmupRuns,
90                base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
91                kTimeCheckInterval) {}
92
93   void SetTreePriority(TreePriority tree_priority) {
94     GlobalStateThatImpactsTilePriority state;
95     gfx::Size tile_size(256, 256);
96
97     state.soft_memory_limit_in_bytes = 100 * 1000 * 1000;
98     state.num_resources_limit = max_tiles_;
99     state.hard_memory_limit_in_bytes = state.soft_memory_limit_in_bytes * 2;
100     state.memory_limit_policy = memory_limit_policy_;
101     state.tree_priority = tree_priority;
102
103     global_state_ = state;
104     host_impl_.resource_pool()->SetResourceUsageLimits(
105         state.soft_memory_limit_in_bytes, 0, state.num_resources_limit);
106     host_impl_.tile_manager()->SetGlobalStateForTesting(state);
107   }
108
109   virtual void SetUp() OVERRIDE {
110     picture_pile_ = FakePicturePileImpl::CreateInfiniteFilledPile();
111     InitializeRenderer();
112     SetTreePriority(SAME_PRIORITY_FOR_BOTH_TREES);
113   }
114
115   virtual void InitializeRenderer() {
116     host_impl_.InitializeRenderer(
117         FakeOutputSurface::Create3d().PassAs<OutputSurface>());
118     tile_manager()->SetRasterizerForTesting(g_fake_rasterizer.Pointer());
119   }
120
121   void SetupDefaultTrees(const gfx::Size& layer_bounds) {
122     gfx::Size tile_size(100, 100);
123
124     scoped_refptr<FakePicturePileImpl> pending_pile =
125         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
126     scoped_refptr<FakePicturePileImpl> active_pile =
127         FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
128
129     SetupTrees(pending_pile, active_pile);
130   }
131
132   void ActivateTree() {
133     host_impl_.ActivatePendingTree();
134     CHECK(!host_impl_.pending_tree());
135     pending_root_layer_ = NULL;
136     active_root_layer_ = static_cast<FakePictureLayerImpl*>(
137         host_impl_.active_tree()->LayerById(id_));
138   }
139
140   void SetupDefaultTreesWithFixedTileSize(const gfx::Size& layer_bounds,
141                                           const gfx::Size& tile_size) {
142     SetupDefaultTrees(layer_bounds);
143     pending_root_layer_->set_fixed_tile_size(tile_size);
144     active_root_layer_->set_fixed_tile_size(tile_size);
145   }
146
147   void SetupTrees(scoped_refptr<PicturePileImpl> pending_pile,
148                   scoped_refptr<PicturePileImpl> active_pile) {
149     SetupPendingTree(active_pile);
150     ActivateTree();
151     SetupPendingTree(pending_pile);
152   }
153
154   void SetupPendingTree(scoped_refptr<PicturePileImpl> pile) {
155     host_impl_.CreatePendingTree();
156     LayerTreeImpl* pending_tree = host_impl_.pending_tree();
157     // Clear recycled tree.
158     pending_tree->DetachLayerTree();
159
160     scoped_ptr<FakePictureLayerImpl> pending_layer =
161         FakePictureLayerImpl::CreateWithPile(pending_tree, id_, pile);
162     pending_layer->SetDrawsContent(true);
163     pending_tree->SetRootLayer(pending_layer.PassAs<LayerImpl>());
164
165     pending_root_layer_ = static_cast<FakePictureLayerImpl*>(
166         host_impl_.pending_tree()->LayerById(id_));
167     pending_root_layer_->DoPostCommitInitializationIfNeeded();
168   }
169
170   void CreateHighLowResAndSetAllTilesVisible() {
171     // Active layer must get updated first so pending layer can share from it.
172     active_root_layer_->CreateDefaultTilingsAndTiles();
173     active_root_layer_->SetAllTilesVisible();
174     pending_root_layer_->CreateDefaultTilingsAndTiles();
175     pending_root_layer_->SetAllTilesVisible();
176   }
177
178   void RunRasterIteratorTest(const std::string& test_name,
179                              unsigned tile_count) {
180     timer_.Reset();
181     do {
182       int count = tile_count;
183       for (TileManager::RasterTileIterator it(tile_manager(),
184                                               SAME_PRIORITY_FOR_BOTH_TREES);
185            it && count;
186            ++it) {
187         --count;
188       }
189       ASSERT_EQ(0, count);
190       timer_.NextLap();
191     } while (!timer_.HasTimeLimitExpired());
192
193     perf_test::PrintResult("tile_manager_raster_tile_iterator",
194                            "",
195                            test_name,
196                            timer_.LapsPerSecond(),
197                            "runs/s",
198                            true);
199   }
200
201   std::vector<LayerImpl*> CreateLayers(int layer_count,
202                                        int tiles_per_layer_count) {
203     // Compute the width/height required for high res to get
204     // tiles_per_layer_count tiles.
205     float width = std::sqrt(static_cast<float>(tiles_per_layer_count));
206     float height = tiles_per_layer_count / width;
207
208     // Adjust the width and height to account for the fact that tiles
209     // are bigger than 1x1. Also, account for the fact that that we
210     // will be creating one high res and one low res tiling. That is,
211     // width and height should be smaller by sqrt(1 + low_res_scale).
212     // This gives us _approximately_ correct counts.
213     width *= settings_.default_tile_size.width() /
214              std::sqrt(1 + settings_.low_res_contents_scale_factor);
215     height *= settings_.default_tile_size.height() /
216               std::sqrt(1 + settings_.low_res_contents_scale_factor);
217
218     // Ensure that we start with blank trees and no tiles.
219     host_impl_.ResetTreesForTesting();
220     tile_manager()->CleanUpReleasedTilesForTesting();
221
222     gfx::Size layer_bounds(width, height);
223     gfx::Size viewport(width / 5, height / 5);
224     host_impl_.SetViewportSize(viewport);
225     SetupDefaultTreesWithFixedTileSize(layer_bounds,
226                                        settings_.default_tile_size);
227
228     active_root_layer_->CreateDefaultTilingsAndTiles();
229     pending_root_layer_->CreateDefaultTilingsAndTiles();
230
231     std::vector<LayerImpl*> layers;
232
233     // Pending layer counts as one layer.
234     layers.push_back(pending_root_layer_);
235     int next_id = id_ + 1;
236
237     // Create the rest of the layers as children of the root layer.
238     while (static_cast<int>(layers.size()) < layer_count) {
239       scoped_ptr<FakePictureLayerImpl> layer =
240           FakePictureLayerImpl::CreateWithPile(
241               host_impl_.pending_tree(), next_id, picture_pile_);
242       layer->SetBounds(layer_bounds);
243       layers.push_back(layer.get());
244       pending_root_layer_->AddChild(layer.PassAs<LayerImpl>());
245
246       FakePictureLayerImpl* fake_layer =
247           static_cast<FakePictureLayerImpl*>(layers.back());
248
249       fake_layer->SetDrawsContent(true);
250       fake_layer->DoPostCommitInitializationIfNeeded();
251       fake_layer->CreateDefaultTilingsAndTiles();
252       ++next_id;
253     }
254
255     return layers;
256   }
257
258   GlobalStateThatImpactsTilePriority GlobalStateForTest() {
259     GlobalStateThatImpactsTilePriority state;
260     gfx::Size tile_size = settings_.default_tile_size;
261     state.soft_memory_limit_in_bytes =
262         10000u * 4u *
263         static_cast<size_t>(tile_size.width() * tile_size.height());
264     state.hard_memory_limit_in_bytes = state.soft_memory_limit_in_bytes;
265     state.num_resources_limit = 10000;
266     state.memory_limit_policy = ALLOW_ANYTHING;
267     state.tree_priority = SMOOTHNESS_TAKES_PRIORITY;
268     return state;
269   }
270
271   void RunManageTilesTest(const std::string& test_name,
272                           int layer_count,
273                           int approximate_tile_count_per_layer) {
274     std::vector<LayerImpl*> layers =
275         CreateLayers(layer_count, approximate_tile_count_per_layer);
276     timer_.Reset();
277     do {
278       host_impl_.UpdateCurrentFrameTime();
279       for (unsigned i = 0; i < layers.size(); ++i)
280         layers[i]->UpdateTiles();
281
282       GlobalStateThatImpactsTilePriority global_state(GlobalStateForTest());
283       tile_manager()->ManageTiles(global_state);
284       tile_manager()->UpdateVisibleTiles();
285       timer_.NextLap();
286       host_impl_.ResetCurrentFrameTimeForNextFrame();
287     } while (!timer_.HasTimeLimitExpired());
288
289     perf_test::PrintResult(
290         "manage_tiles", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
291   }
292
293   TileManager* tile_manager() { return host_impl_.tile_manager(); }
294
295  protected:
296   GlobalStateThatImpactsTilePriority global_state_;
297
298   TestSharedBitmapManager shared_bitmap_manager_;
299   TileMemoryLimitPolicy memory_limit_policy_;
300   int max_tiles_;
301   int id_;
302   FakeImplProxy proxy_;
303   FakeLayerTreeHostImpl host_impl_;
304   FakePictureLayerImpl* pending_root_layer_;
305   FakePictureLayerImpl* active_root_layer_;
306   LapTimer timer_;
307   scoped_refptr<FakePicturePileImpl> picture_pile_;
308   LayerTreeSettings settings_;
309 };
310
311 TEST_F(TileManagerPerfTest, ManageTiles) {
312   RunManageTilesTest("1_100", 1, 100);
313   RunManageTilesTest("1_500", 1, 500);
314   RunManageTilesTest("1_1000", 1, 1000);
315   RunManageTilesTest("5_100", 5, 100);
316   RunManageTilesTest("5_500", 5, 500);
317   RunManageTilesTest("5_1000", 5, 1000);
318   RunManageTilesTest("10_100", 10, 100);
319   RunManageTilesTest("10_500", 10, 500);
320   RunManageTilesTest("10_1000", 10, 1000);
321   RunManageTilesTest("100_100", 100, 100);
322   RunManageTilesTest("100_500", 100, 500);
323   RunManageTilesTest("100_1000", 100, 1000);
324 }
325
326 TEST_F(TileManagerPerfTest, RasterTileIterator) {
327   SetupDefaultTrees(gfx::Size(10000, 10000));
328   active_root_layer_->CreateDefaultTilingsAndTiles();
329   pending_root_layer_->CreateDefaultTilingsAndTiles();
330
331   RunRasterIteratorTest("2_16", 16);
332   RunRasterIteratorTest("2_32", 32);
333   RunRasterIteratorTest("2_64", 64);
334   RunRasterIteratorTest("2_128", 128);
335 }
336
337 }  // namespace
338
339 }  // namespace cc