OLD | NEW |
---|---|
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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/resources/picture_layer_tiling.h" | 5 #include "cc/resources/picture_layer_tiling.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 #include <set> | 10 #include <set> |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
810 return false; | 810 return false; |
811 return true; | 811 return true; |
812 } | 812 } |
813 | 813 |
814 void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const { | 814 void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const { |
815 DCHECK(tile); | 815 DCHECK(tile); |
816 tile->set_required_for_activation(IsTileRequiredForActivation(tile)); | 816 tile->set_required_for_activation(IsTileRequiredForActivation(tile)); |
817 tile->set_required_for_draw(IsTileRequiredForDraw(tile)); | 817 tile->set_required_for_draw(IsTileRequiredForDraw(tile)); |
818 } | 818 } |
819 | 819 |
820 PrioritizedTile PictureLayerTiling::MakePrioritizedTile(Tile* tile) const { | 820 PrioritizedTile PictureLayerTiling::MakePrioritizedTile( |
821 Tile* tile, | |
822 PriorityRectType priority_rect_type) const { | |
821 DCHECK(tile); | 823 DCHECK(tile); |
822 return PrioritizedTile(tile, ComputePriorityForTile(tile), | 824 return PrioritizedTile(tile, ComputePriorityForTile(tile, priority_rect_type), |
823 IsTileOccluded(tile)); | 825 IsTileOccluded(tile)); |
824 } | 826 } |
825 | 827 |
826 std::map<const Tile*, PrioritizedTile> | 828 std::map<const Tile*, PrioritizedTile> |
827 PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() { | 829 PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() { |
828 std::map<const Tile*, PrioritizedTile> result; | 830 std::map<const Tile*, PrioritizedTile> result; |
829 for (const auto& key_tile_pair : tiles_) { | 831 for (const auto& key_tile_pair : tiles_) { |
830 UpdateRequiredStatesOnTile(key_tile_pair.second); | 832 Tile* tile = key_tile_pair.second; |
833 UpdateRequiredStatesOnTile(tile); | |
831 PrioritizedTile prioritized_tile = | 834 PrioritizedTile prioritized_tile = |
832 MakePrioritizedTile(key_tile_pair.second); | 835 MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile)); |
833 result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile)); | 836 result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile)); |
834 } | 837 } |
835 return result; | 838 return result; |
836 } | 839 } |
837 | 840 |
838 void PictureLayerTiling::VerifyAllTilesHaveCurrentRasterSource() const { | 841 void PictureLayerTiling::VerifyAllTilesHaveCurrentRasterSource() const { |
839 #if DCHECK_IS_ON() | 842 #if DCHECK_IS_ON() |
840 for (const auto& tile_pair : tiles_) | 843 for (const auto& tile_pair : tiles_) |
841 DCHECK_EQ(raster_source_.get(), tile_pair.second->raster_source()); | 844 DCHECK_EQ(raster_source_.get(), tile_pair.second->raster_source()); |
842 #endif | 845 #endif |
843 } | 846 } |
844 | 847 |
845 TilePriority PictureLayerTiling::ComputePriorityForTile( | 848 TilePriority PictureLayerTiling::ComputePriorityForTile( |
846 const Tile* tile) const { | 849 const Tile* tile, |
850 PriorityRectType priority_rect_type) const { | |
847 // TODO(vmpstr): See if this can be moved to iterators. | 851 // TODO(vmpstr): See if this can be moved to iterators. |
848 TilePriority::PriorityBin max_tile_priority_bin = | 852 TilePriority::PriorityBin max_tile_priority_bin = |
849 client_->GetMaxTilePriorityBin(); | 853 client_->GetMaxTilePriorityBin(); |
850 | 854 |
855 DCHECK_EQ(ComputePriorityRectTypeForTile(tile), priority_rect_type); | |
851 DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); | 856 DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); |
857 | |
858 TilePriority::PriorityBin priority_bin = max_tile_priority_bin; | |
859 | |
860 switch (priority_rect_type) { | |
861 case VISIBLE_RECT: | |
862 return TilePriority(resolution_, priority_bin, 0); | |
hendrikw
2015/05/12 22:23:49
Why don't we need to compare max_tile_priority_bin
USE eero AT chromium.org
2015/05/13 07:48:13
Because max_tile_priority cannot be higher than TP
| |
863 case PENDING_VISIBLE_RECT: | |
864 if (max_tile_priority_bin <= TilePriority::SOON) | |
865 return TilePriority(resolution_, TilePriority::SOON, 0); | |
866 priority_bin = TilePriority::EVENTUALLY; | |
867 break; | |
868 case SKEWPORT_RECT: | |
869 case SOON_BORDER_RECT: | |
870 if (max_tile_priority_bin <= TilePriority::SOON) | |
871 priority_bin = TilePriority::SOON; | |
872 break; | |
873 case EVENTUALLY_RECT: | |
874 priority_bin = TilePriority::EVENTUALLY; | |
875 break; | |
876 } | |
877 | |
852 gfx::Rect tile_bounds = | 878 gfx::Rect tile_bounds = |
853 tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index()); | 879 tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index()); |
854 | |
855 if (max_tile_priority_bin <= TilePriority::NOW && | |
856 current_visible_rect_.Intersects(tile_bounds)) { | |
857 return TilePriority(resolution_, TilePriority::NOW, 0); | |
858 } | |
859 | |
860 if (max_tile_priority_bin <= TilePriority::SOON && | |
861 pending_visible_rect().Intersects(tile_bounds)) { | |
862 return TilePriority(resolution_, TilePriority::SOON, 0); | |
863 } | |
864 | |
865 DCHECK_GT(current_content_to_screen_scale_, 0.f); | 880 DCHECK_GT(current_content_to_screen_scale_, 0.f); |
866 float distance_to_visible = | 881 float distance_to_visible = |
867 current_visible_rect_.ManhattanInternalDistance(tile_bounds) * | 882 current_visible_rect_.ManhattanInternalDistance(tile_bounds) * |
868 current_content_to_screen_scale_; | 883 current_content_to_screen_scale_; |
869 | 884 |
870 if (max_tile_priority_bin <= TilePriority::SOON && | 885 return TilePriority(resolution_, priority_bin, distance_to_visible); |
871 (current_soon_border_rect_.Intersects(tile_bounds) || | 886 } |
872 current_skewport_rect_.Intersects(tile_bounds))) { | |
873 return TilePriority(resolution_, TilePriority::SOON, distance_to_visible); | |
874 } | |
875 | 887 |
876 return TilePriority(resolution_, TilePriority::EVENTUALLY, | 888 PictureLayerTiling::PriorityRectType |
877 distance_to_visible); | 889 PictureLayerTiling::ComputePriorityRectTypeForTile(const Tile* tile) const { |
890 DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); | |
891 gfx::Rect tile_bounds = | |
892 tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index()); | |
893 | |
894 if (current_visible_rect_.Intersects(tile_bounds)) | |
895 return VISIBLE_RECT; | |
896 | |
897 if (pending_visible_rect().Intersects(tile_bounds)) | |
898 return PENDING_VISIBLE_RECT; | |
899 | |
900 if (current_skewport_rect_.Intersects(tile_bounds)) | |
901 return SKEWPORT_RECT; | |
902 | |
903 if (current_soon_border_rect_.Intersects(tile_bounds)) | |
904 return SOON_BORDER_RECT; | |
905 | |
906 DCHECK(current_eventually_rect_.Intersects(tile_bounds)); | |
907 return EVENTUALLY_RECT; | |
878 } | 908 } |
879 | 909 |
880 void PictureLayerTiling::GetAllTilesAndPrioritiesForTracing( | 910 void PictureLayerTiling::GetAllTilesAndPrioritiesForTracing( |
881 std::map<const Tile*, TilePriority>* tile_map) const { | 911 std::map<const Tile*, TilePriority>* tile_map) const { |
882 for (const auto& tile_pair : tiles_) { | 912 for (const auto& tile_pair : tiles_) { |
883 const Tile* tile = tile_pair.second; | 913 const Tile* tile = tile_pair.second; |
884 const TilePriority& priority = ComputePriorityForTile(tile); | 914 const TilePriority& priority = |
915 ComputePriorityForTile(tile, ComputePriorityRectTypeForTile(tile)); | |
885 // Store combined priority. | 916 // Store combined priority. |
886 (*tile_map)[tile] = priority; | 917 (*tile_map)[tile] = priority; |
887 } | 918 } |
888 } | 919 } |
889 | 920 |
890 void PictureLayerTiling::AsValueInto( | 921 void PictureLayerTiling::AsValueInto( |
891 base::trace_event::TracedValue* state) const { | 922 base::trace_event::TracedValue* state) const { |
892 state->SetInteger("num_tiles", tiles_.size()); | 923 state->SetInteger("num_tiles", tiles_.size()); |
893 state->SetDouble("content_scale", contents_scale_); | 924 state->SetDouble("content_scale", contents_scale_); |
894 MathUtil::AddToTracedValue("visible_rect", current_visible_rect_, state); | 925 MathUtil::AddToTracedValue("visible_rect", current_visible_rect_, state); |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1053 break; | 1084 break; |
1054 } | 1085 } |
1055 | 1086 |
1056 gfx::Rect result(origin_x, origin_y, width, height); | 1087 gfx::Rect result(origin_x, origin_y, width, height); |
1057 if (cache) | 1088 if (cache) |
1058 cache->previous_result = result; | 1089 cache->previous_result = result; |
1059 return result; | 1090 return result; |
1060 } | 1091 } |
1061 | 1092 |
1062 } // namespace cc | 1093 } // namespace cc |
OLD | NEW |