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

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

Issue 644313002: cc: Use reverse spiral iterator in tiling eviction. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 6 years, 1 month 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 2893 matching lines...) Expand 10 before | Expand all | Expand 10 after
2904 EXPECT_EQ(91u, all_tiles.size()); 2904 EXPECT_EQ(91u, all_tiles.size());
2905 EXPECT_EQ(91u, all_tiles_set.size()); 2905 EXPECT_EQ(91u, all_tiles_set.size());
2906 EXPECT_GT(number_of_marked_tiles, 1u); 2906 EXPECT_GT(number_of_marked_tiles, 1u);
2907 EXPECT_GT(number_of_unmarked_tiles, 1u); 2907 EXPECT_GT(number_of_unmarked_tiles, 1u);
2908 2908
2909 // Empty iterator. 2909 // Empty iterator.
2910 PictureLayerImpl::LayerEvictionTileIterator it; 2910 PictureLayerImpl::LayerEvictionTileIterator it;
2911 EXPECT_FALSE(it); 2911 EXPECT_FALSE(it);
2912 2912
2913 // Tiles don't have resources yet. 2913 // Tiles don't have resources yet.
2914 it = PictureLayerImpl::LayerEvictionTileIterator( 2914 it = PictureLayerImpl::LayerEvictionTileIterator(pending_layer_);
2915 pending_layer_, SAME_PRIORITY_FOR_BOTH_TREES);
2916 EXPECT_FALSE(it); 2915 EXPECT_FALSE(it);
2917 2916
2918 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 2917 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
2919 2918
2920 std::set<Tile*> unique_tiles; 2919 std::set<Tile*> unique_tiles;
2921 float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f}; 2920 float expected_scales[] = {2.0f, 0.3f, 0.7f, low_res_factor, 1.0f};
2922 size_t scale_index = 0; 2921 size_t scale_index = 0;
2923 bool reached_visible = false; 2922 bool reached_visible = false;
2924 Tile* last_tile = nullptr; 2923 Tile* last_tile = nullptr;
2925 for (it = PictureLayerImpl::LayerEvictionTileIterator( 2924 int distance_decreasing = 0;
2926 pending_layer_, SAME_PRIORITY_FOR_BOTH_TREES); 2925 int distance_increasing = 0;
2927 it; 2926 for (it = PictureLayerImpl::LayerEvictionTileIterator(pending_layer_); it;
2928 ++it) { 2927 ++it) {
2929 Tile* tile = *it; 2928 Tile* tile = *it;
2930 if (!last_tile) 2929 if (!last_tile)
2931 last_tile = tile; 2930 last_tile = tile;
2932 2931
2933 EXPECT_TRUE(tile); 2932 EXPECT_TRUE(tile);
2934 2933
2935 TilePriority priority = tile->priority(PENDING_TREE); 2934 TilePriority priority = tile->priority(PENDING_TREE);
2936 2935
2937 if (priority.priority_bin == TilePriority::NOW) { 2936 if (priority.priority_bin == TilePriority::NOW) {
2938 reached_visible = true; 2937 reached_visible = true;
2939 last_tile = tile; 2938 last_tile = tile;
2940 break; 2939 break;
2941 } 2940 }
2942 2941
2943 EXPECT_FALSE(tile->required_for_activation()); 2942 EXPECT_FALSE(tile->required_for_activation());
2944 2943
2945 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) > 2944 while (std::abs(tile->contents_scale() - expected_scales[scale_index]) >
2946 std::numeric_limits<float>::epsilon()) { 2945 std::numeric_limits<float>::epsilon()) {
2947 ++scale_index; 2946 ++scale_index;
2948 ASSERT_LT(scale_index, arraysize(expected_scales)); 2947 ASSERT_LT(scale_index, arraysize(expected_scales));
2949 } 2948 }
2950 2949
2951 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]); 2950 EXPECT_FLOAT_EQ(tile->contents_scale(), expected_scales[scale_index]);
2952 unique_tiles.insert(tile); 2951 unique_tiles.insert(tile);
2953 2952
2954 // If the tile is the same rough bin as last tile (same activation, bin, and
2955 // scale), then distance should be decreasing.
2956 if (tile->required_for_activation() == 2953 if (tile->required_for_activation() ==
2957 last_tile->required_for_activation() && 2954 last_tile->required_for_activation() &&
2958 priority.priority_bin == 2955 priority.priority_bin ==
2959 last_tile->priority(PENDING_TREE).priority_bin && 2956 last_tile->priority(PENDING_TREE).priority_bin &&
2960 std::abs(tile->contents_scale() - last_tile->contents_scale()) < 2957 std::abs(tile->contents_scale() - last_tile->contents_scale()) <
2961 std::numeric_limits<float>::epsilon()) { 2958 std::numeric_limits<float>::epsilon()) {
2962 EXPECT_LE(priority.distance_to_visible, 2959 if (priority.distance_to_visible <=
2963 last_tile->priority(PENDING_TREE).distance_to_visible); 2960 last_tile->priority(PENDING_TREE).distance_to_visible) {
2961 ++distance_decreasing;
2962 } else {
2963 ++distance_increasing;
2964 }
2964 } 2965 }
2965 2966
2966 last_tile = tile; 2967 last_tile = tile;
2967 } 2968 }
2968 2969
2970 EXPECT_EQ(7, distance_increasing);
2971 EXPECT_EQ(55, distance_decreasing);
2972
2969 EXPECT_TRUE(reached_visible); 2973 EXPECT_TRUE(reached_visible);
2970 EXPECT_EQ(65u, unique_tiles.size()); 2974 EXPECT_EQ(65u, unique_tiles.size());
2971 2975
2972 scale_index = 0; 2976 scale_index = 0;
2973 bool reached_required = false; 2977 bool reached_required = false;
2974 for (; it; ++it) { 2978 for (; it; ++it) {
2975 Tile* tile = *it; 2979 Tile* tile = *it;
2976 EXPECT_TRUE(tile); 2980 EXPECT_TRUE(tile);
2977 2981
2978 TilePriority priority = tile->priority(PENDING_TREE); 2982 TilePriority priority = tile->priority(PENDING_TREE);
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after
3766 class OcclusionTrackingSettings : public LowResTilingsSettings { 3770 class OcclusionTrackingSettings : public LowResTilingsSettings {
3767 public: 3771 public:
3768 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; } 3772 OcclusionTrackingSettings() { use_occlusion_for_tile_prioritization = true; }
3769 }; 3773 };
3770 3774
3771 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest { 3775 class OcclusionTrackingPictureLayerImplTest : public PictureLayerImplTest {
3772 public: 3776 public:
3773 OcclusionTrackingPictureLayerImplTest() 3777 OcclusionTrackingPictureLayerImplTest()
3774 : PictureLayerImplTest(OcclusionTrackingSettings()) {} 3778 : PictureLayerImplTest(OcclusionTrackingSettings()) {}
3775 3779
3776 void VerifyEvictionConsidersOcclusion( 3780 void VerifyEvictionConsidersOcclusion(PictureLayerImpl* layer,
3777 PictureLayerImpl* layer, 3781 WhichTree tree,
3778 size_t expected_occluded_tile_count[NUM_TREE_PRIORITIES]) { 3782 size_t expected_occluded_tile_count) {
3779 for (int priority_count = 0; priority_count < NUM_TREE_PRIORITIES; 3783 size_t occluded_tile_count = 0u;
3780 ++priority_count) { 3784 Tile* last_tile = nullptr;
3781 TreePriority tree_priority = static_cast<TreePriority>(priority_count);
3782 size_t occluded_tile_count = 0u;
3783 Tile* last_tile = nullptr;
3784 3785
3785 for (PictureLayerImpl::LayerEvictionTileIterator it = 3786 for (PictureLayerImpl::LayerEvictionTileIterator it =
3786 PictureLayerImpl::LayerEvictionTileIterator(layer, 3787 PictureLayerImpl::LayerEvictionTileIterator(layer);
3787 tree_priority); 3788 it;
3788 it; 3789 ++it) {
3789 ++it) { 3790 Tile* tile = *it;
3790 Tile* tile = *it; 3791 if (!last_tile)
3791 if (!last_tile) 3792 last_tile = tile;
3792 last_tile = tile;
3793 3793
3794 // The only way we will encounter an occluded tile after an unoccluded 3794 // The only way we will encounter an occluded tile after an unoccluded
3795 // tile is if the priorty bin decreased, the tile is required for 3795 // tile is if the priorty bin decreased, the tile is required for
3796 // activation, or the scale changed. 3796 // activation, or the scale changed.
3797 bool tile_is_occluded = 3797 bool tile_is_occluded = tile->is_occluded(tree);
3798 tile->is_occluded_for_tree_priority(tree_priority); 3798 if (tile_is_occluded) {
3799 if (tile_is_occluded) { 3799 occluded_tile_count++;
3800 occluded_tile_count++;
3801 3800
3802 bool last_tile_is_occluded = 3801 bool last_tile_is_occluded = last_tile->is_occluded(tree);
3803 last_tile->is_occluded_for_tree_priority(tree_priority); 3802 if (!last_tile_is_occluded) {
3804 if (!last_tile_is_occluded) { 3803 TilePriority::PriorityBin tile_priority_bin =
3805 TilePriority::PriorityBin tile_priority_bin = 3804 tile->priority(tree).priority_bin;
3806 tile->priority_for_tree_priority(tree_priority).priority_bin; 3805 TilePriority::PriorityBin last_tile_priority_bin =
3807 TilePriority::PriorityBin last_tile_priority_bin = 3806 last_tile->priority(tree).priority_bin;
3808 last_tile->priority_for_tree_priority(tree_priority)
3809 .priority_bin;
3810 3807
3811 EXPECT_TRUE( 3808 EXPECT_TRUE((tile_priority_bin < last_tile_priority_bin) ||
3812 (tile_priority_bin < last_tile_priority_bin) || 3809 tile->required_for_activation() ||
3813 tile->required_for_activation() || 3810 (tile->contents_scale() != last_tile->contents_scale()));
3814 (tile->contents_scale() != last_tile->contents_scale()));
3815 }
3816 } 3811 }
3817 last_tile = tile;
3818 } 3812 }
3819 EXPECT_EQ(expected_occluded_tile_count[priority_count], 3813 last_tile = tile;
3820 occluded_tile_count);
3821 } 3814 }
3815 EXPECT_EQ(expected_occluded_tile_count, occluded_tile_count);
3822 } 3816 }
3823 }; 3817 };
3824 3818
3825 TEST_F(OcclusionTrackingPictureLayerImplTest, 3819 TEST_F(OcclusionTrackingPictureLayerImplTest,
3826 OccludedTilesSkippedDuringRasterization) { 3820 OccludedTilesSkippedDuringRasterization) {
3827 base::TimeTicks time_ticks; 3821 base::TimeTicks time_ticks;
3828 time_ticks += base::TimeDelta::FromMilliseconds(1); 3822 time_ticks += base::TimeDelta::FromMilliseconds(1);
3829 host_impl_.SetCurrentBeginFrameArgs( 3823 host_impl_.SetCurrentBeginFrameArgs(
3830 CreateBeginFrameArgsForTesting(time_ticks)); 3824 CreateBeginFrameArgsForTesting(time_ticks));
3831 3825
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
4284 host_impl_.SetViewportSize(viewport_size); 4278 host_impl_.SetViewportSize(viewport_size);
4285 host_impl_.active_tree()->UpdateDrawProperties(); 4279 host_impl_.active_tree()->UpdateDrawProperties();
4286 host_impl_.pending_tree()->UpdateDrawProperties(); 4280 host_impl_.pending_tree()->UpdateDrawProperties();
4287 4281
4288 // The expected number of occluded tiles on each of the 5 tilings for each of 4282 // The expected number of occluded tiles on each of the 5 tilings for each of
4289 // the 3 tree priorities. 4283 // the 3 tree priorities.
4290 size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u}; 4284 size_t expected_occluded_tile_count_on_both[] = {9u, 1u, 1u, 1u, 1u};
4291 size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u}; 4285 size_t expected_occluded_tile_count_on_active[] = {30u, 5u, 4u, 2u, 2u};
4292 size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u}; 4286 size_t expected_occluded_tile_count_on_pending[] = {30u, 5u, 4u, 2u, 2u};
4293 4287
4294 // The total expected number of occluded tiles on all tilings for each of the 4288 size_t total_expected_occluded_count_on_trees[] = {43u, 43u};
4295 // 3 tree priorities.
4296 size_t total_expected_occluded_tile_count[] = {13u, 43u, 43u};
4297
4298 ASSERT_EQ(arraysize(total_expected_occluded_tile_count), NUM_TREE_PRIORITIES);
4299 4289
4300 // Verify number of occluded tiles on the pending layer for each tiling. 4290 // Verify number of occluded tiles on the pending layer for each tiling.
4301 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { 4291 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) {
4302 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); 4292 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i);
4303 tiling->CreateAllTilesForTesting(); 4293 tiling->CreateAllTilesForTesting();
4304 tiling->UpdateAllTilePrioritiesForTesting(); 4294 tiling->UpdateAllTilePrioritiesForTesting();
4305 4295
4306 size_t occluded_tile_count_on_pending = 0u; 4296 size_t occluded_tile_count_on_pending = 0u;
4307 size_t occluded_tile_count_on_active = 0u; 4297 size_t occluded_tile_count_on_active = 0u;
4308 size_t occluded_tile_count_on_both = 0u; 4298 size_t occluded_tile_count_on_both = 0u;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4371 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator = 4361 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator =
4372 tilings.begin(); 4362 tilings.begin();
4373 tiling_iterator != tilings.end(); 4363 tiling_iterator != tilings.end();
4374 ++tiling_iterator) { 4364 ++tiling_iterator) {
4375 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting(); 4365 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting();
4376 std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles)); 4366 std::copy(tiles.begin(), tiles.end(), std::back_inserter(all_tiles));
4377 } 4367 }
4378 4368
4379 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles); 4369 host_impl_.tile_manager()->InitializeTilesWithResourcesForTesting(all_tiles);
4380 4370
4381 VerifyEvictionConsidersOcclusion(pending_layer_, 4371 VerifyEvictionConsidersOcclusion(
4382 total_expected_occluded_tile_count); 4372 pending_layer_,
4383 VerifyEvictionConsidersOcclusion(active_layer_, 4373 PENDING_TREE,
4384 total_expected_occluded_tile_count); 4374 total_expected_occluded_count_on_trees[PENDING_TREE]);
4375 VerifyEvictionConsidersOcclusion(
4376 active_layer_,
4377 ACTIVE_TREE,
4378 total_expected_occluded_count_on_trees[ACTIVE_TREE]);
4385 } 4379 }
4386 4380
4387 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) { 4381 TEST_F(PictureLayerImplTest, PendingOrActiveTwinLayer) {
4388 gfx::Size tile_size(102, 102); 4382 gfx::Size tile_size(102, 102);
4389 gfx::Size layer_bounds(1000, 1000); 4383 gfx::Size layer_bounds(1000, 1000);
4390 4384
4391 scoped_refptr<FakePicturePileImpl> pile = 4385 scoped_refptr<FakePicturePileImpl> pile =
4392 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); 4386 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds);
4393 SetupPendingTree(pile); 4387 SetupPendingTree(pile);
4394 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer()); 4388 EXPECT_FALSE(pending_layer_->GetPendingOrActiveTwinLayer());
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
4704 result = layer->CalculateTileSize(gfx::Size(447, 400)); 4698 result = layer->CalculateTileSize(gfx::Size(447, 400));
4705 EXPECT_EQ(result.width(), 448); 4699 EXPECT_EQ(result.width(), 448);
4706 EXPECT_EQ(result.height(), 448); 4700 EXPECT_EQ(result.height(), 448);
4707 result = layer->CalculateTileSize(gfx::Size(500, 499)); 4701 result = layer->CalculateTileSize(gfx::Size(500, 499));
4708 EXPECT_EQ(result.width(), 512); 4702 EXPECT_EQ(result.width(), 512);
4709 EXPECT_EQ(result.height(), 500 + 2); 4703 EXPECT_EQ(result.height(), 500 + 2);
4710 } 4704 }
4711 4705
4712 } // namespace 4706 } // namespace
4713 } // namespace cc 4707 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698