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

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: Clean up 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 2958 matching lines...) Expand 10 before | Expand all | Expand 10 after
2969 pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES); 2969 pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
2970 EXPECT_TRUE(queue->IsEmpty()); 2970 EXPECT_TRUE(queue->IsEmpty());
2971 2971
2972 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 2972 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
2973 2973
2974 std::set<Tile*> unique_tiles; 2974 std::set<Tile*> unique_tiles;
2975 float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f}; 2975 float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f};
2976 size_t scale_index = 0; 2976 size_t scale_index = 0;
2977 bool reached_visible = false; 2977 bool reached_visible = false;
2978 Tile* last_tile = nullptr; 2978 Tile* last_tile = nullptr;
2979 int distance_decreasing = 0;
2980 int distance_increasing = 0;
2979 queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES); 2981 queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
2980 while (!queue->IsEmpty()) { 2982 while (!queue->IsEmpty()) {
2981 Tile* tile = queue->Top(); 2983 Tile* tile = queue->Top();
2982 if (!last_tile) 2984 if (!last_tile)
2983 last_tile = tile; 2985 last_tile = tile;
2984 2986
2985 EXPECT_TRUE(tile); 2987 EXPECT_TRUE(tile);
2986 2988
2987 TilePriority priority = tile->priority(PENDING_TREE); 2989 TilePriority priority = tile->priority(PENDING_TREE);
2988 2990
2989 if (priority.priority_bin == TilePriority::NOW) { 2991 if (priority.priority_bin == TilePriority::NOW) {
2990 reached_visible = true; 2992 reached_visible = true;
2991 last_tile = tile; 2993 last_tile = tile;
2992 break; 2994 break;
2993 } 2995 }
2994 2996
2995 EXPECT_FALSE(tile->required_for_activation()); 2997 EXPECT_FALSE(tile->required_for_activation());
2996 2998
2997 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) > 2999 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) >
2998 std::numeric_limits<float>::epsilon()) { 3000 std::numeric_limits<float>::epsilon()) {
2999 ++scale_index; 3001 ++scale_index;
3000 ASSERT_LT(scale_index, arraysize(expected_scales)); 3002 ASSERT_LT(scale_index, arraysize(expected_scales));
3001 } 3003 }
3002 3004
3003 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]); 3005 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
3004 unique_tiles.insert(tile); 3006 unique_tiles.insert(tile);
3005 3007
3006 // If the tile is the same rough bin as last tile (same activation, bin, and
3007 // scale), then distance should be decreasing.
3008 if (tile->required_for_activation() == 3008 if (tile->required_for_activation() ==
3009 last_tile->required_for_activation() && 3009 last_tile->required_for_activation() &&
3010 priority.priority_bin == 3010 priority.priority_bin ==
3011 last_tile->priority(PENDING_TREE).priority_bin && 3011 last_tile->priority(PENDING_TREE).priority_bin &&
3012 std::abs(tile->contents_scale() - last_tile->contents_scale()) < 3012 std::abs(tile->contents_scale() - last_tile->contents_scale()) <
3013 std::numeric_limits<float>::epsilon()) { 3013 std::numeric_limits<float>::epsilon()) {
3014 EXPECT_LE(priority.distance_to_visible, 3014 if (priority.distance_to_visible <=
3015 last_tile->priority(PENDING_TREE).distance_to_visible); 3015 last_tile->priority(PENDING_TREE).distance_to_visible)
3016 ++distance_decreasing;
3017 else
3018 ++distance_increasing;
3016 } 3019 }
3017 3020
3018 last_tile = tile; 3021 last_tile = tile;
3019 queue->Pop(); 3022 queue->Pop();
3020 } 3023 }
3021 3024
3025 EXPECT_EQ(7, distance_increasing);
3026 EXPECT_EQ(55, distance_decreasing);
3027
3022 EXPECT_TRUE(reached_visible); 3028 EXPECT_TRUE(reached_visible);
3023 EXPECT_EQ(65u, unique_tiles.size()); 3029 EXPECT_EQ(65u, unique_tiles.size());
3024 3030
3025 scale_index = 0; 3031 scale_index = 0;
3026 bool reached_required = false; 3032 bool reached_required = false;
3027 while (!queue->IsEmpty()) { 3033 while (!queue->IsEmpty()) {
3028 Tile* tile = queue->Top(); 3034 Tile* tile = queue->Top();
3029 EXPECT_TRUE(tile); 3035 EXPECT_TRUE(tile);
3030 3036
3031 TilePriority priority = tile->priority(PENDING_TREE); 3037 TilePriority priority = tile->priority(PENDING_TREE);
(...skipping 789 matching lines...) Expand 10 before | Expand all | Expand 10 after
3821 class OcclusionTrackingSettings : public LowResTilingsSettings { 3827 class OcclusionTrackingSettings : public LowResTilingsSettings {
3822 public: 3828 public:
3823 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; } 3829 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; }
3824 }; 3830 };
3825 3831
3826 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest { 3832 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
3827 public: 3833 public:
3828 OcclusionTrackingPictureLayerImplTest() 3834 OcclusionTrackingPictureLayerImplTest()
3829 : PictureLayerImplTest(OcclusionTrackingSettings()) {} 3835 : PictureLayerImplTest(OcclusionTrackingSettings()) {}
3830 3836
3831 void VerifyEvictionConsidersOcclusion( 3837 void VerifyEvictionConsidersOcclusion(FakePictureLayerImpl* layer,
3832 PictureLayerImpl* layer, 3838 FakePictureLayerImpl* twin_layer,
3833 size_t expected_occluded_tile_count[NUM_TREE_PRIORITIES]) { 3839 WhichTree tree,
3840 size_t expected_occluded_tile_count) {
3841 twin_layer->set_has_valid_tile_priorities(false);
3834 for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES; 3842 for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES;
3835 ++priority_count) { 3843 ++priority_count) {
3836 TreePriority tree_priority = static_cast<TreePriority>(priority_count); 3844 TreePriority tree_priority = static_cast<TreePriority>(priority_count);
3837 size_t occluded_tile_count = 0u; 3845 size_t occluded_tile_count = 0u;
3838 Tile* last_tile = nullptr; 3846 Tile* last_tile = nullptr;
3847 std::set<Tile*> shared_tiles;
3839 3848
3840 scoped_ptr<TilingSetEvictionQueue> queue = 3849 scoped_ptr<TilingSetEvictionQueue> queue =
3841 layer->CreateEvictionQueue(tree_priority); 3850 layer->CreateEvictionQueue(tree_priority);
3842 while (!queue->IsEmpty()) { 3851 while (!queue->IsEmpty()) {
3843 Tile* tile = queue->Top(); 3852 Tile* tile = queue->Top();
3844 if (!last_tile) 3853 if (!last_tile)
3845 last_tile = tile; 3854 last_tile = tile;
3855 if (tile->is_shared())
3856 EXPECT_TRUE(shared_tiles.insert(tile).second);
3846 3857
3847 // The only way we will encounter an occluded tile after an unoccluded 3858 // The only way we will encounter an occluded tile after an unoccluded
3848 // tile is if the priorty bin decreased, the tile is required for 3859 // tile is if the priorty bin decreased, the tile is required for
3849 // activation, or the scale changed. 3860 // activation, or the scale changed.
3850 bool tile_is_occluded = 3861 bool tile_is_occluded = tile->is_occluded(tree);
3851 tile->is_occluded_for_tree_priority(tree_priority);
3852 if (tile_is_occluded) { 3862 if (tile_is_occluded) {
3853 occluded_tile_count++; 3863 occluded_tile_count++;
3854 3864
3855 bool last_tile_is_occluded = 3865 bool last_tile_is_occluded = last_tile->is_occluded(tree);
3856 last_tile->is_occluded_for_tree_priority(tree_priority);
3857 if (!last_tile_is_occluded) { 3866 if (!last_tile_is_occluded) {
3858 TilePriority::PriorityBin tile_priority_bin = 3867 TilePriority::PriorityBin tile_priority_bin =
3859 tile->priority_for_tree_priority(tree_priority).priority_bin; 3868 tile->priority(tree).priority_bin;
3860 TilePriority::PriorityBin last_tile_priority_bin = 3869 TilePriority::PriorityBin last_tile_priority_bin =
3861 last_tile->priority_for_tree_priority(tree_priority) 3870 last_tile->priority(tree).priority_bin;
3862 .priority_bin;
3863 3871
3864 EXPECT_TRUE( 3872 EXPECT_TRUE(
3865 (tile_priority_bin < last_tile_priority_bin) || 3873 (tile_priority_bin < last_tile_priority_bin) ||
3866 tile->required_for_activation() || 3874 tile->required_for_activation() ||
3867 (tile->contents_scale() != last_tile->contents_scale())); 3875 (tile->contents_scale() != last_tile->contents_scale()));
3868 } 3876 }
3869 } 3877 }
3870 last_tile = tile; 3878 last_tile = tile;
3871 queue->Pop(); 3879 queue->Pop();
3872 } 3880 }
3873 EXPECT_EQ(expected_occluded_tile_count[priority_count], 3881 queue = twin_layer->CreateEvictionQueue(tree_priority);
3874 occluded_tile_count); 3882 while (!queue->IsEmpty()) {
3883 Tile* tile = queue->Top();
3884 if (tile->is_shared()) {
3885 EXPECT_TRUE(shared_tiles.insert(tile).second);
3886 if (tile->is_occluded(tree))
vmpstr 2014/12/09 02:10:58 This should happen outside of the if (is shared) b
USE eero AT chromium.org 2014/12/09 18:44:14 No, it should not. The purpose of this second whil
vmpstr 2014/12/10 18:01:15 I think that makes sense, thanks for the explanati
USE eero AT chromium.org 2014/12/11 15:21:59 Done.
3887 ++occluded_tile_count;
3888 }
3889 queue->Pop();
3890 }
3891 EXPECT_EQ(expected_occluded_tile_count, occluded_tile_count);
3875 } 3892 }
3893 twin_layer->set_has_valid_tile_priorities(true);
3876 } 3894 }
3877 }; 3895 };
3878 3896
3879 TEST_F(OcclusionTrackingPictureLayerImplTest, 3897 TEST_F(OcclusionTrackingPictureLayerImplTest,
3880 OccludedTilesSkippedDuringRasterization) { 3898 OccludedTilesSkippedDuringRasterization) {
3881 base::TimeTicks time_ticks; 3899 base::TimeTicks time_ticks;
3882 time_ticks += base::TimeDelta::FromMilliseconds(1); 3900 time_ticks += base::TimeDelta::FromMilliseconds(1);
3883 host_impl_.SetCurrentBeginFrameArgs( 3901 host_impl_.SetCurrentBeginFrameArgs(
3884 CreateBeginFrameArgsForTesting(time_ticks)); 3902 CreateBeginFrameArgsForTesting(time_ticks));
3885 3903
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
4338 host_impl_.SetViewportSize(viewport_size); 4356 host_impl_.SetViewportSize(viewport_size);
4339 host_impl_.active_tree()->UpdateDrawProperties(); 4357 host_impl_.active_tree()->UpdateDrawProperties();
4340 host_impl_.pending_tree()->UpdateDrawProperties(); 4358 host_impl_.pending_tree()->UpdateDrawProperties();
4341 4359
4342 // The expected number of occluded tiles on each of the 5 tilings for each of 4360 // The expected number of occluded tiles on each of the 5 tilings for each of
4343 // the 3 tree priorities. 4361 // the 3 tree priorities.
4344 size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u}; 4362 size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u};
4345 size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u}; 4363 size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u};
4346 size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u}; 4364 size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u};
4347 4365
4348 // The total expected number of occluded tiles on all tilings for each of the 4366 size_t total_expected_occluded_tile_count_on_trees[] = {43u, 43u};
4349 // 3 tree priorities.
4350 size_t total_expected_occluded_tile_count[] = {13u, 43u, 43u};
4351
4352 ASSERT_EQ(arraysize(total_expected_occluded_tile_count), NUM_TREE_PRIORITIES);
4353 4367
4354 // Verify number of occluded tiles on the pending layer for each tiling. 4368 // Verify number of occluded tiles on the pending layer for each tiling.
4355 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { 4369 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
4356 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); 4370 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
4357 tiling->CreateAllTilesForTesting(); 4371 tiling->CreateAllTilesForTesting();
4358 tiling->UpdateAllTilePrioritiesForTesting(); 4372 tiling->UpdateAllTilePrioritiesForTesting();
4359 4373
4360 size_t occluded_tile_count_on_pending = 0u; 4374 size_t occluded_tile_count_on_pending = 0u;
4361 size_t occluded_tile_count_on_active = 0u; 4375 size_t occluded_tile_count_on_active = 0u;
4362 size_t occluded_tile_count_on_both = 0u; 4376 size_t occluded_tile_count_on_both = 0u;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4425 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator = 4439 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
4426 tilings.begin(); 4440 tilings.begin();
4427 tiling_iterator != tilings.end(); 4441 tiling_iterator != tilings.end();
4428 ++tiling_iterator) { 4442 ++tiling_iterator) {
4429 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting(); 4443 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
4430 std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles)); 4444 std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles));
4431 } 4445 }
4432 4446
4433 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 4447 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
4434 4448
4435 VerifyEvictionConsidersOcclusion(pending_layer_, 4449 VerifyEvictionConsidersOcclusion(
4436 total_expected_occluded_tile_count); 4450 pending_layer_, active_layer_, PENDING_TREE,
4437 VerifyEvictionConsidersOcclusion(active_layer_, 4451 total_expected_occluded_tile_count_on_trees[PENDING_TREE]);
4438 total_expected_occluded_tile_count); 4452 VerifyEvictionConsidersOcclusion(
4453 active_layer_, pending_layer_, ACTIVE_TREE,
4454 total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]);
4439 } 4455 }
4440 4456
4441 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) { 4457 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) {
4442 gfx::Size tile_size(102, 102); 4458 gfx::Size tile_size(102, 102);
4443 gfx::Size layer_bounds(1000, 1000); 4459 gfx::Size layer_bounds(1000, 1000);
4444 4460
4445 scoped_refptr<FakePicturePileImpl> pile = 4461 scoped_refptr<FakePicturePileImpl> pile =
4446 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); 4462 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4447 SetupPendingTree(pile); 4463 SetupPendingTree(pile);
4448 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer()); 4464 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer());
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
4735 result = layer->CalculateTileSize(gfx::Size(447, 400)); 4751 result = layer->CalculateTileSize(gfx::Size(447, 400));
4736 EXPECT_EQ(result.width(), 448); 4752 EXPECT_EQ(result.width(), 448);
4737 EXPECT_EQ(result.height(), 448); 4753 EXPECT_EQ(result.height(), 448);
4738 result = layer->CalculateTileSize(gfx::Size(500, 499)); 4754 result = layer->CalculateTileSize(gfx::Size(500, 499));
4739 EXPECT_EQ(result.width(), 512); 4755 EXPECT_EQ(result.width(), 512);
4740 EXPECT_EQ(result.height(), 500 + 2); 4756 EXPECT_EQ(result.height(), 500 + 2);
4741 } 4757 }
4742 4758
4743 } // namespace 4759 } // namespace
4744 } // namespace cc 4760 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698