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

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: format and merge Created 5 years, 12 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_(
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 did_notify_ready_to_activate_(false), 242 did_notify_ready_to_activate_(false),
232 did_notify_ready_to_draw_(false) { 243 did_notify_ready_to_draw_(false) {
233 tile_task_runner_->SetClient(this); 244 tile_task_runner_->SetClient(this);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 321
311 // When OOM, keep re-assigning memory until we reach a steady state 322 // When OOM, keep re-assigning memory until we reach a steady state
312 // where top-priority tiles are initialized. 323 // where top-priority tiles are initialized.
313 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ && 324 if (all_tiles_that_need_to_be_rasterized_are_scheduled_ &&
314 !memory_usage_above_limit) 325 !memory_usage_above_limit)
315 return; 326 return;
316 327
317 tile_task_runner_->CheckForCompletedTasks(); 328 tile_task_runner_->CheckForCompletedTasks();
318 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 329 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
319 330
331 client_->BuildRasterQueue(&raster_priority_queue_,
332 global_state_.tree_priority);
320 TileVector tiles_that_need_to_be_rasterized; 333 TileVector tiles_that_need_to_be_rasterized;
321 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 334 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
335 scheduled_raster_task_limit_, false);
336 raster_priority_queue_.Reset();
322 337
323 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 338 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
324 // steady memory state. Keep scheduling tasks until we reach this state. 339 // steady memory state. Keep scheduling tasks until we reach this state.
325 if (!tiles_that_need_to_be_rasterized.empty()) { 340 if (!tiles_that_need_to_be_rasterized.empty()) {
326 ScheduleTasks(tiles_that_need_to_be_rasterized); 341 ScheduleTasks(tiles_that_need_to_be_rasterized);
327 return; 342 return;
328 } 343 }
329 344
330 FreeResourcesForReleasedTiles(); 345 FreeResourcesForReleasedTiles();
331 346
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 400
386 NOTREACHED(); 401 NOTREACHED();
387 } 402 }
388 403
389 void TileManager::PrepareTiles( 404 void TileManager::PrepareTiles(
390 const GlobalStateThatImpactsTilePriority& state) { 405 const GlobalStateThatImpactsTilePriority& state) {
391 TRACE_EVENT0("cc", "TileManager::PrepareTiles"); 406 TRACE_EVENT0("cc", "TileManager::PrepareTiles");
392 407
393 global_state_ = state; 408 global_state_ = state;
394 409
395 // We need to call CheckForCompletedTasks() once in-between each call 410 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode();
396 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 411
397 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 412 if (prepare_tiles_mode != PrepareTilesMode::PREPARE_NONE) {
398 tile_task_runner_->CheckForCompletedTasks(); 413 // We need to call CheckForCompletedTasks() once in-between each call
399 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 414 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
415 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
416 tile_task_runner_->CheckForCompletedTasks();
417 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
418 }
419
420 FreeResourcesForReleasedTiles();
421 CleanUpReleasedTiles();
422
423 client_->BuildRasterQueue(&raster_priority_queue_,
424 global_state_.tree_priority);
425 TileVector tiles_that_need_to_be_rasterized;
426
427 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
428 scheduled_raster_task_limit_, false);
429
430 raster_priority_queue_.Reset();
431
432 // Schedule tile tasks.
433 ScheduleTasks(tiles_that_need_to_be_rasterized);
434
435 did_notify_ready_to_activate_ = false;
436 did_notify_ready_to_draw_ = false;
437 } else {
438 did_notify_ready_to_activate_ = false;
439 did_notify_ready_to_draw_ = false;
440 ready_to_activate_notifier_.Schedule();
vmpstr 2014/12/23 09:51:02 I'm not really a fan of these callbacks. Can we ju
hendrikw 2014/12/23 18:10:33 Nope, they must be scheduled. vmiura, can you jum
vmiura 2014/12/23 18:33:13 The client can end up recursing back into TM::Prep
441 ready_to_draw_notifier_.Schedule();
400 } 442 }
401 443
444 TRACE_EVENT_INSTANT1("cc", "DidPrepareTiles", TRACE_EVENT_SCOPE_THREAD,
445 "state", BasicStateAsValue());
446
447 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
448 resource_pool_->total_memory_usage_bytes() -
449 resource_pool_->acquired_memory_usage_bytes());
450 }
451
452 void TileManager::SynchronouslyRasterizeTiles(
453 const GlobalStateThatImpactsTilePriority& state) {
454 TRACE_EVENT0("cc", "TileManager::SynchronouslyRasterizeTiles");
455
456 DCHECK(rasterizer_->GetPrepareTilesMode() !=
457 PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES);
458
459 global_state_ = state;
460
402 FreeResourcesForReleasedTiles(); 461 FreeResourcesForReleasedTiles();
403 CleanUpReleasedTiles(); 462 CleanUpReleasedTiles();
404 463
464 client_->BuildRasterQueue(&raster_priority_queue_,
vmpstr 2014/12/23 09:51:03 I think I've mentioned this on the original patch,
hendrikw 2014/12/23 18:10:33 I guess I'll talk with you about this when you get
465 global_state_.tree_priority);
405 TileVector tiles_that_need_to_be_rasterized; 466 TileVector tiles_that_need_to_be_rasterized;
406 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); 467 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized,
468 std::numeric_limits<size_t>::max(), true);
407 469
408 // Schedule tile tasks. 470 // We must reduce the amount of unused resoruces before calling
409 ScheduleTasks(tiles_that_need_to_be_rasterized); 471 // RunTasks to prevent usage from rising above limits.
472 resource_pool_->ReduceResourceUsage();
410 473
411 did_notify_ready_to_activate_ = false; 474 // Run and complete all raster task synchronously.
412 did_notify_ready_to_draw_ = false; 475 rasterizer_->RasterizeTiles(tiles_that_need_to_be_rasterized, resource_pool_,
476 this);
413 477
414 TRACE_EVENT_INSTANT1("cc", "DidPrepare", TRACE_EVENT_SCOPE_THREAD, "state", 478 // Use on-demand raster for any tiles that have not been been assigned
479 // memory. This ensures that we draw even when OOM.
480 while (!raster_priority_queue_.IsEmpty()) {
481 Tile* tile = raster_priority_queue_.Top();
482 TileDrawInfo& draw_info = tile->draw_info();
483
484 if (tile->required_for_draw() && !draw_info.IsReadyToDraw()) {
485 draw_info.set_rasterize_on_demand();
486 client_->NotifyTileStateChanged(tile);
487 }
488 raster_priority_queue_.Pop();
489 }
490 raster_priority_queue_.Reset();
491
492 if (IsReadyToDraw())
493 client_->NotifyReadyToDraw();
494
495 TRACE_EVENT_INSTANT1("cc", "DidRasterize", TRACE_EVENT_SCOPE_THREAD, "state",
415 BasicStateAsValue()); 496 BasicStateAsValue());
416 497
417 TRACE_COUNTER_ID1("cc", 498 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
418 "unused_memory_bytes",
419 this,
420 resource_pool_->total_memory_usage_bytes() - 499 resource_pool_->total_memory_usage_bytes() -
421 resource_pool_->acquired_memory_usage_bytes()); 500 resource_pool_->acquired_memory_usage_bytes());
422 } 501 }
423 502
424 void TileManager::UpdateVisibleTiles() { 503 void TileManager::UpdateVisibleTiles(
504 const GlobalStateThatImpactsTilePriority& state) {
425 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); 505 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
426 506
507 DCHECK(rasterizer_);
508 PrepareTilesMode prepare_tiles_mode = rasterizer_->GetPrepareTilesMode();
509
510 if (prepare_tiles_mode != PrepareTilesMode::RASTERIZE_PRIORITIZED_TILES)
511 SynchronouslyRasterizeTiles(state);
512
427 tile_task_runner_->CheckForCompletedTasks(); 513 tile_task_runner_->CheckForCompletedTasks();
428 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 514 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
429 515
430 TRACE_EVENT_INSTANT1( 516 TRACE_EVENT_INSTANT1(
431 "cc", 517 "cc",
432 "DidUpdateVisibleTiles", 518 "DidUpdateVisibleTiles",
433 TRACE_EVENT_SCOPE_THREAD, 519 TRACE_EVENT_SCOPE_THREAD,
434 "stats", 520 "stats",
435 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_)); 521 RasterTaskCompletionStatsAsValue(update_visible_tiles_stats_));
436 update_visible_tiles_stats_ = RasterTaskCompletionStats(); 522 update_visible_tiles_stats_ = RasterTaskCompletionStats();
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 return priority.priority_bin > TilePriority::SOON; 599 return priority.priority_bin > TilePriority::SOON;
514 case ALLOW_ANYTHING: 600 case ALLOW_ANYTHING:
515 return priority.distance_to_visible == 601 return priority.distance_to_visible ==
516 std::numeric_limits<float>::infinity(); 602 std::numeric_limits<float>::infinity();
517 } 603 }
518 NOTREACHED(); 604 NOTREACHED();
519 return true; 605 return true;
520 } 606 }
521 607
522 void TileManager::AssignGpuMemoryToTiles( 608 void TileManager::AssignGpuMemoryToTiles(
523 TileVector* tiles_that_need_to_be_rasterized) { 609 TileVector* tiles_that_need_to_be_rasterized,
610 size_t scheduled_raster_task_limit,
611 bool required_for_draw_only) {
524 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles"); 612 TRACE_EVENT_BEGIN0("cc", "TileManager::AssignGpuMemoryToTiles");
525 613
526 // Maintain the list of released resources that can potentially be re-used 614 // Maintain the list of released resources that can potentially be re-used
527 // or deleted. 615 // or deleted.
528 // If this operation becomes expensive too, only do this after some 616 // If this operation becomes expensive too, only do this after some
529 // resource(s) was returned. Note that in that case, one also need to 617 // resource(s) was returned. Note that in that case, one also need to
530 // invalidate when releasing some resource from the pool. 618 // invalidate when releasing some resource from the pool.
531 resource_pool_->CheckBusyResources(false); 619 resource_pool_->CheckBusyResources(false);
532 620
533 // Now give memory out to the tiles until we're out, and build 621 // Now give memory out to the tiles until we're out, and build
534 // the needs-to-be-rasterized queue. 622 // the needs-to-be-rasterized queue.
535 unsigned schedule_priority = 1u; 623 unsigned schedule_priority = 1u;
536 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true; 624 all_tiles_that_need_to_be_rasterized_are_scheduled_ = true;
537 bool had_enough_memory_to_schedule_tiles_needed_now = true; 625 bool had_enough_memory_to_schedule_tiles_needed_now = true;
538 626
539 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes, 627 MemoryUsage hard_memory_limit(global_state_.hard_memory_limit_in_bytes,
540 global_state_.num_resources_limit); 628 global_state_.num_resources_limit);
541 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes, 629 MemoryUsage soft_memory_limit(global_state_.soft_memory_limit_in_bytes,
542 global_state_.num_resources_limit); 630 global_state_.num_resources_limit);
543 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(), 631 MemoryUsage memory_usage(resource_pool_->acquired_memory_usage_bytes(),
544 resource_pool_->acquired_resource_count()); 632 resource_pool_->acquired_resource_count());
545 633
546 eviction_priority_queue_is_up_to_date_ = false; 634 eviction_priority_queue_is_up_to_date_ = false;
547 client_->BuildRasterQueue(&raster_priority_queue_,
548 global_state_.tree_priority);
549 635
550 while (!raster_priority_queue_.IsEmpty()) { 636 while (!raster_priority_queue_.IsEmpty()) {
551 Tile* tile = raster_priority_queue_.Top(); 637 Tile* tile = raster_priority_queue_.Top();
638
639 if (required_for_draw_only) {
640 if (!tile->required_for_draw()) {
641 raster_priority_queue_.Pop();
vmpstr 2014/12/23 09:51:02 I think this needs some thought. I don't like the
vmiura 2014/12/23 18:33:13 Initially I think we might want to have fewer chan
hendrikw 2014/12/23 18:54:29 Done.
642 continue;
643 }
644 }
645
552 TilePriority priority = tile->combined_priority(); 646 TilePriority priority = tile->combined_priority();
553 647
554 if (TilePriorityViolatesMemoryPolicy(priority)) { 648 if (TilePriorityViolatesMemoryPolicy(priority)) {
555 TRACE_EVENT_INSTANT0( 649 TRACE_EVENT_INSTANT0(
556 "cc", 650 "cc", "TileManager::AssignGpuMemory tile violates memory policy",
557 "TileManager::AssignGpuMemory tile violates memory policy",
558 TRACE_EVENT_SCOPE_THREAD); 651 TRACE_EVENT_SCOPE_THREAD);
559 break; 652 break;
560 } 653 }
561 654
562 // We won't be able to schedule this tile, so break out early. 655 // We won't be able to schedule this tile, so break out early.
563 if (tiles_that_need_to_be_rasterized->size() >= 656 if (tiles_that_need_to_be_rasterized->size() >=
564 scheduled_raster_task_limit_) { 657 scheduled_raster_task_limit) {
565 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 658 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
566 break; 659 break;
567 } 660 }
568 661
569 TileDrawInfo& draw_info = tile->draw_info(); 662 TileDrawInfo& draw_info = tile->draw_info();
570 tile->scheduled_priority_ = schedule_priority++; 663 tile->scheduled_priority_ = schedule_priority++;
571 664
572 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE || 665 DCHECK(draw_info.mode() == TileDrawInfo::PICTURE_PILE_MODE ||
573 !draw_info.IsReadyToDraw()); 666 !draw_info.IsReadyToDraw());
574 667
(...skipping 10 matching lines...) Expand all
585 678
586 // This is the memory limit that will be used by this tile. Depending on 679 // This is the memory limit that will be used by this tile. Depending on
587 // the tile priority, it will be one of hard_memory_limit or 680 // the tile priority, it will be one of hard_memory_limit or
588 // soft_memory_limit. 681 // soft_memory_limit.
589 MemoryUsage& tile_memory_limit = 682 MemoryUsage& tile_memory_limit =
590 tile_is_needed_now ? hard_memory_limit : soft_memory_limit; 683 tile_is_needed_now ? hard_memory_limit : soft_memory_limit;
591 684
592 bool memory_usage_is_within_limit = 685 bool memory_usage_is_within_limit =
593 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( 686 FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit(
594 tile_memory_limit - memory_required_by_tile_to_be_scheduled, 687 tile_memory_limit - memory_required_by_tile_to_be_scheduled,
595 priority, 688 priority, &memory_usage);
596 &memory_usage);
597 689
598 // If we couldn't fit the tile into our current memory limit, then we're 690 // If we couldn't fit the tile into our current memory limit, then we're
599 // done. 691 // done.
600 if (!memory_usage_is_within_limit) { 692 if (!memory_usage_is_within_limit) {
601 if (tile_is_needed_now) 693 if (tile_is_needed_now)
602 had_enough_memory_to_schedule_tiles_needed_now = false; 694 had_enough_memory_to_schedule_tiles_needed_now = false;
603 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false; 695 all_tiles_that_need_to_be_rasterized_are_scheduled_ = false;
604 break; 696 break;
605 } 697 }
606 698
(...skipping 10 matching lines...) Expand all
617 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget", 709 UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget",
618 !had_enough_memory_to_schedule_tiles_needed_now); 710 !had_enough_memory_to_schedule_tiles_needed_now);
619 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now; 711 did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
620 712
621 memory_stats_from_last_assign_.total_budget_in_bytes = 713 memory_stats_from_last_assign_.total_budget_in_bytes =
622 global_state_.hard_memory_limit_in_bytes; 714 global_state_.hard_memory_limit_in_bytes;
623 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes(); 715 memory_stats_from_last_assign_.total_bytes_used = memory_usage.memory_bytes();
624 memory_stats_from_last_assign_.had_enough_memory = 716 memory_stats_from_last_assign_.had_enough_memory =
625 had_enough_memory_to_schedule_tiles_needed_now; 717 had_enough_memory_to_schedule_tiles_needed_now;
626 718
627 raster_priority_queue_.Reset(); 719 TRACE_EVENT_END2("cc", "TileManager::AssignGpuMemoryToTiles",
628
629 TRACE_EVENT_END2("cc",
630 "TileManager::AssignGpuMemoryToTiles",
631 "all_tiles_that_need_to_be_rasterized_are_scheduled", 720 "all_tiles_that_need_to_be_rasterized_are_scheduled",
632 all_tiles_that_need_to_be_rasterized_are_scheduled_, 721 all_tiles_that_need_to_be_rasterized_are_scheduled_,
633 "had_enough_memory_to_schedule_tiles_needed_now", 722 "had_enough_memory_to_schedule_tiles_needed_now",
634 had_enough_memory_to_schedule_tiles_needed_now); 723 had_enough_memory_to_schedule_tiles_needed_now);
635 } 724 }
636 725
637 void TileManager::FreeResourcesForTile(Tile* tile) { 726 void TileManager::FreeResourcesForTile(Tile* tile) {
638 TileDrawInfo& draw_info = tile->draw_info(); 727 TileDrawInfo& draw_info = tile->draw_info();
639 if (draw_info.resource_) 728 if (draw_info.resource_)
640 resource_pool_->ReleaseResource(draw_info.resource_.Pass()); 729 resource_pool_->ReleaseResource(draw_info.resource_.Pass());
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 return; 852 return;
764 853
765 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; 854 PixelRefTaskMap& pixel_ref_tasks = layer_it->second;
766 PixelRefTaskMap::iterator task_it = 855 PixelRefTaskMap::iterator task_it =
767 pixel_ref_tasks.find(pixel_ref->getGenerationID()); 856 pixel_ref_tasks.find(pixel_ref->getGenerationID());
768 857
769 if (task_it != pixel_ref_tasks.end()) 858 if (task_it != pixel_ref_tasks.end())
770 pixel_ref_tasks.erase(task_it); 859 pixel_ref_tasks.erase(task_it);
771 } 860 }
772 861
862 void TileManager::CompleteRasterTask(
vmpstr 2014/12/23 09:51:03 Why not just call OnRasterTaskCompleted with false
hendrikw 2014/12/23 18:10:33 Changing to a callback, so it doesn't matter.
863 Tile::Id tile_id,
864 scoped_ptr<ScopedResource> resource,
865 const RasterSource::SolidColorAnalysis& analysis) {
866 OnRasterTaskCompleted(tile_id, resource.Pass(), analysis, false);
867 }
868
773 void TileManager::OnRasterTaskCompleted( 869 void TileManager::OnRasterTaskCompleted(
vmpstr 2014/12/23 09:51:02 Maybe a better split would be if OnRasterTaskCompl
hendrikw 2014/12/23 18:10:33 I'm not sure what InitializeTile is, how it relate
774 Tile::Id tile_id, 870 Tile::Id tile_id,
775 scoped_ptr<ScopedResource> resource, 871 scoped_ptr<ScopedResource> resource,
776 const RasterSource::SolidColorAnalysis& analysis, 872 const RasterSource::SolidColorAnalysis& analysis,
777 bool was_canceled) { 873 bool was_canceled) {
778 DCHECK(tiles_.find(tile_id) != tiles_.end()); 874 DCHECK(tiles_.find(tile_id) != tiles_.end());
779 875
780 Tile* tile = tiles_[tile_id]; 876 Tile* tile = tiles_[tile_id];
781 TileDrawInfo& draw_info = tile->draw_info(); 877 TileDrawInfo& draw_info = tile->draw_info();
782 DCHECK(tile->raster_task_.get()); 878 if (tile->raster_task_.get()) {
783 orphan_raster_tasks_.push_back(tile->raster_task_); 879 orphan_raster_tasks_.push_back(tile->raster_task_);
784 tile->raster_task_ = NULL; 880 tile->raster_task_ = nullptr;
881 }
785 882
786 if (was_canceled) { 883 if (was_canceled) {
787 ++update_visible_tiles_stats_.canceled_count; 884 ++update_visible_tiles_stats_.canceled_count;
788 resource_pool_->ReleaseResource(resource.Pass()); 885 resource_pool_->ReleaseResource(resource.Pass());
789 return; 886 return;
790 } 887 }
791 888
792 ++update_visible_tiles_stats_.completed_count; 889 ++update_visible_tiles_stats_.completed_count;
793 890
794 if (analysis.is_solid_color) { 891 if (analysis.is_solid_color) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
846 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); 943 const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers();
847 944
848 for (const auto& layer : layers) { 945 for (const auto& layer : layers) {
849 if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) 946 if (!layer->AllTilesRequiredForDrawAreReadyToDraw())
850 return false; 947 return false;
851 } 948 }
852 949
853 return true; 950 return true;
854 } 951 }
855 952
953 void TileManager::NotifyReadyToActivate() {
954 TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate");
955 if (did_notify_ready_to_activate_)
956 return;
957 client_->NotifyReadyToActivate();
958 did_notify_ready_to_activate_ = true;
959 }
960
961 void TileManager::NotifyReadyToDraw() {
962 TRACE_EVENT0("cc", "TileManager::NotifyReadyToDraw");
963 if (did_notify_ready_to_draw_)
vmpstr 2014/12/23 09:51:02 We check this twice now on the software path..
hendrikw 2014/12/23 18:10:33 I only see one (REQUIRED_FOR_DRAW), where's the se
964 return;
965 client_->NotifyReadyToDraw();
966 did_notify_ready_to_draw_ = true;
967 }
968
856 void TileManager::CheckIfReadyToActivate() { 969 void TileManager::CheckIfReadyToActivate() {
857 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); 970 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate");
858 971
859 tile_task_runner_->CheckForCompletedTasks(); 972 tile_task_runner_->CheckForCompletedTasks();
860 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 973 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
861 974
862 if (did_notify_ready_to_activate_) 975 if (did_notify_ready_to_activate_)
863 return; 976 return;
864 if (!IsReadyToActivate()) 977 if (!IsReadyToActivate())
865 return; 978 return;
866 979
867 client_->NotifyReadyToActivate(); 980 NotifyReadyToActivate();
868 did_notify_ready_to_activate_ = true;
869 } 981 }
870 982
871 void TileManager::CheckIfReadyToDraw() { 983 void TileManager::CheckIfReadyToDraw() {
872 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw"); 984 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToDraw");
873 985
874 tile_task_runner_->CheckForCompletedTasks(); 986 tile_task_runner_->CheckForCompletedTasks();
875 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 987 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
876 988
877 if (did_notify_ready_to_draw_) 989 if (did_notify_ready_to_draw_)
878 return; 990 return;
879 if (!IsReadyToDraw()) 991 if (!IsReadyToDraw())
880 return; 992 return;
881 993
882 client_->NotifyReadyToDraw(); 994 NotifyReadyToDraw();
883 did_notify_ready_to_draw_ = true;
884 } 995 }
885 996
886 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) { 997 TileManager::MemoryUsage::MemoryUsage() : memory_bytes_(0), resource_count_(0) {
887 } 998 }
888 999
889 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count) 1000 TileManager::MemoryUsage::MemoryUsage(int64 memory_bytes, int resource_count)
890 : memory_bytes_(memory_bytes), resource_count_(resource_count) { 1001 : memory_bytes_(memory_bytes), resource_count_(resource_count) {
891 } 1002 }
892 1003
893 // static 1004 // static
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 result -= other; 1037 result -= other;
927 return result; 1038 return result;
928 } 1039 }
929 1040
930 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const { 1041 bool TileManager::MemoryUsage::Exceeds(const MemoryUsage& limit) const {
931 return memory_bytes_ > limit.memory_bytes_ || 1042 return memory_bytes_ > limit.memory_bytes_ ||
932 resource_count_ > limit.resource_count_; 1043 resource_count_ > limit.resource_count_;
933 } 1044 }
934 1045
935 } // namespace cc 1046 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698