Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(421)

Side by Side Diff: cc/layers/picture_layer_impl_unittest.cc

Issue 736753002: cc: Implement geometry-based tile eviction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/layers/picture_layer_impl.h" 5 #include "cc/layers/picture_layer_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 #include <utility> 10 #include <utility>
(...skipping 2968 matching lines...) Expand 10 before | Expand all | Expand 10 after
2979 pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES); 2979 pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
2980 EXPECT_TRUE(queue->IsEmpty()); 2980 EXPECT_TRUE(queue->IsEmpty());
2981 2981
2982 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 2982 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
2983 2983
2984 std::set<Tile*> unique_tiles; 2984 std::set<Tile*> unique_tiles;
2985 float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f}; 2985 float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f};
2986 size_t scale_index = 0; 2986 size_t scale_index = 0;
2987 bool reached_visible = false; 2987 bool reached_visible = false;
2988 Tile* last_tile = nullptr; 2988 Tile* last_tile = nullptr;
2989 int distance_decreasing = 0;
2990 int distance_increasing = 0;
2989 queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES); 2991 queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
2990 while (!queue->IsEmpty()) { 2992 while (!queue->IsEmpty()) {
2991 Tile* tile = queue->Top(); 2993 Tile* tile = queue->Top();
2992 if (!last_tile) 2994 if (!last_tile)
2993 last_tile = tile; 2995 last_tile = tile;
2994 2996
2995 EXPECT_TRUE(tile); 2997 EXPECT_TRUE(tile);
2996 2998
2997 TilePriority priority = tile->priority(PENDING_TREE); 2999 TilePriority priority = tile->priority(PENDING_TREE);
2998 3000
2999 if (priority.priority_bin == TilePriority::NOW) { 3001 if (priority.priority_bin == TilePriority::NOW) {
3000 reached_visible = true; 3002 reached_visible = true;
3001 last_tile = tile; 3003 last_tile = tile;
3002 break; 3004 break;
3003 } 3005 }
3004 3006
3005 EXPECT_FALSE(tile->required_for_activation()); 3007 EXPECT_FALSE(tile->required_for_activation());
3006 3008
3007 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) > 3009 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) >
3008 std::numeric_limits<float>::epsilon()) { 3010 std::numeric_limits<float>::epsilon()) {
3009 ++scale_index; 3011 ++scale_index;
3010 ASSERT_LT(scale_index, arraysize(expected_scales)); 3012 ASSERT_LT(scale_index, arraysize(expected_scales));
3011 } 3013 }
3012 3014
3013 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]); 3015 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
3014 unique_tiles.insert(tile); 3016 unique_tiles.insert(tile);
3015 3017
3016 // If the tile is the same rough bin as last tile (same activation, bin, and
3017 // scale), then distance should be decreasing.
3018 if (tile->required_for_activation() == 3018 if (tile->required_for_activation() ==
3019 last_tile->required_for_activation() && 3019 last_tile->required_for_activation() &&
3020 priority.priority_bin == 3020 priority.priority_bin ==
3021 last_tile->priority(PENDING_TREE).priority_bin && 3021 last_tile->priority(PENDING_TREE).priority_bin &&
3022 std::abs(tile->contents_scale() - last_tile->contents_scale()) < 3022 std::abs(tile->contents_scale() - last_tile->contents_scale()) <
3023 std::numeric_limits<float>::epsilon()) { 3023 std::numeric_limits<float>::epsilon()) {
3024 EXPECT_LE(priority.distance_to_visible, 3024 if (priority.distance_to_visible <=
3025 last_tile->priority(PENDING_TREE).distance_to_visible); 3025 last_tile->priority(PENDING_TREE).distance_to_visible)
3026 ++distance_decreasing;
3027 else
3028 ++distance_increasing;
3026 } 3029 }
3027 3030
3028 last_tile = tile; 3031 last_tile = tile;
3029 queue->Pop(); 3032 queue->Pop();
3030 } 3033 }
3031 3034
3035 EXPECT_EQ(7, distance_increasing);
3036 EXPECT_EQ(55, distance_decreasing);
3037
3032 EXPECT_TRUE(reached_visible); 3038 EXPECT_TRUE(reached_visible);
3033 EXPECT_EQ(65u, unique_tiles.size()); 3039 EXPECT_EQ(65u, unique_tiles.size());
3034 3040
3035 scale_index = 0; 3041 scale_index = 0;
3036 bool reached_required = false; 3042 bool reached_required = false;
3037 while (!queue->IsEmpty()) { 3043 while (!queue->IsEmpty()) {
3038 Tile* tile = queue->Top(); 3044 Tile* tile = queue->Top();
3039 EXPECT_TRUE(tile); 3045 EXPECT_TRUE(tile);
3040 3046
3041 TilePriority priority = tile->priority(PENDING_TREE); 3047 TilePriority priority = tile->priority(PENDING_TREE);
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
3844 class OcclusionTrackingSettings : public LowResTilingsSettings { 3850 class OcclusionTrackingSettings : public LowResTilingsSettings {
3845 public: 3851 public:
3846 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; } 3852 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; }
3847 }; 3853 };
3848 3854
3849 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest { 3855 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
3850 public: 3856 public:
3851 OcclusionTrackingPictureLayerImplTest() 3857 OcclusionTrackingPictureLayerImplTest()
3852 : PictureLayerImplTest(OcclusionTrackingSettings()) {} 3858 : PictureLayerImplTest(OcclusionTrackingSettings()) {}
3853 3859
3854 void VerifyEvictionConsidersOcclusion( 3860 void VerifyEvictionConsidersOcclusion(FakePictureLayerImpl* layer,
3855 PictureLayerImpl* layer, 3861 FakePictureLayerImpl* twin_layer,
3856 size_t expected_occluded_tile_count[NUM_TREE_PRIORITIES]) { 3862 WhichTree tree,
3863 size_t expected_occluded_tile_count) {
3864 twin_layer->set_has_valid_tile_priorities(false);
3857 for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES; 3865 for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES;
3858 ++priority_count) { 3866 ++priority_count) {
3859 TreePriority tree_priority = static_cast<TreePriority>(priority_count); 3867 TreePriority tree_priority = static_cast<TreePriority>(priority_count);
3860 size_t occluded_tile_count = 0u; 3868 size_t occluded_tile_count = 0u;
3861 Tile* last_tile = nullptr; 3869 Tile* last_tile = nullptr;
3870 std::set<Tile*> shared_tiles;
3862 3871
3863 scoped_ptr<TilingSetEvictionQueue> queue = 3872 scoped_ptr<TilingSetEvictionQueue> queue =
3864 layer->CreateEvictionQueue(tree_priority); 3873 layer->CreateEvictionQueue(tree_priority);
3865 while (!queue->IsEmpty()) { 3874 while (!queue->IsEmpty()) {
3866 Tile* tile = queue->Top(); 3875 Tile* tile = queue->Top();
3867 if (!last_tile) 3876 if (!last_tile)
3868 last_tile = tile; 3877 last_tile = tile;
3878 if (tile->is_shared())
3879 EXPECT_TRUE(shared_tiles.insert(tile).second);
3869 3880
3870 // The only way we will encounter an occluded tile after an unoccluded 3881 // The only way we will encounter an occluded tile after an unoccluded
3871 // tile is if the priorty bin decreased, the tile is required for 3882 // tile is if the priorty bin decreased, the tile is required for
3872 // activation, or the scale changed. 3883 // activation, or the scale changed.
3873 bool tile_is_occluded = 3884 bool tile_is_occluded = tile->is_occluded(tree);
3874 tile->is_occluded_for_tree_priority(tree_priority);
3875 if (tile_is_occluded) { 3885 if (tile_is_occluded) {
3876 occluded_tile_count++; 3886 occluded_tile_count++;
3877 3887
3878 bool last_tile_is_occluded = 3888 bool last_tile_is_occluded = last_tile->is_occluded(tree);
3879 last_tile->is_occluded_for_tree_priority(tree_priority);
3880 if (!last_tile_is_occluded) { 3889 if (!last_tile_is_occluded) {
3881 TilePriority::PriorityBin tile_priority_bin = 3890 TilePriority::PriorityBin tile_priority_bin =
3882 tile->priority_for_tree_priority(tree_priority).priority_bin; 3891 tile->priority(tree).priority_bin;
3883 TilePriority::PriorityBin last_tile_priority_bin = 3892 TilePriority::PriorityBin last_tile_priority_bin =
3884 last_tile->priority_for_tree_priority(tree_priority) 3893 last_tile->priority(tree).priority_bin;
3885 .priority_bin;
3886 3894
3887 EXPECT_TRUE( 3895 EXPECT_TRUE(
3888 (tile_priority_bin < last_tile_priority_bin) || 3896 (tile_priority_bin < last_tile_priority_bin) ||
3889 tile->required_for_activation() || 3897 tile->required_for_activation() ||
3890 (tile->contents_scale() != last_tile->contents_scale())); 3898 (tile->contents_scale() != last_tile->contents_scale()));
3891 } 3899 }
3892 } 3900 }
3893 last_tile = tile; 3901 last_tile = tile;
3894 queue->Pop(); 3902 queue->Pop();
3895 } 3903 }
3896 EXPECT_EQ(expected_occluded_tile_count[priority_count], 3904 // Count also shared tiles which are occluded in the tree but which were
3897 occluded_tile_count); 3905 // not returned by the tiling set eviction queue. Those shared tiles
3906 // shall be returned by the twin tiling set eviction queue.
3907 queue = twin_layer->CreateEvictionQueue(tree_priority);
3908 while (!queue->IsEmpty()) {
3909 Tile* tile = queue->Top();
3910 if (tile->is_shared()) {
3911 EXPECT_TRUE(shared_tiles.insert(tile).second);
3912 if (tile->is_occluded(tree))
3913 ++occluded_tile_count;
3914 }
3915 queue->Pop();
3916 }
3917 EXPECT_EQ(expected_occluded_tile_count, occluded_tile_count);
3898 } 3918 }
3919 twin_layer->set_has_valid_tile_priorities(true);
3899 } 3920 }
3900 }; 3921 };
3901 3922
3902 TEST_F(OcclusionTrackingPictureLayerImplTest, 3923 TEST_F(OcclusionTrackingPictureLayerImplTest,
3903 OccludedTilesSkippedDuringRasterization) { 3924 OccludedTilesSkippedDuringRasterization) {
3904 base::TimeTicks time_ticks; 3925 base::TimeTicks time_ticks;
3905 time_ticks += base::TimeDelta::FromMilliseconds(1); 3926 time_ticks += base::TimeDelta::FromMilliseconds(1);
3906 host_impl_.SetCurrentBeginFrameArgs( 3927 host_impl_.SetCurrentBeginFrameArgs(
3907 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); 3928 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
3908 3929
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
4359 host_impl_.SetViewportSize(viewport_size); 4380 host_impl_.SetViewportSize(viewport_size);
4360 host_impl_.active_tree()->UpdateDrawProperties(); 4381 host_impl_.active_tree()->UpdateDrawProperties();
4361 host_impl_.pending_tree()->UpdateDrawProperties(); 4382 host_impl_.pending_tree()->UpdateDrawProperties();
4362 4383
4363 // The expected number of occluded tiles on each of the 5 tilings for each of 4384 // The expected number of occluded tiles on each of the 5 tilings for each of
4364 // the 3 tree priorities. 4385 // the 3 tree priorities.
4365 size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u}; 4386 size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u};
4366 size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u}; 4387 size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u};
4367 size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u}; 4388 size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u};
4368 4389
4369 // The total expected number of occluded tiles on all tilings for each of the 4390 size_t total_expected_occluded_tile_count_on_trees[] = {43u, 43u};
4370 // 3 tree priorities.
4371 size_t total_expected_occluded_tile_count[] = {13u, 43u, 43u};
4372
4373 ASSERT_EQ(arraysize(total_expected_occluded_tile_count), NUM_TREE_PRIORITIES);
4374 4391
4375 // Verify number of occluded tiles on the pending layer for each tiling. 4392 // Verify number of occluded tiles on the pending layer for each tiling.
4376 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { 4393 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
4377 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); 4394 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
4378 tiling->CreateAllTilesForTesting(); 4395 tiling->CreateAllTilesForTesting();
4379 tiling->UpdateAllTilePrioritiesForTesting(); 4396 tiling->UpdateAllTilePrioritiesForTesting();
4380 4397
4381 size_t occluded_tile_count_on_pending = 0u; 4398 size_t occluded_tile_count_on_pending = 0u;
4382 size_t occluded_tile_count_on_active = 0u; 4399 size_t occluded_tile_count_on_active = 0u;
4383 size_t occluded_tile_count_on_both = 0u; 4400 size_t occluded_tile_count_on_both = 0u;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4446 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator = 4463 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
4447 tilings.begin(); 4464 tilings.begin();
4448 tiling_iterator != tilings.end(); 4465 tiling_iterator != tilings.end();
4449 ++tiling_iterator) { 4466 ++tiling_iterator) {
4450 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting(); 4467 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
4451 std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles)); 4468 std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles));
4452 } 4469 }
4453 4470
4454 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 4471 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
4455 4472
4456 VerifyEvictionConsidersOcclusion(pending_layer_, 4473 VerifyEvictionConsidersOcclusion(
4457 total_expected_occluded_tile_count); 4474 pending_layer_, active_layer_, PENDING_TREE,
4458 VerifyEvictionConsidersOcclusion(active_layer_, 4475 total_expected_occluded_tile_count_on_trees[PENDING_TREE]);
4459 total_expected_occluded_tile_count); 4476 VerifyEvictionConsidersOcclusion(
4477 active_layer_, pending_layer_, ACTIVE_TREE,
4478 total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]);
4460 } 4479 }
4461 4480
4462 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) { 4481 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) {
4463 gfx::Size tile_size(102, 102); 4482 gfx::Size tile_size(102, 102);
4464 gfx::Size layer_bounds(1000, 1000); 4483 gfx::Size layer_bounds(1000, 1000);
4465 4484
4466 scoped_refptr<FakePicturePileImpl> pile = 4485 scoped_refptr<FakePicturePileImpl> pile =
4467 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); 4486 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4468 SetupPendingTree(pile); 4487 SetupPendingTree(pile);
4469 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer()); 4488 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer());
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
4756 result = layer->CalculateTileSize(gfx::Size(447, 400)); 4775 result = layer->CalculateTileSize(gfx::Size(447, 400));
4757 EXPECT_EQ(result.width(), 448); 4776 EXPECT_EQ(result.width(), 448);
4758 EXPECT_EQ(result.height(), 448); 4777 EXPECT_EQ(result.height(), 448);
4759 result = layer->CalculateTileSize(gfx::Size(500, 499)); 4778 result = layer->CalculateTileSize(gfx::Size(500, 499));
4760 EXPECT_EQ(result.width(), 512); 4779 EXPECT_EQ(result.width(), 512);
4761 EXPECT_EQ(result.height(), 500 + 2); 4780 EXPECT_EQ(result.height(), 500 + 2);
4762 } 4781 }
4763 4782
4764 } // namespace 4783 } // namespace
4765 } // namespace cc 4784 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698