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

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

Issue 2612413003: Clean up tile deletion (Closed)
Patch Set: Use plain unique_ptr for tiles Created 3 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
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_perftest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/tile_manager.h" 5 #include "cc/tiles/tile_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 scoped_refptr<RasterSource> raster_source, 86 scoped_refptr<RasterSource> raster_source,
87 const RasterSource::PlaybackSettings& playback_settings, 87 const RasterSource::PlaybackSettings& playback_settings,
88 TileResolution tile_resolution, 88 TileResolution tile_resolution,
89 gfx::Rect invalidated_rect, 89 gfx::Rect invalidated_rect,
90 uint64_t source_prepare_tiles_id, 90 uint64_t source_prepare_tiles_id,
91 std::unique_ptr<RasterBuffer> raster_buffer, 91 std::unique_ptr<RasterBuffer> raster_buffer,
92 TileTask::Vector* dependencies, 92 TileTask::Vector* dependencies,
93 bool is_gpu_rasterization) 93 bool is_gpu_rasterization)
94 : TileTask(!is_gpu_rasterization, dependencies), 94 : TileTask(!is_gpu_rasterization, dependencies),
95 tile_manager_(tile_manager), 95 tile_manager_(tile_manager),
96 tile_(tile), 96 tile_id_(tile->id()),
97 resource_(resource), 97 resource_(resource),
98 raster_source_(std::move(raster_source)), 98 raster_source_(std::move(raster_source)),
99 content_rect_(tile->content_rect()), 99 content_rect_(tile->content_rect()),
100 invalid_content_rect_(invalidated_rect), 100 invalid_content_rect_(invalidated_rect),
101 raster_scales_(tile->raster_scales()), 101 raster_scales_(tile->raster_scales()),
102 playback_settings_(playback_settings), 102 playback_settings_(playback_settings),
103 tile_resolution_(tile_resolution), 103 tile_resolution_(tile_resolution),
104 layer_id_(tile->layer_id()), 104 layer_id_(tile->layer_id()),
105 source_prepare_tiles_id_(source_prepare_tiles_id), 105 source_prepare_tiles_id_(source_prepare_tiles_id),
106 tile_tracing_id_(static_cast<void*>(tile)), 106 tile_tracing_id_(static_cast<void*>(tile)),
(...skipping 24 matching lines...) Expand all
131 raster_scales_, playback_settings_); 131 raster_scales_, playback_settings_);
132 } 132 }
133 133
134 // Overridden from TileTask: 134 // Overridden from TileTask:
135 void OnTaskCompleted() override { 135 void OnTaskCompleted() override {
136 DCHECK(origin_thread_checker_.CalledOnValidThread()); 136 DCHECK(origin_thread_checker_.CalledOnValidThread());
137 137
138 // Here calling state().IsCanceled() is thread-safe, because this task is 138 // Here calling state().IsCanceled() is thread-safe, because this task is
139 // already concluded as FINISHED or CANCELLED and no longer will be worked 139 // already concluded as FINISHED or CANCELLED and no longer will be worked
140 // upon by task graph runner. 140 // upon by task graph runner.
141 tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_, 141 tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_id_,
142 resource_, state().IsCanceled()); 142 resource_, state().IsCanceled());
143 } 143 }
144 144
145 protected: 145 protected:
146 ~RasterTaskImpl() override { 146 ~RasterTaskImpl() override {
147 DCHECK(origin_thread_checker_.CalledOnValidThread()); 147 DCHECK(origin_thread_checker_.CalledOnValidThread());
148 DCHECK(!raster_buffer_); 148 DCHECK(!raster_buffer_);
149 } 149 }
150 150
151 private: 151 private:
152 base::ThreadChecker origin_thread_checker_; 152 base::ThreadChecker origin_thread_checker_;
153 153
154 // The following members are needed for processing completion of this task on 154 // The following members are needed for processing completion of this task on
155 // origin thread. These are not thread-safe and should be accessed only in 155 // origin thread. These are not thread-safe and should be accessed only in
156 // origin thread. Ensure their access by checking CalledOnValidThread(). 156 // origin thread. Ensure their access by checking CalledOnValidThread().
157 TileManager* tile_manager_; 157 TileManager* tile_manager_;
158 Tile* tile_; 158 Tile::Id tile_id_;
159 Resource* resource_; 159 Resource* resource_;
160 160
161 // The following members should be used for running the task. 161 // The following members should be used for running the task.
162 scoped_refptr<RasterSource> raster_source_; 162 scoped_refptr<RasterSource> raster_source_;
163 gfx::Rect content_rect_; 163 gfx::Rect content_rect_;
164 gfx::Rect invalid_content_rect_; 164 gfx::Rect invalid_content_rect_;
165 gfx::SizeF raster_scales_; 165 gfx::SizeF raster_scales_;
166 RasterSource::PlaybackSettings playback_settings_; 166 RasterSource::PlaybackSettings playback_settings_;
167 TileResolution tile_resolution_; 167 TileResolution tile_resolution_;
168 int layer_id_; 168 int layer_id_;
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 global_state_ = GlobalStateThatImpactsTilePriority(); 381 global_state_ = GlobalStateThatImpactsTilePriority();
382 382
383 // This cancels tasks if possible, finishes pending tasks, and release any 383 // This cancels tasks if possible, finishes pending tasks, and release any
384 // uninitialized resources. 384 // uninitialized resources.
385 tile_task_manager_->Shutdown(); 385 tile_task_manager_->Shutdown();
386 386
387 raster_buffer_provider_->Shutdown(); 387 raster_buffer_provider_->Shutdown();
388 388
389 tile_task_manager_->CheckForCompletedTasks(); 389 tile_task_manager_->CheckForCompletedTasks();
390 390
391 FreeResourcesForReleasedTiles();
392 CleanUpReleasedTiles();
393
394 tile_task_manager_ = nullptr; 391 tile_task_manager_ = nullptr;
395 resource_pool_ = nullptr; 392 resource_pool_ = nullptr;
396 more_tiles_need_prepare_check_notifier_.Cancel(); 393 more_tiles_need_prepare_check_notifier_.Cancel();
397 signals_check_notifier_.Cancel(); 394 signals_check_notifier_.Cancel();
398 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 395 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
399 raster_buffer_provider_ = nullptr; 396 raster_buffer_provider_ = nullptr;
400 397
401 image_controller_.SetImageDecodeCache(nullptr); 398 image_controller_.SetImageDecodeCache(nullptr);
402 locked_image_tasks_.clear(); 399 locked_image_tasks_.clear();
403 } 400 }
404 401
405 void TileManager::SetResources(ResourcePool* resource_pool, 402 void TileManager::SetResources(ResourcePool* resource_pool,
406 ImageDecodeCache* image_decode_cache, 403 ImageDecodeCache* image_decode_cache,
407 TaskGraphRunner* task_graph_runner, 404 TaskGraphRunner* task_graph_runner,
408 RasterBufferProvider* raster_buffer_provider, 405 RasterBufferProvider* raster_buffer_provider,
409 size_t scheduled_raster_task_limit, 406 size_t scheduled_raster_task_limit,
410 bool use_gpu_rasterization) { 407 bool use_gpu_rasterization) {
411 DCHECK(!tile_task_manager_); 408 DCHECK(!tile_task_manager_);
412 DCHECK(task_graph_runner); 409 DCHECK(task_graph_runner);
413 410
414 use_gpu_rasterization_ = use_gpu_rasterization; 411 use_gpu_rasterization_ = use_gpu_rasterization;
415 scheduled_raster_task_limit_ = scheduled_raster_task_limit; 412 scheduled_raster_task_limit_ = scheduled_raster_task_limit;
416 resource_pool_ = resource_pool; 413 resource_pool_ = resource_pool;
417 image_controller_.SetImageDecodeCache(image_decode_cache); 414 image_controller_.SetImageDecodeCache(image_decode_cache);
418 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner); 415 tile_task_manager_ = TileTaskManagerImpl::Create(task_graph_runner);
419 raster_buffer_provider_ = raster_buffer_provider; 416 raster_buffer_provider_ = raster_buffer_provider;
420 } 417 }
421 418
422 void TileManager::Release(Tile* tile) { 419 void TileManager::Release(Tile* tile) {
423 released_tiles_.push_back(tile); 420 FreeResourcesForTile(tile);
424 } 421 tiles_.erase(tile->id());
425
426 void TileManager::FreeResourcesForReleasedTiles() {
427 for (auto* tile : released_tiles_)
428 FreeResourcesForTile(tile);
429 }
430
431 void TileManager::CleanUpReleasedTiles() {
432 std::vector<Tile*> tiles_to_retain;
433 for (auto* tile : released_tiles_) {
434 if (tile->HasRasterTask()) {
435 tiles_to_retain.push_back(tile);
436 continue;
437 }
438
439 DCHECK(!tile->draw_info().has_resource());
440 DCHECK(tiles_.find(tile->id()) != tiles_.end());
441 tiles_.erase(tile->id());
442
443 delete tile;
444 }
445 released_tiles_.swap(tiles_to_retain);
446 } 422 }
447 423
448 void TileManager::DidFinishRunningTileTasksRequiredForActivation() { 424 void TileManager::DidFinishRunningTileTasksRequiredForActivation() {
449 TRACE_EVENT0("cc", 425 TRACE_EVENT0("cc",
450 "TileManager::DidFinishRunningTileTasksRequiredForActivation"); 426 "TileManager::DidFinishRunningTileTasksRequiredForActivation");
451 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state", 427 TRACE_EVENT_ASYNC_STEP_INTO1("cc", "ScheduledTasks", this, "running", "state",
452 ScheduledTasksStateAsValue()); 428 ScheduledTasksStateAsValue());
453 // TODO(vmpstr): Temporary check to debug crbug.com/642927. 429 // TODO(vmpstr): Temporary check to debug crbug.com/642927.
454 CHECK(tile_task_manager_); 430 CHECK(tile_task_manager_);
455 signals_.ready_to_activate = true; 431 signals_.ready_to_activate = true;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 signals_.reset(); 481 signals_.reset();
506 global_state_ = state; 482 global_state_ = state;
507 483
508 // We need to call CheckForCompletedTasks() once in-between each call 484 // We need to call CheckForCompletedTasks() once in-between each call
509 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 485 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
510 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 486 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
511 tile_task_manager_->CheckForCompletedTasks(); 487 tile_task_manager_->CheckForCompletedTasks();
512 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 488 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
513 } 489 }
514 490
515 FreeResourcesForReleasedTiles();
516 CleanUpReleasedTiles();
517
518 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles(); 491 PrioritizedWorkToSchedule prioritized_work = AssignGpuMemoryToTiles();
519 492
520 // Inform the client that will likely require a draw if the highest priority 493 // Inform the client that will likely require a draw if the highest priority
521 // tile that will be rasterized is required for draw. 494 // tile that will be rasterized is required for draw.
522 client_->SetIsLikelyToRequireADraw( 495 client_->SetIsLikelyToRequireADraw(
523 !prioritized_work.tiles_to_raster.empty() && 496 !prioritized_work.tiles_to_raster.empty() &&
524 prioritized_work.tiles_to_raster.front().tile()->required_for_draw()); 497 prioritized_work.tiles_to_raster.front().tile()->required_for_draw());
525 498
526 // Schedule tile tasks. 499 // Schedule tile tasks.
527 ScheduleTasks(prioritized_work); 500 ScheduleTasks(prioritized_work);
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
1042 resource, resource_content_id, tile->invalidated_id()); 1015 resource, resource_content_id, tile->invalidated_id());
1043 return make_scoped_refptr(new RasterTaskImpl( 1016 return make_scoped_refptr(new RasterTaskImpl(
1044 this, tile, resource, prioritized_tile.raster_source(), playback_settings, 1017 this, tile, resource, prioritized_tile.raster_source(), playback_settings,
1045 prioritized_tile.priority().resolution, invalidated_rect, 1018 prioritized_tile.priority().resolution, invalidated_rect,
1046 prepare_tiles_count_, std::move(raster_buffer), &decode_tasks, 1019 prepare_tiles_count_, std::move(raster_buffer), &decode_tasks,
1047 use_gpu_rasterization_)); 1020 use_gpu_rasterization_));
1048 } 1021 }
1049 1022
1050 void TileManager::OnRasterTaskCompleted( 1023 void TileManager::OnRasterTaskCompleted(
1051 std::unique_ptr<RasterBuffer> raster_buffer, 1024 std::unique_ptr<RasterBuffer> raster_buffer,
1052 Tile* tile, 1025 Tile::Id tile_id,
1053 Resource* resource, 1026 Resource* resource,
1054 bool was_canceled) { 1027 bool was_canceled) {
1055 DCHECK(tile);
1056 DCHECK(tiles_.find(tile->id()) != tiles_.end());
1057 raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer)); 1028 raster_buffer_provider_->ReleaseBufferForRaster(std::move(raster_buffer));
1058 1029
1059 TileDrawInfo& draw_info = tile->draw_info(); 1030 auto found = tiles_.find(tile_id);
1060 DCHECK(tile->raster_task_.get()); 1031 Tile* tile = found != tiles_.end() ? found->second : nullptr;
vmpstr 2017/01/09 20:02:09 nit: can you structure it with one less conditiona
ericrk 2017/01/09 21:35:22 Done.
1061 tile->raster_task_ = nullptr; 1032
1033 if (tile) {
1034 DCHECK(tile->raster_task_.get());
1035 tile->raster_task_ = nullptr;
1036 }
1062 1037
1063 // Unref all the images. 1038 // Unref all the images.
1064 auto images_it = scheduled_draw_images_.find(tile->id()); 1039 auto images_it = scheduled_draw_images_.find(tile_id);
1065 image_controller_.UnrefImages(images_it->second); 1040 image_controller_.UnrefImages(images_it->second);
1066 scheduled_draw_images_.erase(images_it); 1041 scheduled_draw_images_.erase(images_it);
1067 1042
1068 if (was_canceled) { 1043 if (was_canceled) {
1069 ++flush_stats_.canceled_count; 1044 ++flush_stats_.canceled_count;
1070 resource_pool_->ReleaseResource(resource); 1045 resource_pool_->ReleaseResource(resource);
1071 return; 1046 return;
1072 } 1047 }
1073 1048
1074 resource_pool_->OnContentReplaced(resource->id(), tile->id()); 1049 resource_pool_->OnContentReplaced(resource->id(), tile_id);
1075 ++flush_stats_.completed_count; 1050 ++flush_stats_.completed_count;
1076 1051
1077 draw_info.set_use_resource(); 1052 if (tile) {
1078 draw_info.resource_ = resource; 1053 TileDrawInfo& draw_info = tile->draw_info();
1079 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); 1054 draw_info.set_use_resource();
1055 draw_info.resource_ = resource;
1056 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
1080 1057
1081 DCHECK(draw_info.IsReadyToDraw()); 1058 DCHECK(draw_info.IsReadyToDraw());
1082 draw_info.set_was_ever_ready_to_draw(); 1059 draw_info.set_was_ever_ready_to_draw();
1083 1060 client_->NotifyTileStateChanged(tile);
1084 client_->NotifyTileStateChanged(tile); 1061 }
1085 } 1062 }
1086 1063
1087 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, 1064 std::unique_ptr<Tile> TileManager::CreateTile(const Tile::CreateInfo& info,
1088 int layer_id, 1065 int layer_id,
1089 int source_frame_number, 1066 int source_frame_number,
1090 int flags) { 1067 int flags) {
1091 // We need to have a tile task worker pool to do anything meaningful with 1068 // We need to have a tile task worker pool to do anything meaningful with
1092 // tiles. 1069 // tiles.
1093 DCHECK(tile_task_manager_); 1070 DCHECK(tile_task_manager_);
1094 ScopedTilePtr tile( 1071 std::unique_ptr<Tile> tile(
vmpstr 2017/01/09 20:02:09 nit: can you make this auto tile = base::MakeUniq
ericrk 2017/01/09 21:35:22 Constructor is private, which stops this from work
1095 new Tile(this, info, layer_id, source_frame_number, flags)); 1072 new Tile(this, info, layer_id, source_frame_number, flags));
1096 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 1073 DCHECK(tiles_.find(tile->id()) == tiles_.end());
1097 1074
1098 tiles_[tile->id()] = tile.get(); 1075 tiles_[tile->id()] = tile.get();
1099 return tile; 1076 return tile;
1100 } 1077 }
1101 1078
1102 bool TileManager::AreRequiredTilesReadyToDraw( 1079 bool TileManager::AreRequiredTilesReadyToDraw(
1103 RasterTilePriorityQueue::Type type) const { 1080 RasterTilePriorityQueue::Type type) const {
1104 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( 1081 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue(
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
1203 } 1180 }
1204 1181
1205 // If we're not in SMOOTHNESS_TAKES_PRIORITY mode, we should unlock all 1182 // If we're not in SMOOTHNESS_TAKES_PRIORITY mode, we should unlock all
1206 // images since we're technically going idle here at least for this frame. 1183 // images since we're technically going idle here at least for this frame.
1207 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) { 1184 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) {
1208 image_controller_.SetPredecodeImages(std::vector<DrawImage>(), 1185 image_controller_.SetPredecodeImages(std::vector<DrawImage>(),
1209 ImageDecodeCache::TracingInfo()); 1186 ImageDecodeCache::TracingInfo());
1210 locked_image_tasks_.clear(); 1187 locked_image_tasks_.clear();
1211 } 1188 }
1212 1189
1213 FreeResourcesForReleasedTiles();
1214
1215 resource_pool_->ReduceResourceUsage(); 1190 resource_pool_->ReduceResourceUsage();
1216 image_controller_.ReduceMemoryUsage(); 1191 image_controller_.ReduceMemoryUsage();
1217 1192
1218 // TODO(vmpstr): Temporary check to debug crbug.com/642927. 1193 // TODO(vmpstr): Temporary check to debug crbug.com/642927.
1219 CHECK(tile_task_manager_); 1194 CHECK(tile_task_manager_);
1220 signals_.all_tile_tasks_completed = true; 1195 signals_.all_tile_tasks_completed = true;
1221 signals_check_notifier_.Schedule(); 1196 signals_check_notifier_.Schedule();
1222 1197
1223 // We don't reserve memory for required-for-activation tiles during 1198 // We don't reserve memory for required-for-activation tiles during
1224 // accelerated gestures, so we just postpone activation when we don't 1199 // accelerated gestures, so we just postpone activation when we don't
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1382 all_tile_tasks_completed = false; 1357 all_tile_tasks_completed = false;
1383 did_notify_all_tile_tasks_completed = false; 1358 did_notify_all_tile_tasks_completed = false;
1384 } 1359 }
1385 1360
1386 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default; 1361 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule() = default;
1387 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule( 1362 TileManager::PrioritizedWorkToSchedule::PrioritizedWorkToSchedule(
1388 PrioritizedWorkToSchedule&& other) = default; 1363 PrioritizedWorkToSchedule&& other) = default;
1389 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default; 1364 TileManager::PrioritizedWorkToSchedule::~PrioritizedWorkToSchedule() = default;
1390 1365
1391 } // namespace cc 1366 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tiles/tile_manager.h ('k') | cc/tiles/tile_manager_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698