| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |