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

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

Issue 15995033: cc: Low quality support for low res tiles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: typo fix Created 7 years, 6 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 <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/json/json_writer.h" 11 #include "base/json/json_writer.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/metrics/histogram.h" 13 #include "base/metrics/histogram.h"
14 #include "cc/debug/devtools_instrumentation.h" 14 #include "cc/debug/devtools_instrumentation.h"
15 #include "cc/debug/traced_value.h" 15 #include "cc/debug/traced_value.h"
16 #include "cc/resources/image_raster_worker_pool.h" 16 #include "cc/resources/image_raster_worker_pool.h"
17 #include "cc/resources/pixel_buffer_raster_worker_pool.h" 17 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
18 #include "cc/resources/tile.h" 18 #include "cc/resources/tile.h"
19 #include "skia/ext/paint_simplifier.h"
19 #include "third_party/skia/include/core/SkCanvas.h" 20 #include "third_party/skia/include/core/SkCanvas.h"
20 #include "ui/gfx/rect_conversions.h" 21 #include "ui/gfx/rect_conversions.h"
21 22
22 namespace cc { 23 namespace cc {
23 24
24 namespace { 25 namespace {
25 26
27 class DisableLCDTextFilter : public SkDrawFilter {
28 public:
29 // SkDrawFilter interface.
30 virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE {
31 if (type != SkDrawFilter::kText_Type)
32 return true;
33
34 paint->setLCDRenderText(false);
35 return true;
36 }
37 };
38
26 // Determine bin based on three categories of tiles: things we need now, 39 // Determine bin based on three categories of tiles: things we need now,
27 // things we need soon, and eventually. 40 // things we need soon, and eventually.
28 inline TileManagerBin BinFromTilePriority(const TilePriority& prio) { 41 inline TileManagerBin BinFromTilePriority(const TilePriority& prio) {
29 // The amount of time for which we want to have prepainting coverage. 42 // The amount of time for which we want to have prepainting coverage.
30 const float kPrepaintingWindowTimeSeconds = 1.0f; 43 const float kPrepaintingWindowTimeSeconds = 1.0f;
31 const float kBackflingGuardDistancePixels = 314.0f; 44 const float kBackflingGuardDistancePixels = 314.0f;
32 45
33 if (prio.time_to_visible_in_seconds == 0) 46 if (prio.time_to_visible_in_seconds == 0)
34 return NOW_BIN; 47 return NOW_BIN;
35 48
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 312
300 if (!client_->ShouldForceTileUploadsRequiredForActivationToComplete()) 313 if (!client_->ShouldForceTileUploadsRequiredForActivationToComplete())
301 return; 314 return;
302 315
303 TileSet initialized_tiles; 316 TileSet initialized_tiles;
304 for (TileSet::iterator it = 317 for (TileSet::iterator it =
305 tiles_that_need_to_be_initialized_for_activation_.begin(); 318 tiles_that_need_to_be_initialized_for_activation_.begin();
306 it != tiles_that_need_to_be_initialized_for_activation_.end(); 319 it != tiles_that_need_to_be_initialized_for_activation_.end();
307 ++it) { 320 ++it) {
308 Tile* tile = *it; 321 Tile* tile = *it;
309 if (!tile->managed_state().raster_task.is_null() && 322 ManagedTileState& mts = tile->managed_state();
310 !tile->tile_version().forced_upload_) {
311 if (!raster_worker_pool_->ForceUploadToComplete(
312 tile->managed_state().raster_task))
313 continue;
314 323
315 // Setting |forced_upload_| to true makes this tile ready to draw. 324 // Tiles that already have a resource
316 tile->tile_version().forced_upload_ = true; 325 // shouldn't be required for activation.
317 initialized_tiles.insert(tile); 326 DCHECK(!tile->tile_version().resource_);
327
328 ManagedTileState::TileVersionMap::iterator version_it;
329 for (version_it = mts.pending_tile_versions.begin();
330 version_it != mts.pending_tile_versions.end();
331 ++version_it) {
332 ManagedTileState::TileVersion* pending_version = version_it->second;
333 if (!pending_version->forced_upload_) {
334 if (!raster_worker_pool_->ForceUploadToComplete(
335 pending_version->raster_task_)) {
336 continue;
337 }
338
339 if (tile->tile_version().ShouldBeUpdatedBy(
340 pending_version->raster_mode_)) {
341 tile->tile_version().forced_upload_ = true;
342 tile->tile_version().resource_id_ = pending_version->resource_id_;
343 tile->tile_version().raster_mode_ = pending_version->raster_mode_;
344 initialized_tiles.insert(tile);
345 break;
346 }
347 }
318 } 348 }
319 } 349 }
320 350
321 for (TileSet::iterator it = initialized_tiles.begin(); 351 for (TileSet::iterator it = initialized_tiles.begin();
322 it != initialized_tiles.end(); 352 it != initialized_tiles.end();
323 ++it) { 353 ++it) {
324 Tile* tile = *it; 354 Tile* tile = *it;
325 DidFinishTileInitialization(tile); 355 DidFinishTileInitialization(tile);
326 DCHECK(tile->tile_version().IsReadyToDraw()); 356 DCHECK(tile->tile_version().IsReadyToDraw());
327 } 357 }
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 } 416 }
387 417
388 void TileManager::AddRequiredTileForActivation(Tile* tile) { 418 void TileManager::AddRequiredTileForActivation(Tile* tile) {
389 DCHECK(std::find(tiles_that_need_to_be_initialized_for_activation_.begin(), 419 DCHECK(std::find(tiles_that_need_to_be_initialized_for_activation_.begin(),
390 tiles_that_need_to_be_initialized_for_activation_.end(), 420 tiles_that_need_to_be_initialized_for_activation_.end(),
391 tile) == 421 tile) ==
392 tiles_that_need_to_be_initialized_for_activation_.end()); 422 tiles_that_need_to_be_initialized_for_activation_.end());
393 tiles_that_need_to_be_initialized_for_activation_.insert(tile); 423 tiles_that_need_to_be_initialized_for_activation_.insert(tile);
394 } 424 }
395 425
426 TileRasterMode TileManager::DetermineRasterMode(const Tile* tile) const {
427 DCHECK(tile);
428 DCHECK(tile->picture_pile());
429
430 TileRasterMode raster_mode = INVALID_RASTER_MODE;
431
432 if (tile->managed_state().resolution == LOW_RESOLUTION)
433 raster_mode = LOW_QUALITY_RASTER_MODE;
434 else if (!tile->picture_pile()->can_use_lcd_text())
435 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE;
436 else
437 raster_mode = HIGH_QUALITY_RASTER_MODE;
438
439 return raster_mode;
440 }
441
396 void TileManager::AssignGpuMemoryToTiles() { 442 void TileManager::AssignGpuMemoryToTiles() {
397 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); 443 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles");
398 444
399 // Now give memory out to the tiles until we're out, and build 445 // Now give memory out to the tiles until we're out, and build
400 // the needs-to-be-rasterized queue. 446 // the needs-to-be-rasterized queue.
401 tiles_that_need_to_be_rasterized_.clear(); 447 tiles_that_need_to_be_rasterized_.clear();
402 tiles_that_need_to_be_initialized_for_activation_.clear(); 448 tiles_that_need_to_be_initialized_for_activation_.clear();
403 449
404 size_t bytes_releasable = 0; 450 size_t bytes_releasable = 0;
405 for (TileVector::const_iterator it = tiles_.begin(); 451 for (TileVector::const_iterator it = tiles_.begin();
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 FreeResourcesForTile(tile); 486 FreeResourcesForTile(tile);
441 continue; 487 continue;
442 } 488 }
443 489
444 size_t tile_bytes = 0; 490 size_t tile_bytes = 0;
445 491
446 // It costs to maintain a resource. 492 // It costs to maintain a resource.
447 if (tile_version.resource_) 493 if (tile_version.resource_)
448 tile_bytes += tile->bytes_consumed_if_allocated(); 494 tile_bytes += tile->bytes_consumed_if_allocated();
449 495
450 // It will cost to allocate a resource. 496 TileRasterMode current_raster_mode = tile_version.raster_mode_;
451 // Note that this is separate from the above condition, 497 TileRasterMode required_raster_mode = DetermineRasterMode(tile);
reveman 2013/06/05 14:25:13 What if you compute new raster mode as the best of
452 // so that it's clear why we're adding memory. 498
453 if (!tile_version.resource_ && mts.raster_task.is_null()) 499 ManagedTileState::TileVersionMap::iterator version_it =
500 mts.pending_tile_versions.find(required_raster_mode);
501
502 // If we don't have the current version, and it's not in flight
503 // then we'll have to pay to create a new task.
504 if (version_it == mts.pending_tile_versions.end() &&
505 (!tile_version.resource_ ||
506 (current_raster_mode != required_raster_mode))) {
454 tile_bytes += tile->bytes_consumed_if_allocated(); 507 tile_bytes += tile->bytes_consumed_if_allocated();
508 }
455 509
456 // Tile is OOM. 510 // Tile is OOM.
457 if (tile_bytes > bytes_left) { 511 if (tile_bytes > bytes_left) {
458 tile->tile_version().set_rasterize_on_demand(); 512 tile->tile_version().set_rasterize_on_demand();
459 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) { 513 if (mts.tree_bin[PENDING_TREE] == NOW_BIN) {
460 tiles_requiring_memory_but_oomed.push_back(tile); 514 tiles_requiring_memory_but_oomed.push_back(tile);
461 bytes_oom_in_now_bin_on_pending_tree += tile_bytes; 515 bytes_oom_in_now_bin_on_pending_tree += tile_bytes;
462 } 516 }
463 FreeResourcesForTile(tile); 517 FreeResourcesForTile(tile);
464 higher_priority_tile_oomed = true; 518 higher_priority_tile_oomed = true;
465 continue; 519 continue;
466 } 520 }
467 521
468 tile_version.set_use_resource(); 522 tile_version.set_use_resource();
469 bytes_left -= tile_bytes; 523 bytes_left -= tile_bytes;
470 524
471 // Tile shouldn't be rasterized if we've failed to assign 525 // Tile shouldn't be rasterized if we've failed to assign
472 // gpu memory to a higher priority tile. This is important for 526 // gpu memory to a higher priority tile. This is important for
473 // two reasons: 527 // two reasons:
474 // 1. Tile size should not impact raster priority. 528 // 1. Tile size should not impact raster priority.
475 // 2. Tile with unreleasable memory could otherwise incorrectly 529 // 2. Tile with unreleasable memory could otherwise incorrectly
476 // be added as it's not affected by |bytes_allocatable|. 530 // be added as it's not affected by |bytes_allocatable|.
477 if (higher_priority_tile_oomed) 531 if (higher_priority_tile_oomed)
478 continue; 532 continue;
479 533
480 if (!tile_version.resource_) 534 if (!tile_version.resource_ ||
535 (current_raster_mode != required_raster_mode)) {
481 tiles_that_need_to_be_rasterized_.push_back(tile); 536 tiles_that_need_to_be_rasterized_.push_back(tile);
537 }
482 538
483 if (!tile_version.resource_ && tile->required_for_activation()) 539 if (!tile_version.resource_ && tile->required_for_activation())
484 AddRequiredTileForActivation(tile); 540 AddRequiredTileForActivation(tile);
485 } 541 }
486 542
487 // In OOM situation, we iterate tiles_, remove the memory for active tree 543 // In OOM situation, we iterate tiles_, remove the memory for active tree
488 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree 544 // and not the now bin. And give them to bytes_oom_in_now_bin_on_pending_tree
489 if (!tiles_requiring_memory_but_oomed.empty()) { 545 if (!tiles_requiring_memory_but_oomed.empty()) {
490 size_t bytes_freed = 0; 546 size_t bytes_freed = 0;
491 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { 547 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 RasterWorkerPool::RasterTask::Queue tasks; 610 RasterWorkerPool::RasterTask::Queue tasks;
555 611
556 // Build a new task queue containing all task currently needed. Tasks 612 // Build a new task queue containing all task currently needed. Tasks
557 // are added in order of priority, highest priority task first. 613 // are added in order of priority, highest priority task first.
558 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); 614 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin();
559 it != tiles_that_need_to_be_rasterized_.end(); 615 it != tiles_that_need_to_be_rasterized_.end();
560 ++it) { 616 ++it) {
561 Tile* tile = *it; 617 Tile* tile = *it;
562 ManagedTileState& mts = tile->managed_state(); 618 ManagedTileState& mts = tile->managed_state();
563 619
620 TileRasterMode required_raster_mode = DetermineRasterMode(tile);
621
564 DCHECK(tile->tile_version().requires_resource()); 622 DCHECK(tile->tile_version().requires_resource());
565 DCHECK(!tile->tile_version().resource_); 623 DCHECK(!tile->tile_version().resource_ ||
624 (tile->tile_version().raster_mode_ != required_raster_mode));
566 625
567 // Create raster task for this tile if necessary. 626 ManagedTileState::TileVersionMap::iterator version_it =
568 if (mts.raster_task.is_null()) 627 mts.pending_tile_versions.find(required_raster_mode);
569 mts.raster_task = CreateRasterTask(tile);
570 628
571 // Finally append raster task. 629 // Create tile version for this tile if necessary.
572 tasks.Append(mts.raster_task); 630 if (version_it == mts.pending_tile_versions.end()) {
631 ManagedTileState::TileVersion* new_tile_version =
632 new ManagedTileState::TileVersion;
633
634 new_tile_version->raster_task_ =
635 CreateRasterTask(tile, &new_tile_version->resource_id_);
636 new_tile_version->raster_mode_ = required_raster_mode;
637
638 mts.pending_tile_versions.insert(
639 std::make_pair(required_raster_mode, new_tile_version));
640
641 version_it = mts.pending_tile_versions.find(required_raster_mode);
642 }
643
644 tasks.Append(version_it->second->raster_task_);
573 } 645 }
574 646
575 // Schedule running of |tasks|. This replaces any previously 647 // Schedule running of |tasks|. This replaces any previously
576 // scheduled tasks and effectively cancels all tasks not present 648 // scheduled tasks and effectively cancels all tasks not present
577 // in |tasks|. 649 // in |tasks|.
578 raster_worker_pool_->ScheduleTasks(&tasks); 650 raster_worker_pool_->ScheduleTasks(&tasks);
579 } 651 }
580 652
581 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 653 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
582 Tile* tile, skia::LazyPixelRef* pixel_ref) { 654 Tile* tile, skia::LazyPixelRef* pixel_ref) {
(...skipping 21 matching lines...) Expand all
604 TileManager::RasterTaskMetadata TileManager::GetRasterTaskMetadata( 676 TileManager::RasterTaskMetadata TileManager::GetRasterTaskMetadata(
605 const Tile& tile) const { 677 const Tile& tile) const {
606 RasterTaskMetadata metadata; 678 RasterTaskMetadata metadata;
607 const ManagedTileState& mts = tile.managed_state(); 679 const ManagedTileState& mts = tile.managed_state();
608 metadata.is_tile_in_pending_tree_now_bin = 680 metadata.is_tile_in_pending_tree_now_bin =
609 mts.tree_bin[PENDING_TREE] == NOW_BIN; 681 mts.tree_bin[PENDING_TREE] == NOW_BIN;
610 metadata.tile_resolution = mts.resolution; 682 metadata.tile_resolution = mts.resolution;
611 metadata.layer_id = tile.layer_id(); 683 metadata.layer_id = tile.layer_id();
612 metadata.tile_id = &tile; 684 metadata.tile_id = &tile;
613 metadata.source_frame_number = tile.source_frame_number(); 685 metadata.source_frame_number = tile.source_frame_number();
686 metadata.raster_mode = DetermineRasterMode(&tile);
614 return metadata; 687 return metadata;
615 } 688 }
616 689
617 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { 690 RasterWorkerPool::RasterTask TileManager::CreateRasterTask(
618 TRACE_EVENT0("cc", "TileManager::CreateRasterTask"); 691 Tile* tile,
692 ResourceProvider::ResourceId* resource_id) {
693 TRACE_EVENT0("cc", "TileManager::CreateNewTileVersion");
619 694
620 scoped_ptr<ResourcePool::Resource> resource = 695 scoped_ptr<ResourcePool::Resource> resource =
621 resource_pool_->AcquireResource( 696 resource_pool_->AcquireResource(
622 tile->tile_size_.size(), 697 tile->tile_size_.size(),
623 tile->tile_version().resource_format_); 698 tile->tile_version().resource_format_);
624 const Resource* const_resource = resource.get(); 699 const Resource* const_resource = resource.get();
625 700
626 tile->tile_version().resource_id_ = resource->id(); 701 DCHECK(resource_id);
702 *resource_id = resource->id();
627 703
628 PicturePileImpl::Analysis* analysis = new PicturePileImpl::Analysis; 704 PicturePileImpl::Analysis* analysis = new PicturePileImpl::Analysis;
629 705
630 // Create and queue all image decode tasks that this tile depends on. 706 // Create and queue all image decode tasks that this tile depends on.
631 RasterWorkerPool::Task::Set decode_tasks; 707 RasterWorkerPool::Task::Set decode_tasks;
632 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(), 708 for (PicturePileImpl::PixelRefIterator iter(tile->content_rect(),
633 tile->contents_scale(), 709 tile->contents_scale(),
634 tile->picture_pile()); 710 tile->picture_pile());
635 iter; ++iter) { 711 iter; ++iter) {
636 skia::LazyPixelRef* pixel_ref = *iter; 712 skia::LazyPixelRef* pixel_ref = *iter;
(...skipping 12 matching lines...) Expand all
649 continue; 725 continue;
650 } 726 }
651 727
652 // Create and append new image decode task for this pixel ref. 728 // Create and append new image decode task for this pixel ref.
653 RasterWorkerPool::Task decode_task = CreateImageDecodeTask( 729 RasterWorkerPool::Task decode_task = CreateImageDecodeTask(
654 tile, pixel_ref); 730 tile, pixel_ref);
655 decode_tasks.Insert(decode_task); 731 decode_tasks.Insert(decode_task);
656 pending_decode_tasks_[id] = decode_task; 732 pending_decode_tasks_[id] = decode_task;
657 } 733 }
658 734
735 RasterTaskMetadata metadata = GetRasterTaskMetadata(*tile);
659 return RasterWorkerPool::RasterTask( 736 return RasterWorkerPool::RasterTask(
660 tile->picture_pile(), 737 tile->picture_pile(),
661 const_resource, 738 const_resource,
662 base::Bind(&TileManager::RunAnalyzeAndRasterTask, 739 base::Bind(&TileManager::RunAnalyzeAndRasterTask,
663 base::Bind(&TileManager::RunAnalyzeTask, 740 base::Bind(&TileManager::RunAnalyzeTask,
664 analysis, 741 analysis,
665 tile->content_rect(), 742 tile->content_rect(),
666 tile->contents_scale(), 743 tile->contents_scale(),
667 use_color_estimator_, 744 use_color_estimator_,
668 GetRasterTaskMetadata(*tile), 745 metadata,
669 rendering_stats_instrumentation_), 746 rendering_stats_instrumentation_),
670 base::Bind(&TileManager::RunRasterTask, 747 base::Bind(&TileManager::RunRasterTask,
671 analysis, 748 analysis,
672 tile->content_rect(), 749 tile->content_rect(),
673 tile->contents_scale(), 750 tile->contents_scale(),
674 GetRasterTaskMetadata(*tile), 751 metadata,
675 rendering_stats_instrumentation_)), 752 rendering_stats_instrumentation_)),
676 base::Bind(&TileManager::OnRasterTaskCompleted, 753 base::Bind(&TileManager::OnRasterTaskCompleted,
677 base::Unretained(this), 754 base::Unretained(this),
678 make_scoped_refptr(tile), 755 make_scoped_refptr(tile),
679 base::Passed(&resource), 756 base::Passed(&resource),
680 base::Owned(analysis)), 757 base::Owned(analysis),
758 metadata.raster_mode),
681 &decode_tasks); 759 &decode_tasks);
682 } 760 }
683 761
684 void TileManager::OnRasterTaskCompleted( 762 void TileManager::OnRasterTaskCompleted(
685 scoped_refptr<Tile> tile, 763 scoped_refptr<Tile> tile,
686 scoped_ptr<ResourcePool::Resource> resource, 764 scoped_ptr<ResourcePool::Resource> resource,
687 PicturePileImpl::Analysis* analysis, 765 PicturePileImpl::Analysis* analysis,
766 TileRasterMode raster_mode,
688 bool was_canceled) { 767 bool was_canceled) {
689 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", 768 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted",
690 "was_canceled", was_canceled); 769 "was_canceled", was_canceled);
691 770
692 ManagedTileState& mts = tile->managed_state(); 771 ManagedTileState& mts = tile->managed_state();
693 DCHECK(!mts.raster_task.is_null()); 772 ManagedTileState::TileVersionMap::iterator version_it =
694 mts.raster_task.Reset(); 773 mts.pending_tile_versions.find(raster_mode);
774
775 DCHECK(version_it != mts.pending_tile_versions.end());
776
777 scoped_ptr<ManagedTileState::TileVersion> new_tile_version(
778 version_it->second);
779 mts.pending_tile_versions.erase(version_it);
780
781 new_tile_version->raster_task_.Reset();
782 new_tile_version->forced_upload_ = false;
783 new_tile_version->resource_ = resource.Pass();
695 784
696 if (was_canceled) { 785 if (was_canceled) {
697 resource_pool_->ReleaseResource(resource.Pass()); 786 resource_pool_->ReleaseResource(new_tile_version->resource_.Pass());
698 return; 787 return;
699 } 788 }
700 789
790 // Release the current resource in preparation of update.
791 if (tile->tile_version().resource_ &&
792 tile->tile_version().ShouldBeUpdatedBy(raster_mode)) {
793 resource_pool_->ReleaseResource(tile->tile_version().resource_.Pass());
794 DCHECK(tile->tile_version().raster_mode_ != raster_mode);
795 tile->tile_version().raster_mode_ = INVALID_RASTER_MODE;
796 tile->tile_version().forced_upload_ = false;
797 }
798
701 mts.picture_pile_analysis = *analysis; 799 mts.picture_pile_analysis = *analysis;
702 mts.picture_pile_analyzed = true; 800 mts.picture_pile_analyzed = true;
703 801
802 // If the tile is solid color, mark it as such
803 // Otherwise, only update the resource if the tile doesn't have one.
804 // This would have been cleared above, if this version is better than
805 // the existing one.
704 if (analysis->is_solid_color) { 806 if (analysis->is_solid_color) {
705 tile->tile_version().set_solid_color(analysis->solid_color); 807 tile->tile_version().set_solid_color(analysis->solid_color);
706 resource_pool_->ReleaseResource(resource.Pass()); 808 } else if (!tile->tile_version().resource_) {
707 } else { 809 new_tile_version->PushPropertiesTo(&tile->tile_version());
708 tile->tile_version().resource_ = resource.Pass();
709 } 810 }
710 811
812 if (new_tile_version->resource_)
813 resource_pool_->ReleaseResource(new_tile_version->resource_.Pass());
814
711 DidFinishTileInitialization(tile.get()); 815 DidFinishTileInitialization(tile.get());
712 } 816 }
713 817
714 void TileManager::DidFinishTileInitialization(Tile* tile) { 818 void TileManager::DidFinishTileInitialization(Tile* tile) {
715 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 819 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
716 did_initialize_visible_tile_ = true; 820 did_initialize_visible_tile_ = true;
717 if (tile->required_for_activation()) { 821 if (tile->required_for_activation()) {
718 // It's possible that a tile required for activation is not in this list 822 // It's possible that a tile required for activation is not in this list
719 // if it was marked as being required after being dispatched for 823 // if it was marked as being required after being dispatched for
720 // rasterization but before AssignGPUMemory was called again. 824 // rasterization but before AssignGPUMemory was called again.
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
784 analysis->is_solid_color &= use_color_estimator; 888 analysis->is_solid_color &= use_color_estimator;
785 } 889 }
786 890
787 scoped_ptr<base::Value> TileManager::RasterTaskMetadata::AsValue() const { 891 scoped_ptr<base::Value> TileManager::RasterTaskMetadata::AsValue() const {
788 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); 892 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue());
789 res->Set("tile_id", TracedValue::CreateIDRef(tile_id).release()); 893 res->Set("tile_id", TracedValue::CreateIDRef(tile_id).release());
790 res->SetBoolean("is_tile_in_pending_tree_now_bin", 894 res->SetBoolean("is_tile_in_pending_tree_now_bin",
791 is_tile_in_pending_tree_now_bin); 895 is_tile_in_pending_tree_now_bin);
792 res->Set("resolution", TileResolutionAsValue(tile_resolution).release()); 896 res->Set("resolution", TileResolutionAsValue(tile_resolution).release());
793 res->SetInteger("source_frame_number", source_frame_number); 897 res->SetInteger("source_frame_number", source_frame_number);
898 res->SetInteger("raster_mode", raster_mode);
794 return res.PassAs<base::Value>(); 899 return res.PassAs<base::Value>();
795 } 900 }
796 901
797 // static 902 // static
798 bool TileManager::RunRasterTask( 903 bool TileManager::RunRasterTask(
799 PicturePileImpl::Analysis* analysis, 904 PicturePileImpl::Analysis* analysis,
800 gfx::Rect rect, 905 gfx::Rect rect,
801 float contents_scale, 906 float contents_scale,
802 const RasterTaskMetadata& metadata, 907 const RasterTaskMetadata& metadata,
803 RenderingStatsInstrumentation* stats_instrumentation, 908 RenderingStatsInstrumentation* stats_instrumentation,
804 SkDevice* device, 909 SkDevice* device,
805 PicturePileImpl* picture_pile) { 910 PicturePileImpl* picture_pile) {
806 TRACE_EVENT1( 911 TRACE_EVENT1(
807 "cc", "TileManager::RunRasterTask", 912 "cc", "TileManager::RunRasterTask",
808 "metadata", TracedValue::FromValue(metadata.AsValue().release())); 913 "metadata", TracedValue::FromValue(metadata.AsValue().release()));
809 devtools_instrumentation::ScopedLayerTask raster_task( 914 devtools_instrumentation::ScopedLayerTask raster_task(
810 devtools_instrumentation::kRasterTask, metadata.layer_id); 915 devtools_instrumentation::kRasterTask, metadata.layer_id);
811 916
812 DCHECK(picture_pile); 917 DCHECK(picture_pile);
813 DCHECK(analysis); 918 DCHECK(analysis);
814 DCHECK(device); 919 DCHECK(device);
815 920
816 if (analysis->is_solid_color) 921 if (analysis->is_solid_color)
817 return false; 922 return false;
818 923
819 SkCanvas canvas(device); 924 SkCanvas canvas(device);
820 925
926 skia::RefPtr<SkDrawFilter> draw_filter;
927 switch (metadata.raster_mode) {
928 case LOW_QUALITY_RASTER_MODE:
929 draw_filter = skia::AdoptRef(new skia::PaintSimplifier);
930 break;
931 case HIGH_QUALITY_NO_LCD_RASTER_MODE:
932 draw_filter = skia::AdoptRef(new DisableLCDTextFilter);
933 break;
934 case HIGH_QUALITY_RASTER_MODE:
935 break;
936 case INVALID_RASTER_MODE:
937 default:
938 NOTREACHED();
939 }
940
941 canvas.setDrawFilter(draw_filter.get());
942
821 if (stats_instrumentation->record_rendering_stats()) { 943 if (stats_instrumentation->record_rendering_stats()) {
822 PicturePileImpl::RasterStats raster_stats; 944 PicturePileImpl::RasterStats raster_stats;
823 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, &raster_stats); 945 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, &raster_stats);
824 stats_instrumentation->AddRaster( 946 stats_instrumentation->AddRaster(
825 raster_stats.total_rasterize_time, 947 raster_stats.total_rasterize_time,
826 raster_stats.best_rasterize_time, 948 raster_stats.best_rasterize_time,
827 raster_stats.total_pixels_rasterized, 949 raster_stats.total_pixels_rasterized,
828 metadata.is_tile_in_pending_tree_now_bin); 950 metadata.is_tile_in_pending_tree_now_bin);
829 951
830 HISTOGRAM_CUSTOM_COUNTS( 952 HISTOGRAM_CUSTOM_COUNTS(
831 "Renderer4.PictureRasterTimeUS", 953 "Renderer4.PictureRasterTimeUS",
832 raster_stats.total_rasterize_time.InMicroseconds(), 954 raster_stats.total_rasterize_time.InMicroseconds(),
833 0, 955 0,
834 100000, 956 100000,
835 100); 957 100);
836 } else { 958 } else {
837 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, NULL); 959 picture_pile->RasterToBitmap(&canvas, rect, contents_scale, NULL);
838 } 960 }
839 961
840 return true; 962 return true;
841 } 963 }
842 964
843 } // namespace cc 965 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698