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

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 2892 matching lines...) Expand 10 before | Expand all | Expand 10 after
2903 pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES); 2903 pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
2904 EXPECT_TRUE(queue->IsEmpty()); 2904 EXPECT_TRUE(queue->IsEmpty());
2905 2905
2906 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 2906 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
2907 2907
2908 std::set<Tile*> unique_tiles; 2908 std::set<Tile*> unique_tiles;
2909 float expected_scales[] = {low_res_factor, 1.f}; 2909 float expected_scales[] = {low_res_factor, 1.f};
2910 size_t scale_index = 0; 2910 size_t scale_index = 0;
2911 bool reached_visible = false; 2911 bool reached_visible = false;
2912 Tile* last_tile = nullptr; 2912 Tile* last_tile = nullptr;
2913 size_t distance_decreasing = 0;
2914 size_t distance_increasing = 0;
2913 queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES); 2915 queue = pending_layer_->CreateEvictionQueue(SAME_PRIORITY_FOR_BOTH_TREES);
2914 while (!queue->IsEmpty()) { 2916 while (!queue->IsEmpty()) {
2915 Tile* tile = queue->Top(); 2917 Tile* tile = queue->Top();
2916 if (!last_tile) 2918 if (!last_tile)
2917 last_tile = tile; 2919 last_tile = tile;
2918 2920
2919 EXPECT_TRUE(tile); 2921 EXPECT_TRUE(tile);
2920 2922
2921 TilePriority priority = tile->priority(PENDING_TREE); 2923 TilePriority priority = tile->priority(PENDING_TREE);
2922 2924
2923 if (priority.priority_bin == TilePriority::NOW) { 2925 if (priority.priority_bin == TilePriority::NOW) {
2924 reached_visible = true; 2926 reached_visible = true;
2925 last_tile = tile; 2927 last_tile = tile;
2926 break; 2928 break;
2927 } 2929 }
2928 2930
2929 EXPECT_FALSE(tile->required_for_activation()); 2931 EXPECT_FALSE(tile->required_for_activation());
2930 2932
2931 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) > 2933 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) >
2932 std::numeric_limits<float>::epsilon()) { 2934 std::numeric_limits<float>::epsilon()) {
2933 ++scale_index; 2935 ++scale_index;
2934 ASSERT_LT(scale_index, arraysize(expected_scales)); 2936 ASSERT_LT(scale_index, arraysize(expected_scales));
2935 } 2937 }
2936 2938
2937 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]); 2939 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
2938 unique_tiles.insert(tile); 2940 unique_tiles.insert(tile);
2939 2941
2940 // If the tile is the same rough bin as last tile (same activation, bin, and
2941 // scale), then distance should be decreasing.
2942 if (tile->required_for_activation() == 2942 if (tile->required_for_activation() ==
2943 last_tile->required_for_activation() && 2943 last_tile->required_for_activation() &&
2944 priority.priority_bin == 2944 priority.priority_bin ==
2945 last_tile->priority(PENDING_TREE).priority_bin && 2945 last_tile->priority(PENDING_TREE).priority_bin &&
2946 std::abs(tile->contents_scale() - last_tile->contents_scale()) < 2946 std::abs(tile->contents_scale() - last_tile->contents_scale()) <
2947 std::numeric_limits<float>::epsilon()) { 2947 std::numeric_limits<float>::epsilon()) {
2948 EXPECT_LE(priority.distance_to_visible, 2948 if (priority.distance_to_visible <=
2949 last_tile->priority(PENDING_TREE).distance_to_visible); 2949 last_tile->priority(PENDING_TREE).distance_to_visible)
2950 ++distance_decreasing;
2951 else
2952 ++distance_increasing;
2950 } 2953 }
2951 2954
2952 last_tile = tile; 2955 last_tile = tile;
2953 queue->Pop(); 2956 queue->Pop();
2954 } 2957 }
2955 2958
2956 // 4 high res tiles are inside the viewport, the rest are evicted. 2959 // 4 high res tiles are inside the viewport, the rest are evicted.
2957 EXPECT_TRUE(reached_visible); 2960 EXPECT_TRUE(reached_visible);
2958 EXPECT_EQ(12u, unique_tiles.size()); 2961 EXPECT_EQ(12u, unique_tiles.size());
2962 EXPECT_EQ(1u, distance_increasing);
2963 EXPECT_EQ(11u, distance_decreasing);
2959 2964
2960 scale_index = 0; 2965 scale_index = 0;
2961 bool reached_required = false; 2966 bool reached_required = false;
2962 while (!queue->IsEmpty()) { 2967 while (!queue->IsEmpty()) {
2963 Tile* tile = queue->Top(); 2968 Tile* tile = queue->Top();
2964 EXPECT_TRUE(tile); 2969 EXPECT_TRUE(tile);
2965 2970
2966 TilePriority priority = tile->priority(PENDING_TREE); 2971 TilePriority priority = tile->priority(PENDING_TREE);
2967 EXPECT_EQ(TilePriority::NOW, priority.priority_bin); 2972 EXPECT_EQ(TilePriority::NOW, priority.priority_bin);
2968 2973
(...skipping 736 matching lines...) Expand 10 before | Expand all | Expand 10 after
3705 class OcclusionTrackingSettings : public LowResTilingsSettings { 3710 class OcclusionTrackingSettings : public LowResTilingsSettings {
3706 public: 3711 public:
3707 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; } 3712 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; }
3708 }; 3713 };
3709 3714
3710 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest { 3715 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
3711 public: 3716 public:
3712 OcclusionTrackingPictureLayerImplTest() 3717 OcclusionTrackingPictureLayerImplTest()
3713 : PictureLayerImplTest(OcclusionTrackingSettings()) {} 3718 : PictureLayerImplTest(OcclusionTrackingSettings()) {}
3714 3719
3715 void VerifyEvictionConsidersOcclusion( 3720 void VerifyEvictionConsidersOcclusion(FakePictureLayerImpl* layer,
3716 PictureLayerImpl* layer, 3721 FakePictureLayerImpl* twin_layer,
3717 size_t expected_occluded_tile_count[NUM_TREE_PRIORITIES]) { 3722 WhichTree tree,
3723 size_t expected_occluded_tile_count) {
3724 WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE;
3718 for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES; 3725 for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES;
3719 ++priority_count) { 3726 ++priority_count) {
3720 TreePriority tree_priority = static_cast<TreePriority>(priority_count); 3727 TreePriority tree_priority = static_cast<TreePriority>(priority_count);
3721 size_t occluded_tile_count = 0u; 3728 size_t occluded_tile_count = 0u;
3722 Tile* last_tile = nullptr; 3729 Tile* last_tile = nullptr;
3730 std::set<Tile*> shared_tiles;
3723 3731
3724 scoped_ptr<TilingSetEvictionQueue> queue = 3732 scoped_ptr<TilingSetEvictionQueue> queue =
3725 layer->CreateEvictionQueue(tree_priority); 3733 layer->CreateEvictionQueue(tree_priority);
3726 while (!queue->IsEmpty()) { 3734 while (!queue->IsEmpty()) {
3727 Tile* tile = queue->Top(); 3735 Tile* tile = queue->Top();
3728 if (!last_tile) 3736 if (!last_tile)
3729 last_tile = tile; 3737 last_tile = tile;
3738 if (tile->is_shared())
3739 EXPECT_TRUE(shared_tiles.insert(tile).second);
3730 3740
3731 // The only way we will encounter an occluded tile after an unoccluded 3741 // The only way we will encounter an occluded tile after an unoccluded
3732 // tile is if the priorty bin decreased, the tile is required for 3742 // tile is if the priorty bin decreased, the tile is required for
3733 // activation, or the scale changed. 3743 // activation, or the scale changed.
3734 bool tile_is_occluded = 3744 bool tile_is_occluded = tile->is_occluded(tree);
3735 tile->is_occluded_for_tree_priority(tree_priority);
3736 if (tile_is_occluded) { 3745 if (tile_is_occluded) {
3737 occluded_tile_count++; 3746 occluded_tile_count++;
3738 3747
3739 bool last_tile_is_occluded = 3748 bool last_tile_is_occluded = last_tile->is_occluded(tree);
3740 last_tile->is_occluded_for_tree_priority(tree_priority);
3741 if (!last_tile_is_occluded) { 3749 if (!last_tile_is_occluded) {
3742 TilePriority::PriorityBin tile_priority_bin = 3750 TilePriority::PriorityBin tile_priority_bin =
3743 tile->priority_for_tree_priority(tree_priority).priority_bin; 3751 tile->priority(tree).priority_bin;
3744 TilePriority::PriorityBin last_tile_priority_bin = 3752 TilePriority::PriorityBin last_tile_priority_bin =
3745 last_tile->priority_for_tree_priority(tree_priority) 3753 last_tile->priority(tree).priority_bin;
3746 .priority_bin;
3747 3754
3748 EXPECT_TRUE( 3755 EXPECT_TRUE(
3749 (tile_priority_bin < last_tile_priority_bin) || 3756 (tile_priority_bin < last_tile_priority_bin) ||
3750 tile->required_for_activation() || 3757 tile->required_for_activation() ||
3751 (tile->contents_scale() != last_tile->contents_scale())); 3758 (tile->contents_scale() != last_tile->contents_scale()));
3752 } 3759 }
3753 } 3760 }
3754 last_tile = tile; 3761 last_tile = tile;
3755 queue->Pop(); 3762 queue->Pop();
3756 } 3763 }
3757 EXPECT_EQ(expected_occluded_tile_count[priority_count], 3764 // Count also shared tiles which are occluded in the tree but which were
3758 occluded_tile_count); 3765 // not returned by the tiling set eviction queue. Those shared tiles
3766 // shall be returned by the twin tiling set eviction queue.
3767 queue = twin_layer->CreateEvictionQueue(tree_priority);
3768 while (!queue->IsEmpty()) {
3769 Tile* tile = queue->Top();
3770 if (tile->is_shared()) {
3771 EXPECT_TRUE(shared_tiles.insert(tile).second);
3772 if (tile->is_occluded(tree))
3773 ++occluded_tile_count;
3774 // Check the reasons why the shared tile was not returned by
3775 // the first tiling set eviction queue.
3776 switch (tree_priority) {
3777 case SAME_PRIORITY_FOR_BOTH_TREES: {
3778 const TilePriority& priority = tile->priority(tree);
3779 const TilePriority& priority_for_tree_priority =
3780 tile->priority_for_tree_priority(tree_priority);
3781 const TilePriority& twin_priority = tile->priority(twin_tree);
3782 // Check if the shared tile was not returned by the first tiling
3783 // set eviction queue because it was out of order for the first
3784 // tiling set eviction queue but not for the twin tiling set
3785 // eviction queue.
3786 if (priority.priority_bin != twin_priority.priority_bin) {
3787 EXPECT_LT(priority_for_tree_priority.priority_bin,
3788 priority.priority_bin);
3789 EXPECT_EQ(priority_for_tree_priority.priority_bin,
3790 twin_priority.priority_bin);
3791 EXPECT_TRUE(priority_for_tree_priority.priority_bin <
3792 priority.priority_bin);
3793 } else if (tile->is_occluded(tree) !=
3794 tile->is_occluded(twin_tree)) {
3795 EXPECT_TRUE(tile->is_occluded(tree));
3796 EXPECT_FALSE(tile->is_occluded(twin_tree));
3797 EXPECT_FALSE(
3798 tile->is_occluded_for_tree_priority(tree_priority));
3799 } else if (priority.distance_to_visible !=
3800 twin_priority.distance_to_visible) {
3801 EXPECT_LT(priority_for_tree_priority.distance_to_visible,
3802 priority.distance_to_visible);
3803 EXPECT_EQ(priority_for_tree_priority.distance_to_visible,
3804 twin_priority.distance_to_visible);
3805 EXPECT_TRUE(priority_for_tree_priority.distance_to_visible <
3806 priority.distance_to_visible);
3807 } else {
3808 // Shared tiles having the same active and pending priorities
3809 // should be returned only by a pending tree eviction queue.
3810 EXPECT_EQ(ACTIVE_TREE, tree);
3811 }
3812 break;
3813 }
3814 case SMOOTHNESS_TAKES_PRIORITY:
3815 // Shared tiles should be returned only by an active tree
3816 // eviction queue.
3817 EXPECT_EQ(PENDING_TREE, tree);
3818 break;
3819 case NEW_CONTENT_TAKES_PRIORITY:
3820 // Shared tiles should be returned only by a pending tree
3821 // eviction queue.
3822 EXPECT_EQ(ACTIVE_TREE, tree);
3823 break;
3824 case NUM_TREE_PRIORITIES:
3825 NOTREACHED();
3826 break;
3827 }
3828 }
3829 queue->Pop();
3830 }
3831 EXPECT_EQ(expected_occluded_tile_count, occluded_tile_count);
3759 } 3832 }
3760 } 3833 }
3761 }; 3834 };
3762 3835
3763 TEST_F(OcclusionTrackingPictureLayerImplTest, 3836 TEST_F(OcclusionTrackingPictureLayerImplTest,
3764 OccludedTilesSkippedDuringRasterization) { 3837 OccludedTilesSkippedDuringRasterization) {
3765 base::TimeTicks time_ticks; 3838 base::TimeTicks time_ticks;
3766 time_ticks += base::TimeDelta::FromMilliseconds(1); 3839 time_ticks += base::TimeDelta::FromMilliseconds(1);
3767 host_impl_.SetCurrentBeginFrameArgs( 3840 host_impl_.SetCurrentBeginFrameArgs(
3768 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); 3841 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
4220 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks)); 4293 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
4221 // UpdateDrawProperties with the occluding layer. 4294 // UpdateDrawProperties with the occluding layer.
4222 host_impl_.pending_tree()->UpdateDrawProperties(); 4295 host_impl_.pending_tree()->UpdateDrawProperties();
4223 4296
4224 // The expected number of occluded tiles on each of the 2 tilings for each of 4297 // The expected number of occluded tiles on each of the 2 tilings for each of
4225 // the 3 tree priorities. 4298 // the 3 tree priorities.
4226 size_t expected_occluded_tile_count_on_both[] = {9u, 1u}; 4299 size_t expected_occluded_tile_count_on_both[] = {9u, 1u};
4227 size_t expected_occluded_tile_count_on_active[] = {30u, 3u}; 4300 size_t expected_occluded_tile_count_on_active[] = {30u, 3u};
4228 size_t expected_occluded_tile_count_on_pending[] = {30u, 3u}; 4301 size_t expected_occluded_tile_count_on_pending[] = {30u, 3u};
4229 4302
4230 // The total expected number of occluded tiles on all tilings for each of the 4303 size_t total_expected_occluded_tile_count_on_trees[] = {33u, 33u};
4231 // 3 tree priorities.
4232 size_t total_expected_occluded_tile_count[] = {10u, 33u, 33u};
4233
4234 ASSERT_EQ(arraysize(total_expected_occluded_tile_count), NUM_TREE_PRIORITIES);
4235 4304
4236 // Verify number of occluded tiles on the pending layer for each tiling. 4305 // Verify number of occluded tiles on the pending layer for each tiling.
4237 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { 4306 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
4238 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); 4307 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
4239 tiling->UpdateAllTilePrioritiesForTesting(); 4308 tiling->UpdateAllTilePrioritiesForTesting();
4240 4309
4241 size_t occluded_tile_count_on_pending = 0u; 4310 size_t occluded_tile_count_on_pending = 0u;
4242 size_t occluded_tile_count_on_active = 0u; 4311 size_t occluded_tile_count_on_active = 0u;
4243 size_t occluded_tile_count_on_both = 0u; 4312 size_t occluded_tile_count_on_both = 0u;
4244 for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f, 4313 for (PictureLayerTiling::CoverageIterator iter(tiling, 1.f,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
4304 4373
4305 std::vector<Tile*> all_tiles; 4374 std::vector<Tile*> all_tiles;
4306 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { 4375 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
4307 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); 4376 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
4308 std::vector<Tile*> tiles = tiling->AllTilesForTesting(); 4377 std::vector<Tile*> tiles = tiling->AllTilesForTesting();
4309 all_tiles.insert(all_tiles.end(), tiles.begin(), tiles.end()); 4378 all_tiles.insert(all_tiles.end(), tiles.begin(), tiles.end());
4310 } 4379 }
4311 4380
4312 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 4381 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
4313 4382
4314 VerifyEvictionConsidersOcclusion(pending_layer_, 4383 VerifyEvictionConsidersOcclusion(
4315 total_expected_occluded_tile_count); 4384 pending_layer_, active_layer_, PENDING_TREE,
4316 VerifyEvictionConsidersOcclusion(active_layer_, 4385 total_expected_occluded_tile_count_on_trees[PENDING_TREE]);
4317 total_expected_occluded_tile_count); 4386 VerifyEvictionConsidersOcclusion(
4387 active_layer_, pending_layer_, ACTIVE_TREE,
4388 total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]);
4389
4390 // Repeat the tests without valid active tree priorities.
4391 active_layer_->set_has_valid_tile_priorities(false);
4392 VerifyEvictionConsidersOcclusion(
4393 pending_layer_, active_layer_, PENDING_TREE,
4394 total_expected_occluded_tile_count_on_trees[PENDING_TREE]);
4395 VerifyEvictionConsidersOcclusion(
4396 active_layer_, pending_layer_, ACTIVE_TREE, 0u);
4397 active_layer_->set_has_valid_tile_priorities(true);
4398
4399 // Repeat the tests without valid pending tree priorities.
4400 pending_layer_->set_has_valid_tile_priorities(false);
4401 VerifyEvictionConsidersOcclusion(
4402 active_layer_, pending_layer_, ACTIVE_TREE,
4403 total_expected_occluded_tile_count_on_trees[ACTIVE_TREE]);
4404 VerifyEvictionConsidersOcclusion(
4405 pending_layer_, active_layer_, PENDING_TREE, 0u);
4406 pending_layer_->set_has_valid_tile_priorities(true);
4318 } 4407 }
4319 4408
4320 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) { 4409 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) {
4321 gfx::Size tile_size(102, 102); 4410 gfx::Size tile_size(102, 102);
4322 gfx::Size layer_bounds(1000, 1000); 4411 gfx::Size layer_bounds(1000, 1000);
4323 4412
4324 scoped_refptr<FakePicturePileImpl> pile = 4413 scoped_refptr<FakePicturePileImpl> pile =
4325 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); 4414 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4326 SetupPendingTree(pile); 4415 SetupPendingTree(pile);
4327 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer()); 4416 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer());
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
4608 result = layer->CalculateTileSize(gfx::Size(447, 400)); 4697 result = layer->CalculateTileSize(gfx::Size(447, 400));
4609 EXPECT_EQ(result.width(), 448); 4698 EXPECT_EQ(result.width(), 448);
4610 EXPECT_EQ(result.height(), 448); 4699 EXPECT_EQ(result.height(), 448);
4611 result = layer->CalculateTileSize(gfx::Size(500, 499)); 4700 result = layer->CalculateTileSize(gfx::Size(500, 499));
4612 EXPECT_EQ(result.width(), 512); 4701 EXPECT_EQ(result.width(), 512);
4613 EXPECT_EQ(result.height(), 500 + 2); 4702 EXPECT_EQ(result.height(), 500 + 2);
4614 } 4703 }
4615 4704
4616 } // namespace 4705 } // namespace
4617 } // namespace cc 4706 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698