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

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: override added :( 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
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/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/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_(
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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 341
331 NOTREACHED(); 342 NOTREACHED();
332 } 343 }
333 344
334 void TileManager::PrepareTiles( 345 void TileManager::PrepareTiles(
335 const GlobalStateThatImpactsTilePriority& state) { 346 const GlobalStateThatImpactsTilePriority& state) {
336 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); 347 TRACE_EVENT0("cc", "TileManager::PrepareTiles");
337 348
338 global_state_ = state; 349 global_state_ = state;
339 350
340 // We need to call CheckForCompletedTasks() once in-between each call 351 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode();
341 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 352
342 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 353 // TODO(hendrikw): Consider moving some of this code to the rasterizer.
343 tile_task_runner_->CheckForCompletedTasks(); 354 if (prepare_tiles_mode != PrepareTilesMode::PREPARE_NONE) {
344 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 355 // We need to call CheckForCompletedTasks() once in-between each call
356 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
357 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
358 tile_task_runner_->CheckForCompletedTasks();
359 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
360 }
361
362 FreeResourcesForReleasedTiles();
363 CleanUpReleasedTiles();
364
365 TileVector tiles_that_need_to_be_rasterized;
366 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
367 scheduled_raster_task_limit_, false);
368
369 // Schedule tile tasks.
370 ScheduleTasks(tiles_that_need_to_be_rasterized);
371
372 did_notify_ready_to_activate_ = false;
373 did_notify_ready_to_draw_ = false;
374 } else {
375 if (global_state_.hard_memory_limit_in_bytes == 0) {
376 TileVector tiles_that_need_to_be_rasterized;
377 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
378 scheduled_raster_task_limit_, false);
379 DCHECK(tiles_that_need_to_be_rasterized.empty());
380 }
381
382 did_notify_ready_to_activate_ = false;
383 did_notify_ready_to_draw_ = false;
384 ready_to_activate_notifier_.Schedule();
385 ready_to_draw_notifier_.Schedule();
345 } 386 }
346 387
388 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
389 "state", BasicStateAsValue());
390
391 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
392 resource_pool_->total_memory_usage_bytes() -
393 resource_pool_->acquired_memory_usage_bytes());
394 }
395
396 void TileManager::SynchronouslyRasterizeTiles(
397 const GlobalStateThatImpactsTilePriority& state) {
398 TRACE_EVENT0("cc", "TileManager::SynchronouslyRasterizeTiles");
399
400 DCHECK(rasterizer_->GetPrepareTilesMode() !=
401 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES);
402
403 global_state_ = state;
404
347 FreeResourcesForReleasedTiles(); 405 FreeResourcesForReleasedTiles();
348 CleanUpReleasedTiles(); 406 CleanUpReleasedTiles();
349 407
350 TileVector tiles_that_need_to_be_rasterized; 408 TileVector tiles_that_need_to_be_rasterized;
351 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 409 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
410 std::numeric_limits<size_t>::max(), true);
352 411
353 // Schedule tile tasks. 412 // We must reduce the amount of unused resources before calling
354 ScheduleTasks(tiles_that_need_to_be_rasterized); 413 // RunTasks to prevent usage from rising above limits.
414 resource_pool_->ReduceResourceUsage();
355 415
356 did_notify_ready_to_activate_ = false; 416 // Run and complete all raster task synchronously.
357 did_notify_ready_to_draw_ = false; 417 rasterizer_->RasterizeTiles(
418 tiles_that_need_to_be_rasterized, resource_pool_,
419 base::Bind(&TileManager::UpdateTileDrawInfo, base::Unretained(this)));
358 420
359 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", 421 // Use on-demand raster for any required-for-activation tiles that have not
422 // been been assigned memory after reaching a steady memory state. This
423 // ensures that we activate even when OOM. Note that we have to rebuilt the
424 // queue in case the last AssignGpuMemoryToTiles evicted some tiles that would
425 // otherwise not be picked up by the old raster queue.
426 client_->BuildRasterQueue(&raster_priority_queue_,
427 global_state_.tree_priority);
428
429 // Use on-demand raster for any tiles that have not been been assigned
430 // memory. This ensures that we draw even when OOM.
431 while (!raster_priority_queue_.IsEmpty()) {
432 Tile* tile = raster_priority_queue_.Top();
433 TileDrawInfo& draw_info = tile->draw_info();
434
435 if (tile->required_for_draw() && !draw_info.IsReadyToDraw()) {
436 draw_info.set_rasterize_on_demand();
437 client_->NotifyTileStateChanged(tile);
438 }
439 raster_priority_queue_.Pop();
440 }
441 raster_priority_queue_.Reset();
442
443 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state",
360 BasicStateAsValue()); 444 BasicStateAsValue());
361 445
362 TRACE_COUNTER_ID1("cc", 446 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
363 "unused_memory_bytes",
364 this,
365 resource_pool_->total_memory_usage_bytes() - 447 resource_pool_->total_memory_usage_bytes() -
366 resource_pool_->acquired_memory_usage_bytes()); 448 resource_pool_->acquired_memory_usage_bytes());
367 } 449 }
368 450
369 void TileManager::UpdateVisibleTiles() { 451 void TileManager::UpdateVisibleTiles(
452 const GlobalStateThatImpactsTilePriority& state) {
370 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); 453 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
371 454
372 tile_task_runner_->CheckForCompletedTasks(); 455 tile_task_runner_->CheckForCompletedTasks();
456
457 DCHECK(rasterizer_);
458 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode();
459 if (prepare_tiles_mode != PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES)
460 SynchronouslyRasterizeTiles(state);
461
373 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 462 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
374 463
375 TRACE_EVENT_INSTANT1( 464 TRACE_EVENT_INSTANT1(
376 "cc", 465 "cc",
377 "DidUpdateVisibleTiles", 466 "DidUpdateVisibleTiles",
378 TRACE_EVENT_SCOPE_THREAD, 467 TRACE_EVENT_SCOPE_THREAD,
379 "stats", 468 "stats",
380 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); 469 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_));
381 update_visible_tiles_stats_ = RasterTaskCompletionStats(); 470 update_visible_tiles_stats_ = RasterTaskCompletionStats();
382 } 471 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 return priority.priority_bin > TilePriority::SOON; 547 return priority.priority_bin > TilePriority::SOON;
459 case ALLOW_ANYTHING: 548 case ALLOW_ANYTHING:
460 return priority.distance_to_visible == 549 return priority.distance_to_visible ==
461 std::numeric_limits<float>::infinity(); 550 std::numeric_limits<float>::infinity();
462 } 551 }
463 NOTREACHED(); 552 NOTREACHED();
464 return true; 553 return true;
465 } 554 }
466 555
467 void TileManager::AssignGpuMemoryToTiles( 556 void TileManager::AssignGpuMemoryToTiles(
468 TileVector* tiles_that_need_to_be_rasterized) { 557 TileVector* tiles_that_need_to_be_rasterized,
558 size_t scheduled_raster_task_limit,
559 bool required_for_draw_only) {
469 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); 560 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles");
470 561
471 // Maintain the list of released resources that can potentially be re-used 562 // Maintain the list of released resources that can potentially be re-used
472 // or deleted. 563 // or deleted.
473 // If this operation becomes expensive too, only do this after some 564 // If this operation becomes expensive too, only do this after some
474 // resource(s) was returned. Note that in that case, one also need to 565 // resource(s) was returned. Note that in that case, one also need to
475 // invalidate when releasing some resource from the pool. 566 // invalidate when releasing some resource from the pool.
476 resource_pool_->CheckBusyResources(false); 567 resource_pool_->CheckBusyResources(false);
477 568
478 // Now give memory out to the tiles until we're out, and build 569 // Now give memory out to the tiles until we're out, and build
479 // the needs-to-be-rasterized queue. 570 // the needs-to-be-rasterized queue.
480 unsigned schedule_priority = 1u; 571 unsigned schedule_priority = 1u;
481 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; 572 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true;
482 bool had_enough_memory_to_schedule_tiles_needed_now = true; 573 bool had_enough_memory_to_schedule_tiles_needed_now = true;
483 574
484 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, 575 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes,
485 global_state_.num_resources_limit); 576 global_state_.num_resources_limit);
486 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, 577 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes,
487 global_state_.num_resources_limit); 578 global_state_.num_resources_limit);
488 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), 579 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(),
489 resource_pool_->acquired_resource_count()); 580 resource_pool_->acquired_resource_count());
490 581
491 eviction_priority_queue_is_up_to_date_ = false; 582 eviction_priority_queue_is_up_to_date_ = false;
492 client_->BuildRasterQueue(&raster_priority_queue_, 583 client_->BuildRasterQueue(&raster_priority_queue_,
493 global_state_.tree_priority); 584 global_state_.tree_priority);
494 585
495 while (!raster_priority_queue_.IsEmpty()) { 586 while (!raster_priority_queue_.IsEmpty()) {
496 Tile* tile = raster_priority_queue_.Top(); 587 Tile* tile = raster_priority_queue_.Top();
588
589 // TODO(vmpstr): Remove this when the iterator returns the correct tiles
590 // to draw for GPU rasterization.
591 if (required_for_draw_only) {
592 if (!tile->required_for_draw()) {
593 raster_priority_queue_.Pop();
594 continue;
595 }
596 }
497 TilePriority priority = tile->combined_priority(); 597 TilePriority priority = tile->combined_priority();
498 598
499 if (TilePriorityViolatesMemoryPolicy(priority)) { 599 if (TilePriorityViolatesMemoryPolicy(priority)) {
500 TRACE_EVENT_INSTANT0( 600 TRACE_EVENT_INSTANT0(
501 "cc", 601 "cc", "TileManager::AssignGpuMemory tile violates memory policy",
502 "TileManager::AssignGpuMemory tile violates memory policy",
503 TRACE_EVENT_SCOPE_THREAD); 602 TRACE_EVENT_SCOPE_THREAD);
504 break; 603 break;
505 } 604 }
506 605
507 // We won't be able to schedule this tile, so break out early. 606 // We won't be able to schedule this tile, so break out early.
508 if (tiles_that_need_to_be_rasterized->size() >= 607 if (tiles_that_need_to_be_rasterized->size() >=
509 scheduled_raster_task_limit_) { 608 scheduled_raster_task_limit) {
510 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 609 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
511 break; 610 break;
512 } 611 }
513 612
514 TileDrawInfo& draw_info = tile->draw_info(); 613 TileDrawInfo& draw_info = tile->draw_info();
515 tile->scheduled_priority_ = schedule_priority++; 614 tile->scheduled_priority_ = schedule_priority++;
516 615
517 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || 616 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE ||
518 !draw_info.IsReadyToDraw()); 617 !draw_info.IsReadyToDraw());
519 618
(...skipping 10 matching lines...) Expand all
530 629
531 // This is the memory limit that will be used by this tile. Depending on 630 // This is the memory limit that will be used by this tile. Depending on
532 // the tile priority, it will be one of hard_memory_limit or 631 // the tile priority, it will be one of hard_memory_limit or
533 // soft_memory_limit. 632 // soft_memory_limit.
534 MemoryUsage& tile_memory_limit = 633 MemoryUsage& tile_memory_limit =
535 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; 634 tile_is_needed_now ? hard_memory_limit : soft_memory_limit;
536 635
537 bool memory_usage_is_within_limit = 636 bool memory_usage_is_within_limit =
538 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( 637 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit(
539 tile_memory_limit - memory_required_by_tile_to_be_scheduled, 638 tile_memory_limit - memory_required_by_tile_to_be_scheduled,
540 priority, 639 priority, &memory_usage);
541 &memory_usage);
542 640
543 // If we couldn't fit the tile into our current memory limit, then we're 641 // If we couldn't fit the tile into our current memory limit, then we're
544 // done. 642 // done.
545 if (!memory_usage_is_within_limit) { 643 if (!memory_usage_is_within_limit) {
546 if (tile_is_needed_now) 644 if (tile_is_needed_now)
547 had_enough_memory_to_schedule_tiles_needed_now = false; 645 had_enough_memory_to_schedule_tiles_needed_now = false;
548 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 646 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
549 break; 647 break;
550 } 648 }
551 649
(...skipping 12 matching lines...) Expand all
564 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; 662 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
565 663
566 memory_stats_from_last_assign_.total_budget_in_bytes = 664 memory_stats_from_last_assign_.total_budget_in_bytes =
567 global_state_.hard_memory_limit_in_bytes; 665 global_state_.hard_memory_limit_in_bytes;
568 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); 666 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes();
569 memory_stats_from_last_assign_.had_enough_memory = 667 memory_stats_from_last_assign_.had_enough_memory =
570 had_enough_memory_to_schedule_tiles_needed_now; 668 had_enough_memory_to_schedule_tiles_needed_now;
571 669
572 raster_priority_queue_.Reset(); 670 raster_priority_queue_.Reset();
573 671
574 TRACE_EVENT_END2("cc", 672 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles",
575 "TileManager::AssignGpuMemoryToTiles",
576 "all_tiles_that_need_to_be_rasterized_are_scheduled", 673 "all_tiles_that_need_to_be_rasterized_are_scheduled",
577 all_tiles_that_need_to_be_rasterized_are_scheduled_, 674 all_tiles_that_need_to_be_rasterized_are_scheduled_,
578 "had_enough_memory_to_schedule_tiles_needed_now", 675 "had_enough_memory_to_schedule_tiles_needed_now",
579 had_enough_memory_to_schedule_tiles_needed_now); 676 had_enough_memory_to_schedule_tiles_needed_now);
580 } 677 }
581 678
582 void TileManager::FreeResourcesForTile(Tile* tile) { 679 void TileManager::FreeResourcesForTile(Tile* tile) {
583 TileDrawInfo& draw_info = tile->draw_info(); 680 TileDrawInfo& draw_info = tile->draw_info();
584 if (draw_info.resource_) 681 if (draw_info.resource_)
585 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); 682 resource_pool_->ReleaseResource(draw_info.resource_.Pass());
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 } 813 }
717 814
718 void TileManager::OnRasterTaskCompleted( 815 void TileManager::OnRasterTaskCompleted(
719 Tile::Id tile_id, 816 Tile::Id tile_id,
720 scoped_ptr<ScopedResource> resource, 817 scoped_ptr<ScopedResource> resource,
721 const RasterSource::SolidColorAnalysis& analysis, 818 const RasterSource::SolidColorAnalysis& analysis,
722 bool was_canceled) { 819 bool was_canceled) {
723 DCHECK(tiles_.find(tile_id) != tiles_.end()); 820 DCHECK(tiles_.find(tile_id) != tiles_.end());
724 821
725 Tile* tile = tiles_[tile_id]; 822 Tile* tile = tiles_[tile_id];
726 TileDrawInfo& draw_info = tile->draw_info();
727 DCHECK(tile->raster_task_.get()); 823 DCHECK(tile->raster_task_.get());
728 orphan_raster_tasks_.push_back(tile->raster_task_); 824 orphan_raster_tasks_.push_back(tile->raster_task_);
729 tile->raster_task_ = NULL; 825 tile->raster_task_ = nullptr;
730 826
731 if (was_canceled) { 827 if (was_canceled) {
732 ++update_visible_tiles_stats_.canceled_count; 828 ++update_visible_tiles_stats_.canceled_count;
733 resource_pool_->ReleaseResource(resource.Pass()); 829 resource_pool_->ReleaseResource(resource.Pass());
734 return; 830 return;
735 } 831 }
736 832
833 UpdateTileDrawInfo(tile, resource.Pass(), analysis);
834 }
835
836 void TileManager::UpdateTileDrawInfo(
837 Tile* tile,
838 scoped_ptr<ScopedResource> resource,
839 const RasterSource::SolidColorAnalysis& analysis) {
840 TileDrawInfo& draw_info = tile->draw_info();
841
737 ++update_visible_tiles_stats_.completed_count; 842 ++update_visible_tiles_stats_.completed_count;
738 843
739 if (analysis.is_solid_color) { 844 if (analysis.is_solid_color) {
740 draw_info.set_solid_color(analysis.solid_color); 845 draw_info.set_solid_color(analysis.solid_color);
741 resource_pool_->ReleaseResource(resource.Pass()); 846 resource_pool_->ReleaseResource(resource.Pass());
742 } else { 847 } else {
743 draw_info.set_use_resource(); 848 draw_info.set_use_resource();
744 draw_info.resource_ = resource.Pass(); 849 draw_info.resource_ = resource.Pass();
745 } 850 }
746 851
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); 892 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers();
788 893
789 for (const auto& layer : layers) { 894 for (const auto& layer : layers) {
790 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) 895 if (!layer->AllTilesRequiredForDrawAreReadyToDraw())
791 return false; 896 return false;
792 } 897 }
793 898
794 return true; 899 return true;
795 } 900 }
796 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
797 void TileManager::CheckIfReadyToActivate() { 918 void TileManager::CheckIfReadyToActivate() {
798 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); 919 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate");
799 920
800 tile_task_runner_->CheckForCompletedTasks(); 921 tile_task_runner_->CheckForCompletedTasks();
801 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 922 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
802 923
803 if (did_notify_ready_to_activate_) 924 if (did_notify_ready_to_activate_)
804 return; 925 return;
805 if (!IsReadyToActivate()) 926 if (!IsReadyToActivate())
806 return; 927 return;
807 928
808 client_->NotifyReadyToActivate(); 929 NotifyReadyToActivate();
809 did_notify_ready_to_activate_ = true;
810 } 930 }
811 931
812 void TileManager::CheckIfReadyToDraw() { 932 void TileManager::CheckIfReadyToDraw() {
813 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); 933 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw");
814 934
815 tile_task_runner_->CheckForCompletedTasks(); 935 tile_task_runner_->CheckForCompletedTasks();
816 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 936 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
817 937
818 if (did_notify_ready_to_draw_) 938 if (did_notify_ready_to_draw_)
819 return; 939 return;
820 if (!IsReadyToDraw()) 940 if (!IsReadyToDraw())
821 return; 941 return;
822 942
823 client_->NotifyReadyToDraw(); 943 NotifyReadyToDraw();
824 did_notify_ready_to_draw_ = true;
825 } 944 }
826 945
827 void TileManager::CheckIfMoreTilesNeedToBePrepared() { 946 void TileManager::CheckIfMoreTilesNeedToBePrepared() {
828 tile_task_runner_->CheckForCompletedTasks(); 947 tile_task_runner_->CheckForCompletedTasks();
829 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 948 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
830 949
831 // 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
832 // where top-priority tiles are initialized. 951 // where top-priority tiles are initialized.
833 TileVector tiles_that_need_to_be_rasterized; 952 TileVector tiles_that_need_to_be_rasterized;
834 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 953 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
954 scheduled_raster_task_limit_, false);
835 955
836 // |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
837 // steady memory state. Keep scheduling tasks until we reach this state. 957 // steady memory state. Keep scheduling tasks until we reach this state.
838 if (!tiles_that_need_to_be_rasterized.empty()) { 958 if (!tiles_that_need_to_be_rasterized.empty()) {
839 ScheduleTasks(tiles_that_need_to_be_rasterized); 959 ScheduleTasks(tiles_that_need_to_be_rasterized);
840 return; 960 return;
841 } 961 }
842 962
843 FreeResourcesForReleasedTiles(); 963 FreeResourcesForReleasedTiles();
844 964
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
930 result -= other; 1050 result -= other;
931 return result; 1051 return result;
932 } 1052 }
933 1053
934 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { 1054 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const {
935 return memory_bytes_ > limit.memory_bytes_ || 1055 return memory_bytes_ > limit.memory_bytes_ ||
936 resource_count_ > limit.resource_count_; 1056 resource_count_ > limit.resource_count_;
937 } 1057 }
938 1058
939 } // namespace cc 1059 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tile_manager.h ('k') | cc/resources/tile_manager_perftest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698