Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: cc/tiles/picture_layer_tiling.cc

Issue 1587283002: Switch cc to std::unordered_*. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@unordered-map
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/tiles/picture_layer_tiling.h" 5 #include "cc/tiles/picture_layer_tiling.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cmath> 10 #include <cmath>
11 #include <limits> 11 #include <limits>
12 #include <set> 12 #include <set>
13 13
14 #include "base/containers/hash_tables.h"
15 #include "base/containers/small_map.h" 14 #include "base/containers/small_map.h"
16 #include "base/logging.h" 15 #include "base/logging.h"
17 #include "base/numerics/safe_conversions.h" 16 #include "base/numerics/safe_conversions.h"
18 #include "base/trace_event/trace_event.h" 17 #include "base/trace_event/trace_event.h"
19 #include "base/trace_event/trace_event_argument.h" 18 #include "base/trace_event/trace_event_argument.h"
20 #include "cc/base/math_util.h" 19 #include "cc/base/math_util.h"
21 #include "cc/playback/display_list_raster_source.h" 20 #include "cc/playback/display_list_raster_source.h"
22 #include "cc/tiles/prioritized_tile.h" 21 #include "cc/tiles/prioritized_tile.h"
23 #include "cc/tiles/tile.h" 22 #include "cc/tiles/tile.h"
24 #include "cc/tiles/tile_priority.h" 23 #include "cc/tiles/tile_priority.h"
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 const int j = info.tiling_j_index; 109 const int j = info.tiling_j_index;
111 TileMapKey key(i, j); 110 TileMapKey key(i, j);
112 DCHECK(tiles_.find(key) == tiles_.end()); 111 DCHECK(tiles_.find(key) == tiles_.end());
113 112
114 if (!raster_source_->CoversRect(info.enclosing_layer_rect)) 113 if (!raster_source_->CoversRect(info.enclosing_layer_rect))
115 return nullptr; 114 return nullptr;
116 115
117 all_tiles_done_ = false; 116 all_tiles_done_ = false;
118 ScopedTilePtr tile = client_->CreateTile(info); 117 ScopedTilePtr tile = client_->CreateTile(info);
119 Tile* raw_ptr = tile.get(); 118 Tile* raw_ptr = tile.get();
120 tiles_.add(key, std::move(tile)); 119 tiles_[key] = std::move(tile);
121 return raw_ptr; 120 return raw_ptr;
122 } 121 }
123 122
124 void PictureLayerTiling::CreateMissingTilesInLiveTilesRect() { 123 void PictureLayerTiling::CreateMissingTilesInLiveTilesRect() {
125 const PictureLayerTiling* active_twin = 124 const PictureLayerTiling* active_twin =
126 tree_ == PENDING_TREE ? client_->GetPendingOrActiveTwinTiling(this) 125 tree_ == PENDING_TREE ? client_->GetPendingOrActiveTwinTiling(this)
127 : nullptr; 126 : nullptr;
128 const Region* invalidation = 127 const Region* invalidation =
129 active_twin ? client_->GetPendingInvalidation() : nullptr; 128 active_twin ? client_->GetPendingInvalidation() : nullptr;
130 129
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 create_missing_tiles = true; 178 create_missing_tiles = true;
180 } else { 179 } else {
181 SetLiveTilesRect(pending_twin->live_tiles_rect()); 180 SetLiveTilesRect(pending_twin->live_tiles_rect());
182 } 181 }
183 182
184 if (tiles_.empty()) { 183 if (tiles_.empty()) {
185 tiles_.swap(pending_twin->tiles_); 184 tiles_.swap(pending_twin->tiles_);
186 all_tiles_done_ = pending_twin->all_tiles_done_; 185 all_tiles_done_ = pending_twin->all_tiles_done_;
187 } else { 186 } else {
188 while (!pending_twin->tiles_.empty()) { 187 while (!pending_twin->tiles_.empty()) {
189 TileMapKey key = pending_twin->tiles_.begin()->first; 188 auto iter = pending_twin->tiles_.begin();
danakj 2016/01/14 21:12:32 nit: pending_iter?
davidben 2016/01/21 01:33:57 Done.
190 tiles_.set(key, pending_twin->tiles_.take_and_erase(key)); 189 tiles_[iter->first] = std::move(iter->second);
190 pending_twin->tiles_.erase(iter);
191 } 191 }
192 all_tiles_done_ &= pending_twin->all_tiles_done_; 192 all_tiles_done_ &= pending_twin->all_tiles_done_;
193 } 193 }
194 DCHECK(pending_twin->tiles_.empty()); 194 DCHECK(pending_twin->tiles_.empty());
195 pending_twin->all_tiles_done_ = true; 195 pending_twin->all_tiles_done_ = true;
196 196
197 if (create_missing_tiles) 197 if (create_missing_tiles)
198 CreateMissingTilesInLiveTilesRect(); 198 CreateMissingTilesInLiveTilesRect();
199 199
200 VerifyLiveTilesRect(false); 200 VerifyLiveTilesRect(false);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 DCHECK(tree_ != ACTIVE_TREE || !client_->GetPendingOrActiveTwinTiling(this)); 289 DCHECK(tree_ != ACTIVE_TREE || !client_->GetPendingOrActiveTwinTiling(this));
290 RemoveTilesInRegion(layer_invalidation, true /* recreate tiles */); 290 RemoveTilesInRegion(layer_invalidation, true /* recreate tiles */);
291 } 291 }
292 292
293 void PictureLayerTiling::RemoveTilesInRegion(const Region& layer_invalidation, 293 void PictureLayerTiling::RemoveTilesInRegion(const Region& layer_invalidation,
294 bool recreate_tiles) { 294 bool recreate_tiles) {
295 // We only invalidate the active tiling when it's orphaned: it has no pending 295 // We only invalidate the active tiling when it's orphaned: it has no pending
296 // twin, so it's slated for removal in the future. 296 // twin, so it's slated for removal in the future.
297 if (live_tiles_rect_.IsEmpty()) 297 if (live_tiles_rect_.IsEmpty())
298 return; 298 return;
299 // Pick 16 for the size of the SmallMap before it promotes to a hash_map. 299 // Pick 16 for the size of the SmallMap before it promotes to a unordered_map.
300 // 4x4 tiles should cover most small invalidations, and walking a vector of 300 // 4x4 tiles should cover most small invalidations, and walking a vector of
301 // 16 is fast enough. If an invalidation is huge we will fall back to a 301 // 16 is fast enough. If an invalidation is huge we will fall back to a
302 // hash_map instead of a vector in the SmallMap. 302 // unordered_map instead of a vector in the SmallMap.
303 base::SmallMap<base::hash_map<TileMapKey, gfx::Rect>, 16> remove_tiles; 303 base::SmallMap<std::unordered_map<TileMapKey, gfx::Rect, TileMapKeyHash>, 16>
304 remove_tiles;
304 gfx::Rect expanded_live_tiles_rect = 305 gfx::Rect expanded_live_tiles_rect =
305 tiling_data_.ExpandRectToTileBounds(live_tiles_rect_); 306 tiling_data_.ExpandRectToTileBounds(live_tiles_rect_);
306 for (Region::Iterator iter(layer_invalidation); iter.has_rect(); 307 for (Region::Iterator iter(layer_invalidation); iter.has_rect();
307 iter.next()) { 308 iter.next()) {
308 gfx::Rect layer_rect = iter.rect(); 309 gfx::Rect layer_rect = iter.rect();
309 // The pixels which are invalid in content space. 310 // The pixels which are invalid in content space.
310 gfx::Rect invalid_content_rect = 311 gfx::Rect invalid_content_rect =
311 gfx::ScaleToEnclosingRect(layer_rect, contents_scale_); 312 gfx::ScaleToEnclosingRect(layer_rect, contents_scale_);
312 gfx::Rect coverage_content_rect = invalid_content_rect; 313 gfx::Rect coverage_content_rect = invalid_content_rect;
313 // Avoid needless work by not bothering to invalidate where there aren't 314 // Avoid needless work by not bothering to invalidate where there aren't
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 return texture_rect; 541 return texture_rect;
541 texture_rect.Offset(-tex_origin.OffsetFromOrigin()); 542 texture_rect.Offset(-tex_origin.OffsetFromOrigin());
542 543
543 return texture_rect; 544 return texture_rect;
544 } 545 }
545 546
546 ScopedTilePtr PictureLayerTiling::TakeTileAt(int i, int j) { 547 ScopedTilePtr PictureLayerTiling::TakeTileAt(int i, int j) {
547 TileMap::iterator found = tiles_.find(TileMapKey(i, j)); 548 TileMap::iterator found = tiles_.find(TileMapKey(i, j));
548 if (found == tiles_.end()) 549 if (found == tiles_.end())
549 return nullptr; 550 return nullptr;
550 return tiles_.take_and_erase(found); 551 ScopedTilePtr result = std::move(found->second);
552 tiles_.erase(found);
553 return result;
551 } 554 }
552 555
553 bool PictureLayerTiling::RemoveTileAt(int i, int j) { 556 bool PictureLayerTiling::RemoveTileAt(int i, int j) {
554 TileMap::iterator found = tiles_.find(TileMapKey(i, j)); 557 TileMap::iterator found = tiles_.find(TileMapKey(i, j));
555 if (found == tiles_.end()) 558 if (found == tiles_.end())
556 return false; 559 return false;
557 tiles_.erase(found); 560 tiles_.erase(found);
558 return true; 561 return true;
559 } 562 }
560 563
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
927 930
928 return PrioritizedTile(tile, raster_source(), 931 return PrioritizedTile(tile, raster_source(),
929 ComputePriorityForTile(tile, priority_rect_type), 932 ComputePriorityForTile(tile, priority_rect_type),
930 IsTileOccluded(tile)); 933 IsTileOccluded(tile));
931 } 934 }
932 935
933 std::map<const Tile*, PrioritizedTile> 936 std::map<const Tile*, PrioritizedTile>
934 PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() const { 937 PictureLayerTiling::UpdateAndGetAllPrioritizedTilesForTesting() const {
935 std::map<const Tile*, PrioritizedTile> result; 938 std::map<const Tile*, PrioritizedTile> result;
936 for (const auto& key_tile_pair : tiles_) { 939 for (const auto& key_tile_pair : tiles_) {
937 Tile* tile = key_tile_pair.second; 940 Tile* tile = key_tile_pair.second.get();
938 UpdateRequiredStatesOnTile(tile); 941 UpdateRequiredStatesOnTile(tile);
939 PrioritizedTile prioritized_tile = 942 PrioritizedTile prioritized_tile =
940 MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile)); 943 MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile));
941 result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile)); 944 result.insert(std::make_pair(prioritized_tile.tile(), prioritized_tile));
942 } 945 }
943 return result; 946 return result;
944 } 947 }
945 948
946 TilePriority PictureLayerTiling::ComputePriorityForTile( 949 TilePriority PictureLayerTiling::ComputePriorityForTile(
947 const Tile* tile, 950 const Tile* tile,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 if (current_soon_border_rect_.Intersects(tile_bounds)) 1001 if (current_soon_border_rect_.Intersects(tile_bounds))
999 return SOON_BORDER_RECT; 1002 return SOON_BORDER_RECT;
1000 1003
1001 DCHECK(current_eventually_rect_.Intersects(tile_bounds)); 1004 DCHECK(current_eventually_rect_.Intersects(tile_bounds));
1002 return EVENTUALLY_RECT; 1005 return EVENTUALLY_RECT;
1003 } 1006 }
1004 1007
1005 void PictureLayerTiling::GetAllPrioritizedTilesForTracing( 1008 void PictureLayerTiling::GetAllPrioritizedTilesForTracing(
1006 std::vector<PrioritizedTile>* prioritized_tiles) const { 1009 std::vector<PrioritizedTile>* prioritized_tiles) const {
1007 for (const auto& tile_pair : tiles_) { 1010 for (const auto& tile_pair : tiles_) {
1008 Tile* tile = tile_pair.second; 1011 Tile* tile = tile_pair.second.get();
1009 prioritized_tiles->push_back( 1012 prioritized_tiles->push_back(
1010 MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile))); 1013 MakePrioritizedTile(tile, ComputePriorityRectTypeForTile(tile)));
1011 } 1014 }
1012 } 1015 }
1013 1016
1014 void PictureLayerTiling::AsValueInto( 1017 void PictureLayerTiling::AsValueInto(
1015 base::trace_event::TracedValue* state) const { 1018 base::trace_event::TracedValue* state) const {
1016 state->SetInteger("num_tiles", base::saturated_cast<int>(tiles_.size())); 1019 state->SetInteger("num_tiles", base::saturated_cast<int>(tiles_.size()));
1017 state->SetDouble("content_scale", contents_scale_); 1020 state->SetDouble("content_scale", contents_scale_);
1018 MathUtil::AddToTracedValue("visible_rect", current_visible_rect_, state); 1021 MathUtil::AddToTracedValue("visible_rect", current_visible_rect_, state);
1019 MathUtil::AddToTracedValue("skewport_rect", current_skewport_rect_, state); 1022 MathUtil::AddToTracedValue("skewport_rect", current_skewport_rect_, state);
1020 MathUtil::AddToTracedValue("soon_rect", current_soon_border_rect_, state); 1023 MathUtil::AddToTracedValue("soon_rect", current_soon_border_rect_, state);
1021 MathUtil::AddToTracedValue("eventually_rect", current_eventually_rect_, 1024 MathUtil::AddToTracedValue("eventually_rect", current_eventually_rect_,
1022 state); 1025 state);
1023 MathUtil::AddToTracedValue("tiling_size", tiling_size(), state); 1026 MathUtil::AddToTracedValue("tiling_size", tiling_size(), state);
1024 } 1027 }
1025 1028
1026 size_t PictureLayerTiling::GPUMemoryUsageInBytes() const { 1029 size_t PictureLayerTiling::GPUMemoryUsageInBytes() const {
1027 size_t amount = 0; 1030 size_t amount = 0;
1028 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 1031 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
1029 const Tile* tile = it->second; 1032 const Tile* tile = it->second.get();
1030 amount += tile->GPUMemoryUsageInBytes(); 1033 amount += tile->GPUMemoryUsageInBytes();
1031 } 1034 }
1032 return amount; 1035 return amount;
1033 } 1036 }
1034 1037
1035 } // namespace cc 1038 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698