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

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

Issue 1210073020: Reland (2): cc: Make tile manager object persist for the length of LTHI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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/tile_manager.h" 5 #include "cc/tiles/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 base::saturated_cast<int>(stats.completed_count)); 221 base::saturated_cast<int>(stats.completed_count));
222 state->SetInteger("canceled_count", 222 state->SetInteger("canceled_count",
223 base::saturated_cast<int>(stats.canceled_count)); 223 base::saturated_cast<int>(stats.canceled_count));
224 return state; 224 return state;
225 } 225 }
226 226
227 // static 227 // static
228 scoped_ptr<TileManager> TileManager::Create( 228 scoped_ptr<TileManager> TileManager::Create(
229 TileManagerClient* client, 229 TileManagerClient* client,
230 base::SequencedTaskRunner* task_runner, 230 base::SequencedTaskRunner* task_runner,
231 ResourcePool* resource_pool,
232 TileTaskRunner* tile_task_runner,
233 size_t scheduled_raster_task_limit) { 231 size_t scheduled_raster_task_limit) {
234 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, 232 return make_scoped_ptr(
235 tile_task_runner, 233 new TileManager(client, task_runner, scheduled_raster_task_limit));
236 scheduled_raster_task_limit));
237 } 234 }
238 235
239 TileManager::TileManager( 236 TileManager::TileManager(
240 TileManagerClient* client, 237 TileManagerClient* client,
241 const scoped_refptr<base::SequencedTaskRunner>& task_runner, 238 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
242 ResourcePool* resource_pool,
243 TileTaskRunner* tile_task_runner,
244 size_t scheduled_raster_task_limit) 239 size_t scheduled_raster_task_limit)
245 : client_(client), 240 : client_(client),
246 task_runner_(task_runner), 241 task_runner_(task_runner),
247 resource_pool_(resource_pool), 242 resource_pool_(nullptr),
248 tile_task_runner_(tile_task_runner), 243 tile_task_runner_(nullptr),
249 scheduled_raster_task_limit_(scheduled_raster_task_limit), 244 scheduled_raster_task_limit_(scheduled_raster_task_limit),
250 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), 245 all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
251 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 246 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
252 did_oom_on_last_assign_(false), 247 did_oom_on_last_assign_(false),
253 more_tiles_need_prepare_check_notifier_( 248 more_tiles_need_prepare_check_notifier_(
254 task_runner_.get(), 249 task_runner_.get(),
255 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, 250 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared,
256 base::Unretained(this))), 251 base::Unretained(this))),
257 signals_check_notifier_(task_runner_.get(), 252 signals_check_notifier_(task_runner_.get(),
258 base::Bind(&TileManager::CheckAndIssueSignals, 253 base::Bind(&TileManager::CheckAndIssueSignals,
259 base::Unretained(this))), 254 base::Unretained(this))),
260 has_scheduled_tile_tasks_(false), 255 has_scheduled_tile_tasks_(false),
261 prepare_tiles_count_(0u) { 256 prepare_tiles_count_(0u) {
262 tile_task_runner_->SetClient(this);
263 } 257 }
264 258
265 TileManager::~TileManager() { 259 TileManager::~TileManager() {
266 // Reset global state and manage. This should cause 260 }
enne (OOO) 2015/07/06 18:07:25 Should this call FinishTasksAndCleanUp? Or at leas
vmpstr 2015/07/06 18:41:35 Done.
267 // our memory usage to drop to zero. 261
262 void TileManager::FinishTasksAndCleanUp() {
263 if (!tile_task_runner_)
264 return;
265
268 global_state_ = GlobalStateThatImpactsTilePriority(); 266 global_state_ = GlobalStateThatImpactsTilePriority();
269 267
270 TileTaskQueue empty; 268 TileTaskQueue empty;
271 tile_task_runner_->ScheduleTasks(&empty); 269 tile_task_runner_->ScheduleTasks(&empty);
272 orphan_raster_tasks_.clear(); 270 orphan_raster_tasks_.clear();
273 271
274 // This should finish all pending tasks and release any uninitialized 272 // This should finish all pending tasks and release any uninitialized
275 // resources. 273 // resources.
276 tile_task_runner_->Shutdown(); 274 tile_task_runner_->Shutdown();
277 tile_task_runner_->CheckForCompletedTasks(); 275 tile_task_runner_->CheckForCompletedTasks();
278 276
279 FreeResourcesForReleasedTiles(); 277 FreeResourcesForReleasedTiles();
280 CleanUpReleasedTiles(); 278 CleanUpReleasedTiles();
279
280 tile_task_runner_ = nullptr;
281 resource_pool_ = nullptr;
282 more_tiles_need_prepare_check_notifier_.Cancel();
283 signals_check_notifier_.Cancel();
284 }
285
286 void TileManager::SetResources(ResourcePool* resource_pool,
287 TileTaskRunner* tile_task_runner) {
288 DCHECK(!tile_task_runner_);
289 DCHECK(tile_task_runner);
290
291 resource_pool_ = resource_pool;
292 tile_task_runner_ = tile_task_runner;
293 tile_task_runner_->SetClient(this);
281 } 294 }
282 295
283 void TileManager::Release(Tile* tile) { 296 void TileManager::Release(Tile* tile) {
284 released_tiles_.push_back(tile); 297 released_tiles_.push_back(tile);
285 } 298 }
286 299
287 TaskSetCollection TileManager::TasksThatShouldBeForcedToComplete() const { 300 TaskSetCollection TileManager::TasksThatShouldBeForcedToComplete() const {
288 TaskSetCollection tasks_that_should_be_forced_to_complete; 301 TaskSetCollection tasks_that_should_be_forced_to_complete;
289 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY) 302 if (global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY)
290 tasks_that_should_be_forced_to_complete[REQUIRED_FOR_ACTIVATION] = true; 303 tasks_that_should_be_forced_to_complete[REQUIRED_FOR_ACTIVATION] = true;
(...skipping 26 matching lines...) Expand all
317 } 330 }
318 331
319 delete tile; 332 delete tile;
320 } 333 }
321 released_tiles_.swap(tiles_to_retain); 334 released_tiles_.swap(tiles_to_retain);
322 } 335 }
323 336
324 void TileManager::DidFinishRunningTileTasks(TaskSet task_set) { 337 void TileManager::DidFinishRunningTileTasks(TaskSet task_set) {
325 TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set", 338 TRACE_EVENT1("cc", "TileManager::DidFinishRunningTileTasks", "task_set",
326 TaskSetName(task_set)); 339 TaskSetName(task_set));
340 DCHECK(resource_pool_);
341 DCHECK(tile_task_runner_);
327 342
328 switch (task_set) { 343 switch (task_set) {
329 case ALL: { 344 case ALL: {
330 has_scheduled_tile_tasks_ = false; 345 has_scheduled_tile_tasks_ = false;
331 346
332 bool memory_usage_above_limit = 347 bool memory_usage_above_limit =
333 resource_pool_->total_memory_usage_bytes() > 348 resource_pool_->total_memory_usage_bytes() >
334 global_state_.soft_memory_limit_in_bytes; 349 global_state_.soft_memory_limit_in_bytes;
335 350
336 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && 351 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ &&
(...skipping 16 matching lines...) Expand all
353 368
354 case REQUIRED_FOR_DRAW: 369 case REQUIRED_FOR_DRAW:
355 signals_.ready_to_draw = true; 370 signals_.ready_to_draw = true;
356 signals_check_notifier_.Schedule(); 371 signals_check_notifier_.Schedule();
357 return; 372 return;
358 } 373 }
359 374
360 NOTREACHED(); 375 NOTREACHED();
361 } 376 }
362 377
363 void TileManager::PrepareTiles( 378 bool TileManager::PrepareTiles(
364 const GlobalStateThatImpactsTilePriority& state) { 379 const GlobalStateThatImpactsTilePriority& state) {
365 ++prepare_tiles_count_; 380 ++prepare_tiles_count_;
366 381
367 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id", 382 TRACE_EVENT1("cc", "TileManager::PrepareTiles", "prepare_tiles_id",
368 prepare_tiles_count_); 383 prepare_tiles_count_);
369 384
385 if (!tile_task_runner_) {
386 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted",
387 TRACE_EVENT_SCOPE_THREAD);
388 return false;
389 }
390
370 signals_.reset(); 391 signals_.reset();
371 global_state_ = state; 392 global_state_ = state;
372 393
373 // We need to call CheckForCompletedTasks() once in-between each call 394 // We need to call CheckForCompletedTasks() once in-between each call
374 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 395 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
375 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 396 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
376 tile_task_runner_->CheckForCompletedTasks(); 397 tile_task_runner_->CheckForCompletedTasks();
377 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 398 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
378 } 399 }
379 400
(...skipping 16 matching lines...) Expand all
396 417
397 // Schedule tile tasks. 418 // Schedule tile tasks.
398 ScheduleTasks(tiles_that_need_to_be_rasterized); 419 ScheduleTasks(tiles_that_need_to_be_rasterized);
399 420
400 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD, 421 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
401 "state", BasicStateAsValue()); 422 "state", BasicStateAsValue());
402 423
403 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, 424 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
404 resource_pool_->total_memory_usage_bytes() - 425 resource_pool_->total_memory_usage_bytes() -
405 resource_pool_->acquired_memory_usage_bytes()); 426 resource_pool_->acquired_memory_usage_bytes());
427 return true;
406 } 428 }
407 429
408 void TileManager::Flush() { 430 void TileManager::Flush() {
409 TRACE_EVENT0("cc", "TileManager::Flush"); 431 TRACE_EVENT0("cc", "TileManager::Flush");
410 432
433 if (!tile_task_runner_) {
434 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD);
435 return;
436 }
437
411 tile_task_runner_->CheckForCompletedTasks(); 438 tile_task_runner_->CheckForCompletedTasks();
412 439
413 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 440 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
414 441
415 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", 442 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
416 RasterTaskCompletionStatsAsValue(flush_stats_)); 443 RasterTaskCompletionStatsAsValue(flush_stats_));
417 flush_stats_ = RasterTaskCompletionStats(); 444 flush_stats_ = RasterTaskCompletionStats();
418 } 445 }
419 446
420 scoped_refptr<base::trace_event::ConvertableToTraceFormat> 447 scoped_refptr<base::trace_event::ConvertableToTraceFormat>
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
497 NOTREACHED(); 524 NOTREACHED();
498 return true; 525 return true;
499 } 526 }
500 527
501 void TileManager::AssignGpuMemoryToTiles( 528 void TileManager::AssignGpuMemoryToTiles(
502 RasterTilePriorityQueue* raster_priority_queue, 529 RasterTilePriorityQueue* raster_priority_queue,
503 size_t scheduled_raster_task_limit, 530 size_t scheduled_raster_task_limit,
504 PrioritizedTileVector* tiles_that_need_to_be_rasterized) { 531 PrioritizedTileVector* tiles_that_need_to_be_rasterized) {
505 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); 532 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles");
506 533
534 DCHECK(resource_pool_);
535 DCHECK(tile_task_runner_);
536
507 // Maintain the list of released resources that can potentially be re-used 537 // Maintain the list of released resources that can potentially be re-used
508 // or deleted. If this operation becomes expensive too, only do this after 538 // or deleted. If this operation becomes expensive too, only do this after
509 // some resource(s) was returned. Note that in that case, one also need to 539 // some resource(s) was returned. Note that in that case, one also need to
510 // invalidate when releasing some resource from the pool. 540 // invalidate when releasing some resource from the pool.
511 resource_pool_->CheckBusyResources(false); 541 resource_pool_->CheckBusyResources(false);
512 542
513 // Now give memory out to the tiles until we're out, and build 543 // Now give memory out to the tiles until we're out, and build
514 // the needs-to-be-rasterized queue. 544 // the needs-to-be-rasterized queue.
515 unsigned schedule_priority = 1u; 545 unsigned schedule_priority = 1u;
516 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; 546 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true;
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 844
815 client_->NotifyTileStateChanged(tile); 845 client_->NotifyTileStateChanged(tile);
816 } 846 }
817 847
818 ScopedTilePtr TileManager::CreateTile(const gfx::Size& desired_texture_size, 848 ScopedTilePtr TileManager::CreateTile(const gfx::Size& desired_texture_size,
819 const gfx::Rect& content_rect, 849 const gfx::Rect& content_rect,
820 float contents_scale, 850 float contents_scale,
821 int layer_id, 851 int layer_id,
822 int source_frame_number, 852 int source_frame_number,
823 int flags) { 853 int flags) {
854 // We need to have a tile task worker pool to do anything meaningful with
855 // tiles.
856 DCHECK(tile_task_runner_);
824 ScopedTilePtr tile(new Tile(this, desired_texture_size, content_rect, 857 ScopedTilePtr tile(new Tile(this, desired_texture_size, content_rect,
825 contents_scale, layer_id, source_frame_number, 858 contents_scale, layer_id, source_frame_number,
826 flags)); 859 flags));
827 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 860 DCHECK(tiles_.find(tile->id()) == tiles_.end());
828 861
829 tiles_[tile->id()] = tile.get(); 862 tiles_[tile->id()] = tile.get();
830 used_layer_counts_[tile->layer_id()]++; 863 used_layer_counts_[tile->layer_id()]++;
831 return tile; 864 return tile;
832 } 865 }
833 866
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 void TileManager::Signals::reset() { 1090 void TileManager::Signals::reset() {
1058 ready_to_activate = false; 1091 ready_to_activate = false;
1059 did_notify_ready_to_activate = false; 1092 did_notify_ready_to_activate = false;
1060 ready_to_draw = false; 1093 ready_to_draw = false;
1061 did_notify_ready_to_draw = false; 1094 did_notify_ready_to_draw = false;
1062 all_tile_tasks_completed = false; 1095 all_tile_tasks_completed = false;
1063 did_notify_all_tile_tasks_completed = false; 1096 did_notify_all_tile_tasks_completed = false;
1064 } 1097 }
1065 1098
1066 } // namespace cc 1099 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698