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.
5 #include "cc/debug/lap_timer.h"
6 #include "cc/resources/picture_layer_tiling.h"
7 #include "cc/resources/resource_provider.h"
8 #include "cc/resources/scoped_resource.h"
9 #include "cc/test/fake_output_surface.h"
10 #include "cc/test/fake_output_surface_client.h"
11 #include "cc/test/fake_picture_layer_tiling_client.h"
12 #include "cc/test/test_context_provider.h"
13 #include "cc/test/test_shared_bitmap_manager.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "testing/perf/perf_test.h"
22 static const int kTimeLimitMillis = 2000;
23 static const int kWarmupRuns = 5;
24 static const int kTimeCheckInterval = 10;
26 class PictureLayerTilingPerfTest : public testing::Test {
28 PictureLayerTilingPerfTest()
30 base::TimeDelta::FromMilliseconds(kTimeLimitMillis),
32 context_provider_(TestContextProvider::Create()) {
33 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
34 CHECK(output_surface_->BindToClient(&output_surface_client_));
36 shared_bitmap_manager_.reset(new TestSharedBitmapManager());
37 resource_provider_ = ResourceProvider::Create(output_surface_.get(),
38 shared_bitmap_manager_.get(),
46 virtual void SetUp() override {
47 picture_layer_tiling_client_.SetTileSize(gfx::Size(256, 256));
48 picture_layer_tiling_client_.set_max_tiles_for_interest_area(250);
49 picture_layer_tiling_client_.set_tree(PENDING_TREE);
50 picture_layer_tiling_ = PictureLayerTiling::Create(
51 1, gfx::Size(256 * 50, 256 * 50), &picture_layer_tiling_client_);
52 picture_layer_tiling_->CreateAllTilesForTesting();
55 virtual void TearDown() override {
56 picture_layer_tiling_.reset(NULL);
59 void RunInvalidateTest(const std::string& test_name, const Region& region) {
62 picture_layer_tiling_->UpdateTilesToCurrentPile(
63 region, picture_layer_tiling_->tiling_size());
65 } while (!timer_.HasTimeLimitExpired());
67 perf_test::PrintResult(
68 "invalidation", "", test_name, timer_.LapsPerSecond(), "runs/s", true);
71 void RunComputeTilePriorityRectsStationaryTest(
72 const std::string& test_name,
73 const gfx::Transform& transform) {
74 gfx::Rect viewport_rect(0, 0, 1024, 768);
78 picture_layer_tiling_->ComputeTilePriorityRects(
79 PENDING_TREE, viewport_rect, 1.f, timer_.NumLaps() + 1, Occlusion());
81 } while (!timer_.HasTimeLimitExpired());
83 perf_test::PrintResult("compute_tile_priority_rects_stationary",
86 timer_.LapsPerSecond(),
91 void RunComputeTilePriorityRectsScrollingTest(
92 const std::string& test_name,
93 const gfx::Transform& transform) {
94 gfx::Size viewport_size(1024, 768);
95 gfx::Rect viewport_rect(viewport_size);
96 int xoffsets[] = {10, 0, -10, 0};
97 int yoffsets[] = {0, 10, 0, -10};
100 const int maxOffsetCount = 1000;
104 picture_layer_tiling_->ComputeTilePriorityRects(
105 PENDING_TREE, viewport_rect, 1.f, timer_.NumLaps() + 1, Occlusion());
107 viewport_rect = gfx::Rect(viewport_rect.x() + xoffsets[offsetIndex],
108 viewport_rect.y() + yoffsets[offsetIndex],
109 viewport_rect.width(),
110 viewport_rect.height());
112 if (++offsetCount > maxOffsetCount) {
114 offsetIndex = (offsetIndex + 1) % 4;
117 } while (!timer_.HasTimeLimitExpired());
119 perf_test::PrintResult("compute_tile_priority_rects_scrolling",
122 timer_.LapsPerSecond(),
127 void RunRasterIteratorConstructTest(const std::string& test_name,
128 const gfx::Rect& viewport) {
129 gfx::Size bounds(viewport.size());
130 picture_layer_tiling_ =
131 PictureLayerTiling::Create(1, bounds, &picture_layer_tiling_client_);
132 picture_layer_tiling_client_.set_tree(ACTIVE_TREE);
133 picture_layer_tiling_->ComputeTilePriorityRects(
134 ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
138 PictureLayerTiling::TilingRasterTileIterator it(
139 picture_layer_tiling_.get());
141 } while (!timer_.HasTimeLimitExpired());
143 perf_test::PrintResult("tiling_raster_tile_iterator_construct",
146 timer_.LapsPerSecond(),
151 void RunRasterIteratorConstructAndIterateTest(const std::string& test_name,
153 const gfx::Rect& viewport) {
154 gfx::Size bounds(10000, 10000);
155 picture_layer_tiling_ =
156 PictureLayerTiling::Create(1, bounds, &picture_layer_tiling_client_);
157 picture_layer_tiling_client_.set_tree(ACTIVE_TREE);
158 picture_layer_tiling_->ComputeTilePriorityRects(
159 ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
163 int count = num_tiles;
164 PictureLayerTiling::TilingRasterTileIterator it(
165 picture_layer_tiling_.get());
167 ASSERT_TRUE(it) << "count: " << count;
168 ASSERT_TRUE(*it != NULL) << "count: " << count;
172 } while (!timer_.HasTimeLimitExpired());
174 perf_test::PrintResult("tiling_raster_tile_iterator_construct_and_iterate",
177 timer_.LapsPerSecond(),
182 void RunEvictionIteratorConstructTest(const std::string& test_name,
183 const gfx::Rect& viewport) {
184 gfx::Size bounds(viewport.size());
185 picture_layer_tiling_ =
186 PictureLayerTiling::Create(1, bounds, &picture_layer_tiling_client_);
187 picture_layer_tiling_client_.set_tree(ACTIVE_TREE);
188 picture_layer_tiling_->ComputeTilePriorityRects(
189 ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
192 TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
193 SMOOTHNESS_TAKES_PRIORITY,
194 NEW_CONTENT_TAKES_PRIORITY};
195 int priority_count = 0;
197 PictureLayerTiling::TilingEvictionTileIterator it(
198 picture_layer_tiling_.get(),
199 priorities[priority_count],
200 PictureLayerTiling::NOW);
201 priority_count = (priority_count + 1) % arraysize(priorities);
203 } while (!timer_.HasTimeLimitExpired());
205 perf_test::PrintResult("tiling_eviction_tile_iterator_construct",
208 timer_.LapsPerSecond(),
213 void RunEvictionIteratorConstructAndIterateTest(const std::string& test_name,
215 const gfx::Rect& viewport) {
216 gfx::Size bounds(10000, 10000);
217 picture_layer_tiling_ =
218 PictureLayerTiling::Create(1, bounds, &picture_layer_tiling_client_);
219 picture_layer_tiling_client_.set_tree(ACTIVE_TREE);
220 picture_layer_tiling_->ComputeTilePriorityRects(
221 ACTIVE_TREE, viewport, 1.0f, 1.0, Occlusion());
223 TreePriority priorities[] = {SAME_PRIORITY_FOR_BOTH_TREES,
224 SMOOTHNESS_TAKES_PRIORITY,
225 NEW_CONTENT_TAKES_PRIORITY};
227 // Ensure all tiles have resources.
228 std::vector<Tile*> all_tiles = picture_layer_tiling_->AllTilesForTesting();
229 for (std::vector<Tile*>::iterator tile_it = all_tiles.begin();
230 tile_it != all_tiles.end();
232 Tile* tile = *tile_it;
233 ManagedTileState::DrawInfo& draw_info = tile->draw_info();
234 draw_info.SetResourceForTesting(
235 ScopedResource::Create(resource_provider_.get()).Pass());
238 int priority_count = 0;
241 int count = num_tiles;
242 PictureLayerTiling::TilingEvictionTileIterator it(
243 picture_layer_tiling_.get(),
244 priorities[priority_count],
245 PictureLayerTiling::EVENTUALLY);
247 ASSERT_TRUE(it) << "count: " << count;
248 ASSERT_TRUE(*it != NULL) << "count: " << count;
251 priority_count = (priority_count + 1) % arraysize(priorities);
253 } while (!timer_.HasTimeLimitExpired());
255 // Remove all resources from tiles to make sure the tile version destructor
257 for (std::vector<Tile*>::iterator tile_it = all_tiles.begin();
258 tile_it != all_tiles.end();
260 Tile* tile = *tile_it;
261 ManagedTileState::DrawInfo& draw_info = tile->draw_info();
262 draw_info.SetResourceForTesting(nullptr);
265 perf_test::PrintResult(
266 "tiling_eviction_tile_iterator_construct_and_iterate",
269 timer_.LapsPerSecond(),
275 FakePictureLayerTilingClient picture_layer_tiling_client_;
276 scoped_ptr<PictureLayerTiling> picture_layer_tiling_;
280 scoped_refptr<ContextProvider> context_provider_;
281 FakeOutputSurfaceClient output_surface_client_;
282 scoped_ptr<FakeOutputSurface> output_surface_;
283 scoped_ptr<SharedBitmapManager> shared_bitmap_manager_;
284 scoped_ptr<ResourceProvider> resource_provider_;
287 TEST_F(PictureLayerTilingPerfTest, Invalidate) {
288 Region one_tile(gfx::Rect(256, 256));
289 RunInvalidateTest("1x1", one_tile);
291 Region half_region(gfx::Rect(25 * 256, 50 * 256));
292 RunInvalidateTest("25x50", half_region);
294 Region full_region(gfx::Rect(50 * 256, 50 * 256));
295 RunInvalidateTest("50x50", full_region);
298 #if defined(OS_ANDROID)
299 // TODO(vmpstr): Investigate why this is noisy (crbug.com/310220).
300 TEST_F(PictureLayerTilingPerfTest, DISABLED_ComputeTilePriorityRects) {
302 TEST_F(PictureLayerTilingPerfTest, ComputeTilePriorityRects) {
303 #endif // defined(OS_ANDROID)
304 gfx::Transform transform;
306 RunComputeTilePriorityRectsStationaryTest("no_transform", transform);
307 RunComputeTilePriorityRectsScrollingTest("no_transform", transform);
309 transform.Rotate(10);
310 RunComputeTilePriorityRectsStationaryTest("rotation", transform);
311 RunComputeTilePriorityRectsScrollingTest("rotation", transform);
313 transform.ApplyPerspectiveDepth(10);
314 RunComputeTilePriorityRectsStationaryTest("perspective", transform);
315 RunComputeTilePriorityRectsScrollingTest("perspective", transform);
318 TEST_F(PictureLayerTilingPerfTest, TilingRasterTileIteratorConstruct) {
319 RunRasterIteratorConstructTest("0_0_100x100", gfx::Rect(0, 0, 100, 100));
320 RunRasterIteratorConstructTest("50_0_100x100", gfx::Rect(50, 0, 100, 100));
321 RunRasterIteratorConstructTest("100_0_100x100", gfx::Rect(100, 0, 100, 100));
322 RunRasterIteratorConstructTest("150_0_100x100", gfx::Rect(150, 0, 100, 100));
325 TEST_F(PictureLayerTilingPerfTest,
326 TilingRasterTileIteratorConstructAndIterate) {
327 RunRasterIteratorConstructAndIterateTest(
328 "32_100x100", 32, gfx::Rect(0, 0, 100, 100));
329 RunRasterIteratorConstructAndIterateTest(
330 "32_500x500", 32, gfx::Rect(0, 0, 500, 500));
331 RunRasterIteratorConstructAndIterateTest(
332 "64_100x100", 64, gfx::Rect(0, 0, 100, 100));
333 RunRasterIteratorConstructAndIterateTest(
334 "64_500x500", 64, gfx::Rect(0, 0, 500, 500));
337 TEST_F(PictureLayerTilingPerfTest, TilingEvictionTileIteratorConstruct) {
338 RunEvictionIteratorConstructTest("0_0_100x100", gfx::Rect(0, 0, 100, 100));
339 RunEvictionIteratorConstructTest("50_0_100x100", gfx::Rect(50, 0, 100, 100));
340 RunEvictionIteratorConstructTest("100_0_100x100",
341 gfx::Rect(100, 0, 100, 100));
342 RunEvictionIteratorConstructTest("150_0_100x100",
343 gfx::Rect(150, 0, 100, 100));
346 TEST_F(PictureLayerTilingPerfTest,
347 TilingEvictionTileIteratorConstructAndIterate) {
348 RunEvictionIteratorConstructAndIterateTest(
349 "32_100x100", 32, gfx::Rect(0, 0, 100, 100));
350 RunEvictionIteratorConstructAndIterateTest(
351 "32_500x500", 32, gfx::Rect(0, 0, 500, 500));
352 RunEvictionIteratorConstructAndIterateTest(
353 "64_100x100", 64, gfx::Rect(0, 0, 100, 100));
354 RunEvictionIteratorConstructAndIterateTest(
355 "64_500x500", 64, gfx::Rect(0, 0, 500, 500));