| 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 2791 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2802 | 2802 |
| 2803 // No occlusion. | 2803 // No occlusion. |
| 2804 int unoccluded_tile_count = 0; | 2804 int unoccluded_tile_count = 0; |
| 2805 for (PictureLayerImpl::LayerRasterTileIterator it = | 2805 for (PictureLayerImpl::LayerRasterTileIterator it = |
| 2806 PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); | 2806 PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); |
| 2807 it; | 2807 it; |
| 2808 ++it) { | 2808 ++it) { |
| 2809 Tile* tile = *it; | 2809 Tile* tile = *it; |
| 2810 | 2810 |
| 2811 // Occluded tiles should not be iterated over. | 2811 // Occluded tiles should not be iterated over. |
| 2812 EXPECT_FALSE(tile->is_occluded()); | 2812 EXPECT_FALSE(tile->priority(PENDING_TREE).is_occluded); |
| 2813 | 2813 |
| 2814 // Some tiles may not be visible (i.e. outside the viewport). The rest are | 2814 // Some tiles may not be visible (i.e. outside the viewport). The rest are |
| 2815 // visible and at least partially unoccluded, verified by the above expect. | 2815 // visible and at least partially unoccluded, verified by the above expect. |
| 2816 bool tile_is_visible = | 2816 bool tile_is_visible = |
| 2817 tile->content_rect().Intersects(pending_layer_->visible_content_rect()); | 2817 tile->content_rect().Intersects(pending_layer_->visible_content_rect()); |
| 2818 if (tile_is_visible) | 2818 if (tile_is_visible) |
| 2819 unoccluded_tile_count++; | 2819 unoccluded_tile_count++; |
| 2820 } | 2820 } |
| 2821 EXPECT_EQ(unoccluded_tile_count, 25 + 4); | 2821 EXPECT_EQ(unoccluded_tile_count, 25 + 4); |
| 2822 | 2822 |
| 2823 // Partial occlusion. | 2823 // Partial occlusion. |
| 2824 pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); | 2824 pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); |
| 2825 LayerImpl* layer1 = pending_layer_->children()[0]; | 2825 LayerImpl* layer1 = pending_layer_->children()[0]; |
| 2826 layer1->SetBounds(layer_bounds); | 2826 layer1->SetBounds(layer_bounds); |
| 2827 layer1->SetContentBounds(layer_bounds); | 2827 layer1->SetContentBounds(layer_bounds); |
| 2828 layer1->SetDrawsContent(true); | 2828 layer1->SetDrawsContent(true); |
| 2829 layer1->SetContentsOpaque(true); | 2829 layer1->SetContentsOpaque(true); |
| 2830 layer1->SetPosition(occluding_layer_position); | 2830 layer1->SetPosition(occluding_layer_position); |
| 2831 | 2831 |
| 2832 host_impl_.pending_tree()->UpdateDrawProperties(); | 2832 host_impl_.pending_tree()->UpdateDrawProperties(); |
| 2833 | 2833 |
| 2834 unoccluded_tile_count = 0; | 2834 unoccluded_tile_count = 0; |
| 2835 for (PictureLayerImpl::LayerRasterTileIterator it = | 2835 for (PictureLayerImpl::LayerRasterTileIterator it = |
| 2836 PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); | 2836 PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); |
| 2837 it; | 2837 it; |
| 2838 ++it) { | 2838 ++it) { |
| 2839 Tile* tile = *it; | 2839 Tile* tile = *it; |
| 2840 | 2840 |
| 2841 EXPECT_FALSE(tile->is_occluded()); | 2841 EXPECT_FALSE(tile->priority(PENDING_TREE).is_occluded); |
| 2842 | 2842 |
| 2843 bool tile_is_visible = | 2843 bool tile_is_visible = |
| 2844 tile->content_rect().Intersects(pending_layer_->visible_content_rect()); | 2844 tile->content_rect().Intersects(pending_layer_->visible_content_rect()); |
| 2845 if (tile_is_visible) | 2845 if (tile_is_visible) |
| 2846 unoccluded_tile_count++; | 2846 unoccluded_tile_count++; |
| 2847 } | 2847 } |
| 2848 EXPECT_EQ(unoccluded_tile_count, 20 + 2); | 2848 EXPECT_EQ(unoccluded_tile_count, 20 + 2); |
| 2849 | 2849 |
| 2850 // Full occlusion. | 2850 // Full occlusion. |
| 2851 layer1->SetPosition(gfx::Point(0, 0)); | 2851 layer1->SetPosition(gfx::Point(0, 0)); |
| 2852 | 2852 |
| 2853 host_impl_.pending_tree()->UpdateDrawProperties(); | 2853 host_impl_.pending_tree()->UpdateDrawProperties(); |
| 2854 | 2854 |
| 2855 unoccluded_tile_count = 0; | 2855 unoccluded_tile_count = 0; |
| 2856 for (PictureLayerImpl::LayerRasterTileIterator it = | 2856 for (PictureLayerImpl::LayerRasterTileIterator it = |
| 2857 PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); | 2857 PictureLayerImpl::LayerRasterTileIterator(pending_layer_, false); |
| 2858 it; | 2858 it; |
| 2859 ++it) { | 2859 ++it) { |
| 2860 Tile* tile = *it; | 2860 Tile* tile = *it; |
| 2861 | 2861 |
| 2862 EXPECT_FALSE(tile->is_occluded()); | 2862 EXPECT_FALSE(tile->priority(PENDING_TREE).is_occluded); |
| 2863 | 2863 |
| 2864 bool tile_is_visible = | 2864 bool tile_is_visible = |
| 2865 tile->content_rect().Intersects(pending_layer_->visible_content_rect()); | 2865 tile->content_rect().Intersects(pending_layer_->visible_content_rect()); |
| 2866 if (tile_is_visible) | 2866 if (tile_is_visible) |
| 2867 unoccluded_tile_count++; | 2867 unoccluded_tile_count++; |
| 2868 } | 2868 } |
| 2869 EXPECT_EQ(unoccluded_tile_count, 0); | 2869 EXPECT_EQ(unoccluded_tile_count, 0); |
| 2870 } | 2870 } |
| 2871 | 2871 |
| 2872 TEST_F(OcclusionTrackingPictureLayerImplTest, | 2872 TEST_F(OcclusionTrackingPictureLayerImplTest, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2894 tiling, | 2894 tiling, |
| 2895 pending_layer_->contents_scale_x(), | 2895 pending_layer_->contents_scale_x(), |
| 2896 gfx::Rect(layer_bounds)); | 2896 gfx::Rect(layer_bounds)); |
| 2897 iter; | 2897 iter; |
| 2898 ++iter) { | 2898 ++iter) { |
| 2899 if (!*iter) | 2899 if (!*iter) |
| 2900 continue; | 2900 continue; |
| 2901 const Tile* tile = *iter; | 2901 const Tile* tile = *iter; |
| 2902 | 2902 |
| 2903 // Fully occluded tiles are not required for activation. | 2903 // Fully occluded tiles are not required for activation. |
| 2904 if (tile->is_occluded()) { | 2904 if (tile->priority(PENDING_TREE).is_occluded) { |
| 2905 EXPECT_FALSE(tile->required_for_activation()); | 2905 EXPECT_FALSE(tile->required_for_activation()); |
| 2906 occluded_tile_count++; | 2906 occluded_tile_count++; |
| 2907 } | 2907 } |
| 2908 } | 2908 } |
| 2909 EXPECT_EQ(occluded_tile_count, 0); | 2909 EXPECT_EQ(occluded_tile_count, 0); |
| 2910 } | 2910 } |
| 2911 | 2911 |
| 2912 // Partial occlusion. | 2912 // Partial occlusion. |
| 2913 pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); | 2913 pending_layer_->AddChild(LayerImpl::Create(host_impl_.pending_tree(), 1)); |
| 2914 LayerImpl* layer1 = pending_layer_->children()[0]; | 2914 LayerImpl* layer1 = pending_layer_->children()[0]; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2927 for (PictureLayerTiling::CoverageIterator iter( | 2927 for (PictureLayerTiling::CoverageIterator iter( |
| 2928 tiling, | 2928 tiling, |
| 2929 pending_layer_->contents_scale_x(), | 2929 pending_layer_->contents_scale_x(), |
| 2930 gfx::Rect(layer_bounds)); | 2930 gfx::Rect(layer_bounds)); |
| 2931 iter; | 2931 iter; |
| 2932 ++iter) { | 2932 ++iter) { |
| 2933 if (!*iter) | 2933 if (!*iter) |
| 2934 continue; | 2934 continue; |
| 2935 const Tile* tile = *iter; | 2935 const Tile* tile = *iter; |
| 2936 | 2936 |
| 2937 if (tile->is_occluded()) { | 2937 if (tile->priority(PENDING_TREE).is_occluded) { |
| 2938 EXPECT_FALSE(tile->required_for_activation()); | 2938 EXPECT_FALSE(tile->required_for_activation()); |
| 2939 occluded_tile_count++; | 2939 occluded_tile_count++; |
| 2940 } | 2940 } |
| 2941 } | 2941 } |
| 2942 switch (i) { | 2942 switch (i) { |
| 2943 case 0: | 2943 case 0: |
| 2944 EXPECT_EQ(occluded_tile_count, 5); | 2944 EXPECT_EQ(occluded_tile_count, 5); |
| 2945 break; | 2945 break; |
| 2946 case 1: | 2946 case 1: |
| 2947 EXPECT_EQ(occluded_tile_count, 2); | 2947 EXPECT_EQ(occluded_tile_count, 2); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2963 for (PictureLayerTiling::CoverageIterator iter( | 2963 for (PictureLayerTiling::CoverageIterator iter( |
| 2964 tiling, | 2964 tiling, |
| 2965 pending_layer_->contents_scale_x(), | 2965 pending_layer_->contents_scale_x(), |
| 2966 gfx::Rect(layer_bounds)); | 2966 gfx::Rect(layer_bounds)); |
| 2967 iter; | 2967 iter; |
| 2968 ++iter) { | 2968 ++iter) { |
| 2969 if (!*iter) | 2969 if (!*iter) |
| 2970 continue; | 2970 continue; |
| 2971 const Tile* tile = *iter; | 2971 const Tile* tile = *iter; |
| 2972 | 2972 |
| 2973 if (tile->is_occluded()) { | 2973 if (tile->priority(PENDING_TREE).is_occluded) { |
| 2974 EXPECT_FALSE(tile->required_for_activation()); | 2974 EXPECT_FALSE(tile->required_for_activation()); |
| 2975 occluded_tile_count++; | 2975 occluded_tile_count++; |
| 2976 } | 2976 } |
| 2977 } | 2977 } |
| 2978 switch (i) { | 2978 switch (i) { |
| 2979 case 0: | 2979 case 0: |
| 2980 EXPECT_EQ(occluded_tile_count, 25); | 2980 EXPECT_EQ(occluded_tile_count, 25); |
| 2981 break; | 2981 break; |
| 2982 case 1: | 2982 case 1: |
| 2983 EXPECT_EQ(occluded_tile_count, 4); | 2983 EXPECT_EQ(occluded_tile_count, 4); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3024 int tiling_count = 0; | 3024 int tiling_count = 0; |
| 3025 int occluded_tile_count = 0; | 3025 int occluded_tile_count = 0; |
| 3026 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator = | 3026 for (std::vector<PictureLayerTiling*>::iterator tiling_iterator = |
| 3027 tilings.begin(); | 3027 tilings.begin(); |
| 3028 tiling_iterator != tilings.end(); | 3028 tiling_iterator != tilings.end(); |
| 3029 ++tiling_iterator) { | 3029 ++tiling_iterator) { |
| 3030 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting(); | 3030 std::vector<Tile*> tiles = (*tiling_iterator)->AllTilesForTesting(); |
| 3031 | 3031 |
| 3032 occluded_tile_count = 0; | 3032 occluded_tile_count = 0; |
| 3033 for (size_t i = 0; i < tiles.size(); ++i) { | 3033 for (size_t i = 0; i < tiles.size(); ++i) { |
| 3034 if (tiles[i]->is_occluded()) { | 3034 if (tiles[i]->priority(PENDING_TREE).is_occluded) { |
| 3035 gfx::Rect scaled_content_rect = ScaleToEnclosingRect( | 3035 gfx::Rect scaled_content_rect = ScaleToEnclosingRect( |
| 3036 tiles[i]->content_rect(), 1.0f / tiles[i]->contents_scale()); | 3036 tiles[i]->content_rect(), 1.0f / tiles[i]->contents_scale()); |
| 3037 EXPECT_GE(scaled_content_rect.x(), occluding_layer_position.x()); | 3037 EXPECT_GE(scaled_content_rect.x(), occluding_layer_position.x()); |
| 3038 occluded_tile_count++; | 3038 occluded_tile_count++; |
| 3039 } | 3039 } |
| 3040 } | 3040 } |
| 3041 switch (tiling_count) { | 3041 switch (tiling_count) { |
| 3042 case 0: | 3042 case 0: |
| 3043 case 1: | 3043 case 1: |
| 3044 EXPECT_EQ(occluded_tile_count, 2); | 3044 EXPECT_EQ(occluded_tile_count, 2); |
| 3045 break; | 3045 break; |
| 3046 case 2: | 3046 case 2: |
| 3047 EXPECT_EQ(occluded_tile_count, 4); | 3047 EXPECT_EQ(occluded_tile_count, 4); |
| 3048 break; | 3048 break; |
| 3049 case 3: | 3049 case 3: |
| 3050 EXPECT_EQ(occluded_tile_count, 5); | 3050 EXPECT_EQ(occluded_tile_count, 5); |
| 3051 break; | 3051 break; |
| 3052 case 4: | 3052 case 4: |
| 3053 EXPECT_EQ(occluded_tile_count, 30); | 3053 EXPECT_EQ(occluded_tile_count, 30); |
| 3054 break; | 3054 break; |
| 3055 default: | 3055 default: |
| 3056 NOTREACHED(); | 3056 NOTREACHED(); |
| 3057 } | 3057 } |
| 3058 | 3058 |
| 3059 tiling_count++; | 3059 tiling_count++; |
| 3060 } | 3060 } |
| 3061 | 3061 |
| 3062 EXPECT_EQ(tiling_count, 5); | 3062 EXPECT_EQ(tiling_count, 5); |
| 3063 } | 3063 } |
| 3064 |
| 3065 TEST_F(OcclusionTrackingPictureLayerImplTest, DifferentOcclusionOnTrees) { |
| 3066 gfx::Size tile_size(102, 102); |
| 3067 gfx::Size layer_bounds(1000, 1000); |
| 3068 gfx::Size viewport_size(1000, 1000); |
| 3069 gfx::Point occluding_layer_position(310, 0); |
| 3070 gfx::Rect invalidation_rect(230, 230, 102, 102); |
| 3071 |
| 3072 scoped_refptr<FakePicturePileImpl> pending_pile = |
| 3073 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| 3074 scoped_refptr<FakePicturePileImpl> active_pile = |
| 3075 FakePicturePileImpl::CreateFilledPile(tile_size, layer_bounds); |
| 3076 SetupTrees(pending_pile, active_pile); |
| 3077 |
| 3078 // Partially occlude the active layer. |
| 3079 active_layer_->AddChild(LayerImpl::Create(host_impl_.active_tree(), 2)); |
| 3080 LayerImpl* layer1 = active_layer_->children()[0]; |
| 3081 layer1->SetBounds(layer_bounds); |
| 3082 layer1->SetContentBounds(layer_bounds); |
| 3083 layer1->SetDrawsContent(true); |
| 3084 layer1->SetContentsOpaque(true); |
| 3085 layer1->SetPosition(occluding_layer_position); |
| 3086 |
| 3087 // Partially invalidate the pending layer. |
| 3088 pending_layer_->set_invalidation(invalidation_rect); |
| 3089 |
| 3090 host_impl_.SetViewportSize(viewport_size); |
| 3091 |
| 3092 active_layer_->CreateDefaultTilingsAndTiles(); |
| 3093 pending_layer_->CreateDefaultTilingsAndTiles(); |
| 3094 |
| 3095 for (size_t i = 0; i < pending_layer_->num_tilings(); ++i) { |
| 3096 PictureLayerTiling* tiling = pending_layer_->tilings()->tiling_at(i); |
| 3097 |
| 3098 for (PictureLayerTiling::CoverageIterator iter( |
| 3099 tiling, |
| 3100 pending_layer_->contents_scale_x(), |
| 3101 gfx::Rect(layer_bounds)); |
| 3102 iter; |
| 3103 ++iter) { |
| 3104 if (!*iter) |
| 3105 continue; |
| 3106 const Tile* tile = *iter; |
| 3107 |
| 3108 // All tiles are unoccluded on the pending tree. |
| 3109 EXPECT_FALSE(tile->priority(PENDING_TREE).is_occluded); |
| 3110 |
| 3111 Tile* twin_tile = |
| 3112 pending_layer_->GetTwinTiling(tiling)->TileAt(iter.i(), iter.j()); |
| 3113 gfx::Rect scaled_content_rect = ScaleToEnclosingRect( |
| 3114 tile->content_rect(), 1.0f / tile->contents_scale()); |
| 3115 |
| 3116 if (scaled_content_rect.Intersects(invalidation_rect)) { |
| 3117 // Tiles inside the invalidation rect are only on the pending tree. |
| 3118 EXPECT_NE(tile, twin_tile); |
| 3119 |
| 3120 // Unshared tiles should have the default TilePriority of being |
| 3121 // unoccluded on the active tree. |
| 3122 EXPECT_FALSE(tile->priority(ACTIVE_TREE).is_occluded); |
| 3123 } else { |
| 3124 // Tiles outside the invalidation rect are shared between both trees. |
| 3125 EXPECT_EQ(tile, twin_tile); |
| 3126 |
| 3127 // Shared tiles are occluded on the active tree iff they lie beneath the |
| 3128 // occluding layer. |
| 3129 EXPECT_EQ(tile->priority(ACTIVE_TREE).is_occluded, |
| 3130 scaled_content_rect.x() >= occluding_layer_position.x()); |
| 3131 } |
| 3132 } |
| 3133 } |
| 3134 |
| 3135 for (size_t i = 0; i < active_layer_->num_tilings(); ++i) { |
| 3136 PictureLayerTiling* tiling = active_layer_->tilings()->tiling_at(i); |
| 3137 |
| 3138 for (PictureLayerTiling::CoverageIterator iter( |
| 3139 tiling, |
| 3140 active_layer_->contents_scale_x(), |
| 3141 gfx::Rect(layer_bounds)); |
| 3142 iter; |
| 3143 ++iter) { |
| 3144 if (!*iter) |
| 3145 continue; |
| 3146 const Tile* tile = *iter; |
| 3147 |
| 3148 Tile* twin_tile = |
| 3149 active_layer_->GetTwinTiling(tiling)->TileAt(iter.i(), iter.j()); |
| 3150 gfx::Rect scaled_content_rect = ScaleToEnclosingRect( |
| 3151 tile->content_rect(), 1.0f / tile->contents_scale()); |
| 3152 |
| 3153 // Since we've already checked the shared tiles, only consider tiles in |
| 3154 // the invalidation rect. |
| 3155 if (scaled_content_rect.Intersects(invalidation_rect)) { |
| 3156 // Tiles inside the invalidation rect are only on the active tree. |
| 3157 EXPECT_NE(tile, twin_tile); |
| 3158 |
| 3159 // Unshared tiles should have the default TilePriority of being |
| 3160 // unoccluded on the pending tree. |
| 3161 EXPECT_FALSE(tile->priority(PENDING_TREE).is_occluded); |
| 3162 |
| 3163 // Unshared tiles are occluded on the active tree iff they lie beneath |
| 3164 // the occluding layer. |
| 3165 EXPECT_EQ(tile->priority(ACTIVE_TREE).is_occluded, |
| 3166 scaled_content_rect.x() >= occluding_layer_position.x()); |
| 3167 } |
| 3168 } |
| 3169 } |
| 3170 } |
| 3064 } // namespace | 3171 } // namespace |
| 3065 } // namespace cc | 3172 } // namespace cc |
| OLD | NEW |