Chromium Code Reviews| 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 |