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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 } | 131 } |
132 | 132 |
133 void PictureLayerTiling::TakeTilesAndPropertiesFrom( | 133 void PictureLayerTiling::TakeTilesAndPropertiesFrom( |
134 PictureLayerTiling* pending_twin, | 134 PictureLayerTiling* pending_twin, |
135 const Region& layer_invalidation) { | 135 const Region& layer_invalidation) { |
136 TRACE_EVENT0("cc", "TakeTilesAndPropertiesFrom"); | 136 TRACE_EVENT0("cc", "TakeTilesAndPropertiesFrom"); |
137 SetRasterSourceAndResize(pending_twin->raster_source_); | 137 SetRasterSourceAndResize(pending_twin->raster_source_); |
138 | 138 |
139 RemoveTilesInRegion(layer_invalidation, false /* recreate tiles */); | 139 RemoveTilesInRegion(layer_invalidation, false /* recreate tiles */); |
140 | 140 |
141 for (TileMap::value_type& tile_pair : tiles_) | |
142 tile_pair.second->set_raster_source(raster_source_.get()); | |
143 | |
144 resolution_ = pending_twin->resolution_; | 141 resolution_ = pending_twin->resolution_; |
145 bool create_missing_tiles = false; | 142 bool create_missing_tiles = false; |
146 if (live_tiles_rect_.IsEmpty()) { | 143 if (live_tiles_rect_.IsEmpty()) { |
147 live_tiles_rect_ = pending_twin->live_tiles_rect(); | 144 live_tiles_rect_ = pending_twin->live_tiles_rect(); |
148 create_missing_tiles = true; | 145 create_missing_tiles = true; |
149 } else { | 146 } else { |
150 SetLiveTilesRect(pending_twin->live_tiles_rect()); | 147 SetLiveTilesRect(pending_twin->live_tiles_rect()); |
151 } | 148 } |
152 | 149 |
153 if (tiles_.empty()) { | 150 if (tiles_.empty()) { |
154 tiles_.swap(pending_twin->tiles_); | 151 tiles_.swap(pending_twin->tiles_); |
155 } else { | 152 } else { |
156 while (!pending_twin->tiles_.empty()) { | 153 while (!pending_twin->tiles_.empty()) { |
157 TileMapKey key = pending_twin->tiles_.begin()->first; | 154 TileMapKey key = pending_twin->tiles_.begin()->first; |
158 tiles_.set(key, pending_twin->tiles_.take_and_erase(key)); | 155 tiles_.set(key, pending_twin->tiles_.take_and_erase(key)); |
159 DCHECK(tiles_.get(key)->raster_source() == raster_source_.get()); | |
160 } | 156 } |
161 } | 157 } |
162 DCHECK(pending_twin->tiles_.empty()); | 158 DCHECK(pending_twin->tiles_.empty()); |
163 | 159 |
164 if (create_missing_tiles) | 160 if (create_missing_tiles) |
165 CreateMissingTilesInLiveTilesRect(); | 161 CreateMissingTilesInLiveTilesRect(); |
166 | 162 |
167 VerifyLiveTilesRect(false); | 163 VerifyLiveTilesRect(false); |
168 | 164 |
169 SetTilePriorityRects(pending_twin->current_content_to_screen_scale_, | 165 SetTilePriorityRects(pending_twin->current_content_to_screen_scale_, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 if (recreate_tiles) | 286 if (recreate_tiles) |
291 new_tile_keys.push_back(iter.index()); | 287 new_tile_keys.push_back(iter.index()); |
292 } | 288 } |
293 } | 289 } |
294 } | 290 } |
295 | 291 |
296 for (const auto& key : new_tile_keys) | 292 for (const auto& key : new_tile_keys) |
297 CreateTile(key.first, key.second); | 293 CreateTile(key.first, key.second); |
298 } | 294 } |
299 | 295 |
300 void PictureLayerTiling::SetRasterSourceOnTiles() { | |
301 if (tree_ == PENDING_TREE) | |
302 return; | |
303 | |
304 for (TileMap::value_type& tile_pair : tiles_) | |
305 tile_pair.second->set_raster_source(raster_source_.get()); | |
306 } | |
307 | |
308 bool PictureLayerTiling::ShouldCreateTileAt(int i, int j) const { | 296 bool PictureLayerTiling::ShouldCreateTileAt(int i, int j) const { |
309 // Active tree should always create a tile. The reason for this is that active | 297 // Active tree should always create a tile. The reason for this is that active |
310 // tree represents content that we draw on screen, which means that whenever | 298 // tree represents content that we draw on screen, which means that whenever |
311 // we check whether a tile should exist somewhere, the answer is yes. This | 299 // we check whether a tile should exist somewhere, the answer is yes. This |
312 // doesn't mean it will actually be created (if raster source doesn't cover | 300 // doesn't mean it will actually be created (if raster source doesn't cover |
313 // the tile for instance). Pending tree, on the other hand, should only be | 301 // the tile for instance). Pending tree, on the other hand, should only be |
314 // creating tiles that are different from the current active tree, which is | 302 // creating tiles that are different from the current active tree, which is |
315 // represented by the logic in the rest of the function. | 303 // represented by the logic in the rest of the function. |
316 if (tree_ == ACTIVE_TREE) | 304 if (tree_ == ACTIVE_TREE) |
317 return true; | 305 return true; |
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 } | 800 } |
813 | 801 |
814 void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const { | 802 void PictureLayerTiling::UpdateRequiredStatesOnTile(Tile* tile) const { |
815 DCHECK(tile); | 803 DCHECK(tile); |
816 tile->set_required_for_activation(IsTileRequiredForActivation(tile)); | 804 tile->set_required_for_activation(IsTileRequiredForActivation(tile)); |
817 tile->set_required_for_draw(IsTileRequiredForDraw(tile)); | 805 tile->set_required_for_draw(IsTileRequiredForDraw(tile)); |
818 } | 806 } |
819 | 807 |
820 PrioritizedTile PictureLayerTiling::MakePrioritizedTile(Tile* tile) const { | 808 PrioritizedTile PictureLayerTiling::MakePrioritizedTile(Tile* tile) const { |
821 DCHECK(tile); | 809 DCHECK(tile); |
822 return PrioritizedTile(tile, ComputePriorityForTile(tile), | 810 DCHECK( |
| 811 raster_source()->CoversRect(tile->content_rect(), tile->contents_scale())) |
| 812 << "Recording rect: " |
| 813 << gfx::ScaleToEnclosingRect(tile->content_rect(), |
| 814 1.f / tile->contents_scale()).ToString(); |
| 815 |
| 816 return PrioritizedTile(tile, raster_source(), ComputePriorityForTile(tile), |
823 IsTileOccluded(tile)); | 817 IsTileOccluded(tile)); |
824 } | 818 } |
825 | 819 |
826 std::map<const Tile*, PrioritizedTile> | 820 std::map<const Tile*, PrioritizedTile> |
827 PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() { | 821 PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() const { |
828 std::map<const Tile*, PrioritizedTile> result; | 822 std::map<const Tile*, PrioritizedTile> result; |
829 for (const auto& key_tile_pair : tiles_) { | 823 for (const auto& key_tile_pair : tiles_) { |
830 UpdateRequiredStatesOnTile(key_tile_pair.second); | 824 UpdateRequiredStatesOnTile(key_tile_pair.second); |
831 PrioritizedTile prioritized_tile = | 825 PrioritizedTile prioritized_tile = |
832 MakePrioritizedTile(key_tile_pair.second); | 826 MakePrioritizedTile(key_tile_pair.second); |
833 result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile)); | 827 result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile)); |
834 } | 828 } |
835 return result; | 829 return result; |
836 } | 830 } |
837 | 831 |
838 void PictureLayerTiling::VerifyAllTilesHaveCurrentRasterSource() const { | |
839 #if DCHECK_IS_ON() | |
840 for (const auto& tile_pair : tiles_) | |
841 DCHECK_EQ(raster_source_.get(), tile_pair.second->raster_source()); | |
842 #endif | |
843 } | |
844 | |
845 TilePriority PictureLayerTiling::ComputePriorityForTile( | 832 TilePriority PictureLayerTiling::ComputePriorityForTile( |
846 const Tile* tile) const { | 833 const Tile* tile) const { |
847 // TODO(vmpstr): See if this can be moved to iterators. | 834 // TODO(vmpstr): See if this can be moved to iterators. |
848 TilePriority::PriorityBin max_tile_priority_bin = | 835 TilePriority::PriorityBin max_tile_priority_bin = |
849 client_->GetMaxTilePriorityBin(); | 836 client_->GetMaxTilePriorityBin(); |
850 | 837 |
851 DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); | 838 DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); |
852 gfx::Rect tile_bounds = | 839 gfx::Rect tile_bounds = |
853 tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index()); | 840 tiling_data_.TileBounds(tile->tiling_i_index(), tile->tiling_j_index()); |
854 | 841 |
(...skipping 15 matching lines...) Expand all Loading... |
870 if (max_tile_priority_bin <= TilePriority::SOON && | 857 if (max_tile_priority_bin <= TilePriority::SOON && |
871 (current_soon_border_rect_.Intersects(tile_bounds) || | 858 (current_soon_border_rect_.Intersects(tile_bounds) || |
872 current_skewport_rect_.Intersects(tile_bounds))) { | 859 current_skewport_rect_.Intersects(tile_bounds))) { |
873 return TilePriority(resolution_, TilePriority::SOON, distance_to_visible); | 860 return TilePriority(resolution_, TilePriority::SOON, distance_to_visible); |
874 } | 861 } |
875 | 862 |
876 return TilePriority(resolution_, TilePriority::EVENTUALLY, | 863 return TilePriority(resolution_, TilePriority::EVENTUALLY, |
877 distance_to_visible); | 864 distance_to_visible); |
878 } | 865 } |
879 | 866 |
880 void PictureLayerTiling::GetAllTilesAndPrioritiesForTracing( | 867 void PictureLayerTiling::GetAllPrioritizedTilesForTracing( |
881 std::map<const Tile*, TilePriority>* tile_map) const { | 868 std::vector<PrioritizedTile>* prioritized_tiles) const { |
882 for (const auto& tile_pair : tiles_) { | 869 for (const auto& tile_pair : tiles_) { |
883 const Tile* tile = tile_pair.second; | 870 prioritized_tiles->push_back(MakePrioritizedTile(tile_pair.second)); |
884 const TilePriority& priority = ComputePriorityForTile(tile); | |
885 // Store combined priority. | |
886 (*tile_map)[tile] = priority; | |
887 } | 871 } |
888 } | 872 } |
889 | 873 |
890 void PictureLayerTiling::AsValueInto( | 874 void PictureLayerTiling::AsValueInto( |
891 base::trace_event::TracedValue* state) const { | 875 base::trace_event::TracedValue* state) const { |
892 state->SetInteger("num_tiles", tiles_.size()); | 876 state->SetInteger("num_tiles", tiles_.size()); |
893 state->SetDouble("content_scale", contents_scale_); | 877 state->SetDouble("content_scale", contents_scale_); |
894 MathUtil::AddToTracedValue("visible_rect", current_visible_rect_, state); | 878 MathUtil::AddToTracedValue("visible_rect", current_visible_rect_, state); |
895 MathUtil::AddToTracedValue("skewport_rect", current_skewport_rect_, state); | 879 MathUtil::AddToTracedValue("skewport_rect", current_skewport_rect_, state); |
896 MathUtil::AddToTracedValue("soon_rect", current_soon_border_rect_, state); | 880 MathUtil::AddToTracedValue("soon_rect", current_soon_border_rect_, state); |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1053 break; | 1037 break; |
1054 } | 1038 } |
1055 | 1039 |
1056 gfx::Rect result(origin_x, origin_y, width, height); | 1040 gfx::Rect result(origin_x, origin_y, width, height); |
1057 if (cache) | 1041 if (cache) |
1058 cache->previous_result = result; | 1042 cache->previous_result = result; |
1059 return result; | 1043 return result; |
1060 } | 1044 } |
1061 | 1045 |
1062 } // namespace cc | 1046 } // namespace cc |
OLD | NEW |