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

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

Issue 820743002: cc: GPU rasterize tiles synchronously in PrepareToDraw. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: readd the continue for tiles not required for draw Created 5 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/resources/tile_manager.h" 5 #include "cc/resources/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
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/debug/trace_event_argument.h" 12 #include "base/debug/trace_event_argument.h"
13 #include "base/json/json_writer.h" 13 #include "base/json/json_writer.h"
14 #include "base/logging.h" 14 #include "base/logging.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "cc/debug/devtools_instrumentation.h" 16 #include "cc/debug/devtools_instrumentation.h"
17 #include "cc/debug/frame_viewer_instrumentation.h" 17 #include "cc/debug/frame_viewer_instrumentation.h"
18 #include "cc/debug/traced_value.h" 18 #include "cc/debug/traced_value.h"
19 #include "cc/layers/picture_layer_impl.h" 19 #include "cc/layers/picture_layer_impl.h"
20 #include "cc/resources/raster_buffer.h" 20 #include "cc/resources/raster_buffer.h"
21 #include "cc/resources/rasterizer.h"
21 #include "cc/resources/tile.h" 22 #include "cc/resources/tile.h"
22 #include "cc/resources/tile_task_runner.h" 23 #include "cc/resources/tile_task_runner.h"
23 #include "ui/gfx/geometry/rect_conversions.h" 24 #include "ui/gfx/geometry/rect_conversions.h"
24 25
25 namespace cc { 26 namespace cc {
26 namespace { 27 namespace {
27 28
28 // Flag to indicate whether we should try and detect that 29 // Flag to indicate whether we should try and detect that
29 // a tile is of solid color. 30 // a tile is of solid color.
30 const bool kUseColorEstimator = true; 31 const bool kUseColorEstimator = true;
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 state->SetInteger("canceled_count", stats.canceled_count); 195 state->SetInteger("canceled_count", stats.canceled_count);
195 return state; 196 return state;
196 } 197 }
197 198
198 // static 199 // static
199 scoped_ptr<TileManager> TileManager::Create( 200 scoped_ptr<TileManager> TileManager::Create(
200 TileManagerClient* client, 201 TileManagerClient* client,
201 base::SequencedTaskRunner* task_runner, 202 base::SequencedTaskRunner* task_runner,
202 ResourcePool* resource_pool, 203 ResourcePool* resource_pool,
203 TileTaskRunner* tile_task_runner, 204 TileTaskRunner* tile_task_runner,
205 Rasterizer* rasterizer,
204 size_t scheduled_raster_task_limit) { 206 size_t scheduled_raster_task_limit) {
205 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool, 207 return make_scoped_ptr(new TileManager(client, task_runner, resource_pool,
206 tile_task_runner, 208 tile_task_runner, rasterizer,
207 scheduled_raster_task_limit)); 209 scheduled_raster_task_limit));
208 } 210 }
209 211
210 TileManager::TileManager( 212 TileManager::TileManager(
211 TileManagerClient* client, 213 TileManagerClient* client,
212 const scoped_refptr<base::SequencedTaskRunner>& task_runner, 214 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
213 ResourcePool* resource_pool, 215 ResourcePool* resource_pool,
214 TileTaskRunner* tile_task_runner, 216 TileTaskRunner* tile_task_runner,
217 Rasterizer* rasterizer,
215 size_t scheduled_raster_task_limit) 218 size_t scheduled_raster_task_limit)
216 : client_(client), 219 : client_(client),
217 task_runner_(task_runner), 220 task_runner_(task_runner),
218 resource_pool_(resource_pool), 221 resource_pool_(resource_pool),
219 tile_task_runner_(tile_task_runner), 222 tile_task_runner_(tile_task_runner),
223 rasterizer_(rasterizer),
220 scheduled_raster_task_limit_(scheduled_raster_task_limit), 224 scheduled_raster_task_limit_(scheduled_raster_task_limit),
221 all_tiles_that_need_to_be_rasterized_are_scheduled_(true), 225 all_tiles_that_need_to_be_rasterized_are_scheduled_(true),
222 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 226 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
223 did_oom_on_last_assign_(false), 227 did_oom_on_last_assign_(false),
228 ready_to_activate_notifier_(
vmpstr 2015/01/02 17:43:22 From my understanding, we use these notifiers if t
229 task_runner_.get(),
230 base::Bind(&TileManager::NotifyReadyToActivate,
231 base::Unretained(this))),
232 ready_to_draw_notifier_(
233 task_runner_.get(),
234 base::Bind(&TileManager::NotifyReadyToDraw, base::Unretained(this))),
224 ready_to_activate_check_notifier_( 235 ready_to_activate_check_notifier_(
225 task_runner_.get(), 236 task_runner_.get(),
226 base::Bind(&TileManager::CheckIfReadyToActivate, 237 base::Bind(&TileManager::CheckIfReadyToActivate,
227 base::Unretained(this))), 238 base::Unretained(this))),
228 ready_to_draw_check_notifier_( 239 ready_to_draw_check_notifier_(
229 task_runner_.get(), 240 task_runner_.get(),
230 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))), 241 base::Bind(&TileManager::CheckIfReadyToDraw, base::Unretained(this))),
231 more_tiles_need_prepare_check_notifier_( 242 more_tiles_need_prepare_check_notifier_(
232 task_runner_.get(), 243 task_runner_.get(),
233 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared, 244 base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 340
330 NOTREACHED(); 341 NOTREACHED();
331 } 342 }
332 343
333 void TileManager::PrepareTiles( 344 void TileManager::PrepareTiles(
334 const GlobalStateThatImpactsTilePriority& state) { 345 const GlobalStateThatImpactsTilePriority& state) {
335 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); 346 TRACE_EVENT0("cc", "TileManager::PrepareTiles");
336 347
337 global_state_ = state; 348 global_state_ = state;
338 349
339 // We need to call CheckForCompletedTasks() once in-between each call 350 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode();
340 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 351
341 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 352 // TODO(hendrikw): Consider moving some of this code to the rasterizer.
342 tile_task_runner_->CheckForCompletedTasks(); 353 if (prepare_tiles_mode != PrepareTilesMode::PREPARE_NONE) {
343 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 354 // We need to call CheckForCompletedTasks() once in-between each call
355 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
356 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
357 tile_task_runner_->CheckForCompletedTasks();
358 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
359 }
360
361 FreeResourcesForReleasedTiles();
362 CleanUpReleasedTiles();
363
364 TileVector tiles_that_need_to_be_rasterized;
365 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
366 scheduled_raster_task_limit_, false);
367
368 // Schedule tile tasks.
369 ScheduleTasks(tiles_that_need_to_be_rasterized);
370
371 did_notify_ready_to_activate_ = false;
372 did_notify_ready_to_draw_ = false;
373 } else {
374 if (global_state_.hard_memory_limit_in_bytes == 0) {
375 TileVector tiles_that_need_to_be_rasterized;
376 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
377 scheduled_raster_task_limit_, false);
378 DCHECK(tiles_that_need_to_be_rasterized.empty());
379 }
380
381 did_notify_ready_to_activate_ = false;
382 did_notify_ready_to_draw_ = false;
383 ready_to_activate_notifier_.Schedule();
384 ready_to_draw_notifier_.Schedule();
344 } 385 }
345 386
387 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
388 "state", BasicStateAsValue());
389
390 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
391 resource_pool_->total_memory_usage_bytes() -
392 resource_pool_->acquired_memory_usage_bytes());
393 }
394
395 void TileManager::SynchronouslyRasterizeTiles(
396 const GlobalStateThatImpactsTilePriority& state) {
397 TRACE_EVENT0("cc", "TileManager::SynchronouslyRasterizeTiles");
398
399 DCHECK(rasterizer_->GetPrepareTilesMode() !=
400 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES);
401
402 global_state_ = state;
403
346 FreeResourcesForReleasedTiles(); 404 FreeResourcesForReleasedTiles();
347 CleanUpReleasedTiles(); 405 CleanUpReleasedTiles();
348 406
349 TileVector tiles_that_need_to_be_rasterized; 407 TileVector tiles_that_need_to_be_rasterized;
350 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 408 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
409 std::numeric_limits<size_t>::max(), true);
351 410
352 // Schedule tile tasks. 411 // We must reduce the amount of unused resources before calling
353 ScheduleTasks(tiles_that_need_to_be_rasterized); 412 // RunTasks to prevent usage from rising above limits.
413 resource_pool_->ReduceResourceUsage();
354 414
355 did_notify_ready_to_activate_ = false; 415 // Run and complete all raster task synchronously.
356 did_notify_ready_to_draw_ = false; 416 rasterizer_->RasterizeTiles(
417 tiles_that_need_to_be_rasterized, resource_pool_,
418 base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this)));
357 419
358 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", 420 // Use on-demand raster for any required-for-activation tiles that have not
421 // been been assigned memory after reaching a steady memory state. This
422 // ensures that we activate even when OOM. Note that we have to rebuilt the
423 // queue in case the last AssignGpuMemoryToTiles evicted some tiles that would
424 // otherwise not be picked up by the old raster queue.
425 client_->BuildRasterQueue(&raster_priority_queue_,
426 global_state_.tree_priority);
427
428 // Use on-demand raster for any tiles that have not been been assigned
429 // memory. This ensures that we draw even when OOM.
430 while (!raster_priority_queue_.IsEmpty()) {
431 Tile* tile = raster_priority_queue_.Top();
432 TileDrawInfo& draw_info = tile->draw_info();
433
434 if (tile->required_for_draw() && !draw_info.IsReadyToDraw()) {
435 draw_info.set_rasterize_on_demand();
436 client_->NotifyTileStateChanged(tile);
437 }
438 raster_priority_queue_.Pop();
439 }
440 raster_priority_queue_.Reset();
441
442 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state",
359 BasicStateAsValue()); 443 BasicStateAsValue());
360 444
361 TRACE_COUNTER_ID1("cc", 445 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
362 "unused_memory_bytes",
363 this,
364 resource_pool_->total_memory_usage_bytes() - 446 resource_pool_->total_memory_usage_bytes() -
365 resource_pool_->acquired_memory_usage_bytes()); 447 resource_pool_->acquired_memory_usage_bytes());
366 } 448 }
367 449
368 void TileManager::UpdateVisibleTiles() { 450 void TileManager::UpdateVisibleTiles(
451 const GlobalStateThatImpactsTilePriority& state) {
369 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); 452 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
370 453
371 tile_task_runner_->CheckForCompletedTasks(); 454 tile_task_runner_->CheckForCompletedTasks();
455
456 DCHECK(rasterizer_);
457 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode();
458 if (prepare_tiles_mode != PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES)
459 SynchronouslyRasterizeTiles(state);
460
372 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 461 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
373 462
374 TRACE_EVENT_INSTANT1( 463 TRACE_EVENT_INSTANT1(
375 "cc", 464 "cc",
376 "DidUpdateVisibleTiles", 465 "DidUpdateVisibleTiles",
377 TRACE_EVENT_SCOPE_THREAD, 466 TRACE_EVENT_SCOPE_THREAD,
378 "stats", 467 "stats",
379 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); 468 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_));
380 update_visible_tiles_stats_ = RasterTaskCompletionStats(); 469 update_visible_tiles_stats_ = RasterTaskCompletionStats();
381 } 470 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 return priority.priority_bin > TilePriority::SOON; 546 return priority.priority_bin > TilePriority::SOON;
458 case ALLOW_ANYTHING: 547 case ALLOW_ANYTHING:
459 return priority.distance_to_visible == 548 return priority.distance_to_visible ==
460 std::numeric_limits<float>::infinity(); 549 std::numeric_limits<float>::infinity();
461 } 550 }
462 NOTREACHED(); 551 NOTREACHED();
463 return true; 552 return true;
464 } 553 }
465 554
466 void TileManager::AssignGpuMemoryToTiles( 555 void TileManager::AssignGpuMemoryToTiles(
467 TileVector* tiles_that_need_to_be_rasterized) { 556 TileVector* tiles_that_need_to_be_rasterized,
557 size_t scheduled_raster_task_limit, bool required_for_draw_only) {
468 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); 558 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles");
469 559
470 // Maintain the list of released resources that can potentially be re-used 560 // Maintain the list of released resources that can potentially be re-used
471 // or deleted. 561 // or deleted.
472 // If this operation becomes expensive too, only do this after some 562 // If this operation becomes expensive too, only do this after some
473 // resource(s) was returned. Note that in that case, one also need to 563 // resource(s) was returned. Note that in that case, one also need to
474 // invalidate when releasing some resource from the pool. 564 // invalidate when releasing some resource from the pool.
475 resource_pool_->CheckBusyResources(false); 565 resource_pool_->CheckBusyResources(false);
476 566
477 // Now give memory out to the tiles until we're out, and build 567 // Now give memory out to the tiles until we're out, and build
478 // the needs-to-be-rasterized queue. 568 // the needs-to-be-rasterized queue.
479 unsigned schedule_priority = 1u; 569 unsigned schedule_priority = 1u;
480 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; 570 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true;
481 bool had_enough_memory_to_schedule_tiles_needed_now = true; 571 bool had_enough_memory_to_schedule_tiles_needed_now = true;
482 572
483 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, 573 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes,
484 global_state_.num_resources_limit); 574 global_state_.num_resources_limit);
485 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, 575 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes,
486 global_state_.num_resources_limit); 576 global_state_.num_resources_limit);
487 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), 577 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(),
488 resource_pool_->acquired_resource_count()); 578 resource_pool_->acquired_resource_count());
489 579
490 eviction_priority_queue_is_up_to_date_ = false; 580 eviction_priority_queue_is_up_to_date_ = false;
491 client_->BuildRasterQueue(&raster_priority_queue_, 581 client_->BuildRasterQueue(&raster_priority_queue_,
492 global_state_.tree_priority); 582 global_state_.tree_priority);
493 583
494 while (!raster_priority_queue_.IsEmpty()) { 584 while (!raster_priority_queue_.IsEmpty()) {
495 Tile* tile = raster_priority_queue_.Top(); 585 Tile* tile = raster_priority_queue_.Top();
586
587 if (required_for_draw_only) {
588 if (!tile->required_for_draw()) {
589 raster_priority_queue_.Pop();
590 continue;
591 }
592 }
496 TilePriority priority = tile->combined_priority(); 593 TilePriority priority = tile->combined_priority();
497 594
498 if (TilePriorityViolatesMemoryPolicy(priority)) { 595 if (TilePriorityViolatesMemoryPolicy(priority)) {
499 TRACE_EVENT_INSTANT0( 596 TRACE_EVENT_INSTANT0(
500 "cc", 597 "cc", "TileManager::AssignGpuMemory tile violates memory policy",
501 "TileManager::AssignGpuMemory tile violates memory policy",
502 TRACE_EVENT_SCOPE_THREAD); 598 TRACE_EVENT_SCOPE_THREAD);
503 break; 599 break;
504 } 600 }
505 601
506 // We won't be able to schedule this tile, so break out early. 602 // We won't be able to schedule this tile, so break out early.
507 if (tiles_that_need_to_be_rasterized->size() >= 603 if (tiles_that_need_to_be_rasterized->size() >=
508 scheduled_raster_task_limit_) { 604 scheduled_raster_task_limit) {
509 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 605 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
510 break; 606 break;
511 } 607 }
512 608
513 TileDrawInfo& draw_info = tile->draw_info(); 609 TileDrawInfo& draw_info = tile->draw_info();
514 tile->scheduled_priority_ = schedule_priority++; 610 tile->scheduled_priority_ = schedule_priority++;
515 611
516 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || 612 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE ||
517 !draw_info.IsReadyToDraw()); 613 !draw_info.IsReadyToDraw());
518 614
(...skipping 10 matching lines...) Expand all
529 625
530 // This is the memory limit that will be used by this tile. Depending on 626 // This is the memory limit that will be used by this tile. Depending on
531 // the tile priority, it will be one of hard_memory_limit or 627 // the tile priority, it will be one of hard_memory_limit or
532 // soft_memory_limit. 628 // soft_memory_limit.
533 MemoryUsage& tile_memory_limit = 629 MemoryUsage& tile_memory_limit =
534 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; 630 tile_is_needed_now ? hard_memory_limit : soft_memory_limit;
535 631
536 bool memory_usage_is_within_limit = 632 bool memory_usage_is_within_limit =
537 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( 633 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit(
538 tile_memory_limit - memory_required_by_tile_to_be_scheduled, 634 tile_memory_limit - memory_required_by_tile_to_be_scheduled,
539 priority, 635 priority, &memory_usage);
540 &memory_usage);
541 636
542 // If we couldn't fit the tile into our current memory limit, then we're 637 // If we couldn't fit the tile into our current memory limit, then we're
543 // done. 638 // done.
544 if (!memory_usage_is_within_limit) { 639 if (!memory_usage_is_within_limit) {
545 if (tile_is_needed_now) 640 if (tile_is_needed_now)
546 had_enough_memory_to_schedule_tiles_needed_now = false; 641 had_enough_memory_to_schedule_tiles_needed_now = false;
547 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 642 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
548 break; 643 break;
549 } 644 }
550 645
(...skipping 12 matching lines...) Expand all
563 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; 658 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
564 659
565 memory_stats_from_last_assign_.total_budget_in_bytes = 660 memory_stats_from_last_assign_.total_budget_in_bytes =
566 global_state_.hard_memory_limit_in_bytes; 661 global_state_.hard_memory_limit_in_bytes;
567 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); 662 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes();
568 memory_stats_from_last_assign_.had_enough_memory = 663 memory_stats_from_last_assign_.had_enough_memory =
569 had_enough_memory_to_schedule_tiles_needed_now; 664 had_enough_memory_to_schedule_tiles_needed_now;
570 665
571 raster_priority_queue_.Reset(); 666 raster_priority_queue_.Reset();
572 667
573 TRACE_EVENT_END2("cc", 668 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles",
574 "TileManager::AssignGpuMemoryToTiles",
575 "all_tiles_that_need_to_be_rasterized_are_scheduled", 669 "all_tiles_that_need_to_be_rasterized_are_scheduled",
576 all_tiles_that_need_to_be_rasterized_are_scheduled_, 670 all_tiles_that_need_to_be_rasterized_are_scheduled_,
577 "had_enough_memory_to_schedule_tiles_needed_now", 671 "had_enough_memory_to_schedule_tiles_needed_now",
578 had_enough_memory_to_schedule_tiles_needed_now); 672 had_enough_memory_to_schedule_tiles_needed_now);
579 } 673 }
580 674
581 void TileManager::FreeResourcesForTile(Tile* tile) { 675 void TileManager::FreeResourcesForTile(Tile* tile) {
582 TileDrawInfo& draw_info = tile->draw_info(); 676 TileDrawInfo& draw_info = tile->draw_info();
583 if (draw_info.resource_) 677 if (draw_info.resource_)
584 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); 678 resource_pool_->ReleaseResource(draw_info.resource_.Pass());
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 } 809 }
716 810
717 void TileManager::OnRasterTaskCompleted( 811 void TileManager::OnRasterTaskCompleted(
718 Tile::Id tile_id, 812 Tile::Id tile_id,
719 scoped_ptr<ScopedResource> resource, 813 scoped_ptr<ScopedResource> resource,
720 const RasterSource::SolidColorAnalysis& analysis, 814 const RasterSource::SolidColorAnalysis& analysis,
721 bool was_canceled) { 815 bool was_canceled) {
722 DCHECK(tiles_.find(tile_id) != tiles_.end()); 816 DCHECK(tiles_.find(tile_id) != tiles_.end());
723 817
724 Tile* tile = tiles_[tile_id]; 818 Tile* tile = tiles_[tile_id];
725 TileDrawInfo& draw_info = tile->draw_info();
726 DCHECK(tile->raster_task_.get()); 819 DCHECK(tile->raster_task_.get());
727 orphan_raster_tasks_.push_back(tile->raster_task_); 820 orphan_raster_tasks_.push_back(tile->raster_task_);
728 tile->raster_task_ = NULL; 821 tile->raster_task_ = nullptr;
729 822
730 if (was_canceled) { 823 if (was_canceled) {
731 ++update_visible_tiles_stats_.canceled_count; 824 ++update_visible_tiles_stats_.canceled_count;
732 resource_pool_->ReleaseResource(resource.Pass()); 825 resource_pool_->ReleaseResource(resource.Pass());
733 return; 826 return;
734 } 827 }
735 828
829 UpdateTileDrawInfo(tile, resource.Pass(), analysis);
830 }
831
832 void TileManager::UpdateTileDrawInfo(
833 Tile* tile,
834 scoped_ptr<ScopedResource> resource,
835 const RasterSource::SolidColorAnalysis& analysis) {
836 TileDrawInfo& draw_info = tile->draw_info();
837
736 ++update_visible_tiles_stats_.completed_count; 838 ++update_visible_tiles_stats_.completed_count;
737 839
738 if (analysis.is_solid_color) { 840 if (analysis.is_solid_color) {
739 draw_info.set_solid_color(analysis.solid_color); 841 draw_info.set_solid_color(analysis.solid_color);
740 resource_pool_->ReleaseResource(resource.Pass()); 842 resource_pool_->ReleaseResource(resource.Pass());
741 } else { 843 } else {
742 draw_info.set_use_resource(); 844 draw_info.set_use_resource();
743 draw_info.resource_ = resource.Pass(); 845 draw_info.resource_ = resource.Pass();
744 } 846 }
745 847
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); 892 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers();
791 893
792 for (const auto& layer : layers) { 894 for (const auto& layer : layers) {
793 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) 895 if (!layer->AllTilesRequiredForDrawAreReadyToDraw())
794 return false; 896 return false;
795 } 897 }
796 898
797 return true; 899 return true;
798 } 900 }
799 901
902 void TileManager::NotifyReadyToActivate() {
903 TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate");
904 if (did_notify_ready_to_activate_)
905 return;
906 client_->NotifyReadyToActivate();
907 did_notify_ready_to_activate_ = true;
908 }
909
910 void TileManager::NotifyReadyToDraw() {
911 TRACE_EVENT0("cc", "TileManager::NotifyReadyToDraw");
912 if (did_notify_ready_to_draw_)
913 return;
914 client_->NotifyReadyToDraw();
915 did_notify_ready_to_draw_ = true;
916 }
917
800 void TileManager::CheckIfReadyToActivate() { 918 void TileManager::CheckIfReadyToActivate() {
801 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); 919 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate");
802 920
803 tile_task_runner_->CheckForCompletedTasks(); 921 tile_task_runner_->CheckForCompletedTasks();
804 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 922 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
805 923
806 if (did_notify_ready_to_activate_) 924 if (did_notify_ready_to_activate_)
807 return; 925 return;
808 if (!IsReadyToActivate()) 926 if (!IsReadyToActivate())
809 return; 927 return;
810 928
811 client_->NotifyReadyToActivate(); 929 NotifyReadyToActivate();
812 did_notify_ready_to_activate_ = true;
813 } 930 }
814 931
815 void TileManager::CheckIfReadyToDraw() { 932 void TileManager::CheckIfReadyToDraw() {
816 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); 933 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw");
817 934
818 tile_task_runner_->CheckForCompletedTasks(); 935 tile_task_runner_->CheckForCompletedTasks();
819 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 936 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
820 937
821 if (did_notify_ready_to_draw_) 938 if (did_notify_ready_to_draw_)
822 return; 939 return;
823 if (!IsReadyToDraw()) 940 if (!IsReadyToDraw())
824 return; 941 return;
825 942
826 client_->NotifyReadyToDraw(); 943 NotifyReadyToDraw();
827 did_notify_ready_to_draw_ = true;
828 } 944 }
829 945
830 void TileManager::CheckIfMoreTilesNeedToBePrepared() { 946 void TileManager::CheckIfMoreTilesNeedToBePrepared() {
831 tile_task_runner_->CheckForCompletedTasks(); 947 tile_task_runner_->CheckForCompletedTasks();
832 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 948 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
833 949
834 // When OOM, keep re-assigning memory until we reach a steady state 950 // When OOM, keep re-assigning memory until we reach a steady state
835 // where top-priority tiles are initialized. 951 // where top-priority tiles are initialized.
836 TileVector tiles_that_need_to_be_rasterized; 952 TileVector tiles_that_need_to_be_rasterized;
837 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 953 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
954 scheduled_raster_task_limit_, false);
838 955
839 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 956 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
840 // steady memory state. Keep scheduling tasks until we reach this state. 957 // steady memory state. Keep scheduling tasks until we reach this state.
841 if (!tiles_that_need_to_be_rasterized.empty()) { 958 if (!tiles_that_need_to_be_rasterized.empty()) {
842 ScheduleTasks(tiles_that_need_to_be_rasterized); 959 ScheduleTasks(tiles_that_need_to_be_rasterized);
843 return; 960 return;
844 } 961 }
845 962
846 FreeResourcesForReleasedTiles(); 963 FreeResourcesForReleasedTiles();
847 964
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 result -= other; 1049 result -= other;
933 return result; 1050 return result;
934 } 1051 }
935 1052
936 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { 1053 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const {
937 return memory_bytes_ > limit.memory_bytes_ || 1054 return memory_bytes_ > limit.memory_bytes_ ||
938 resource_count_ > limit.resource_count_; 1055 resource_count_ > limit.resource_count_;
939 } 1056 }
940 1057
941 } // namespace cc 1058 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698