OLD | NEW |
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/tile_manager.h" | 5 #include "cc/tile_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 | 109 |
110 ManagedTileState::~ManagedTileState() { | 110 ManagedTileState::~ManagedTileState() { |
111 DCHECK(!resource); | 111 DCHECK(!resource); |
112 DCHECK(!resource_is_being_initialized); | 112 DCHECK(!resource_is_being_initialized); |
113 } | 113 } |
114 | 114 |
115 TileManager::TileManager( | 115 TileManager::TileManager( |
116 TileManagerClient* client, | 116 TileManagerClient* client, |
117 ResourceProvider* resource_provider, | 117 ResourceProvider* resource_provider, |
118 size_t num_raster_threads, | 118 size_t num_raster_threads, |
119 bool record_rendering_stats) | 119 bool record_rendering_stats, |
| 120 bool use_cheapness_estimator) |
120 : client_(client), | 121 : client_(client), |
121 resource_pool_(ResourcePool::Create(resource_provider)), | 122 resource_pool_(ResourcePool::Create(resource_provider)), |
122 raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads, record_re
ndering_stats)), | 123 raster_worker_pool_(RasterWorkerPool::Create(num_raster_threads, record_re
ndering_stats)), |
123 manage_tiles_pending_(false), | 124 manage_tiles_pending_(false), |
124 manage_tiles_call_count_(0), | 125 manage_tiles_call_count_(0), |
125 bytes_pending_set_pixels_(0), | 126 bytes_pending_set_pixels_(0), |
126 ever_exceeded_memory_budget_(false), | 127 ever_exceeded_memory_budget_(false), |
127 record_rendering_stats_(record_rendering_stats) { | 128 record_rendering_stats_(record_rendering_stats), |
| 129 use_cheapness_estimator_(use_cheapness_estimator) { |
128 for (int i = 0; i < NUM_STATES; ++i) { | 130 for (int i = 0; i < NUM_STATES; ++i) { |
129 for (int j = 0; j < NUM_TREES; ++j) { | 131 for (int j = 0; j < NUM_TREES; ++j) { |
130 for (int k = 0; k < NUM_BINS; ++k) | 132 for (int k = 0; k < NUM_BINS; ++k) |
131 raster_state_count_[i][j][k] = 0; | 133 raster_state_count_[i][j][k] = 0; |
132 } | 134 } |
133 } | 135 } |
134 } | 136 } |
135 | 137 |
136 TileManager::~TileManager() { | 138 TileManager::~TileManager() { |
137 // Reset global state and manage. This should cause | 139 // Reset global state and manage. This should cause |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { | 628 if (pixel_ref_id == (*pixel_it)->getGenerationID()) { |
627 pixel_refs.erase(pixel_it); | 629 pixel_refs.erase(pixel_it); |
628 break; | 630 break; |
629 } | 631 } |
630 } | 632 } |
631 } | 633 } |
632 | 634 |
633 DispatchMoreTasks(); | 635 DispatchMoreTasks(); |
634 } | 636 } |
635 | 637 |
636 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { | 638 scoped_ptr<ResourcePool::Resource> TileManager::PrepareTileForRaster( |
637 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); | 639 Tile* tile) { |
638 ManagedTileState& managed_tile_state = tile->managed_state(); | 640 ManagedTileState& managed_tile_state = tile->managed_state(); |
639 DCHECK(managed_tile_state.can_use_gpu_memory); | 641 DCHECK(managed_tile_state.can_use_gpu_memory); |
640 scoped_ptr<ResourcePool::Resource> resource = | 642 scoped_ptr<ResourcePool::Resource> resource = |
641 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); | 643 resource_pool_->AcquireResource(tile->tile_size_.size(), tile->format_); |
642 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); | 644 resource_pool_->resource_provider()->acquirePixelBuffer(resource->id()); |
643 | 645 |
644 managed_tile_state.resource_is_being_initialized = true; | 646 managed_tile_state.resource_is_being_initialized = true; |
645 managed_tile_state.can_be_freed = false; | 647 managed_tile_state.can_be_freed = false; |
646 | 648 |
647 DidTileRasterStateChange(tile, RASTER_STATE); | 649 DidTileRasterStateChange(tile, RASTER_STATE); |
| 650 return resource.Pass(); |
| 651 } |
648 | 652 |
| 653 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { |
| 654 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); |
| 655 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); |
649 ResourceProvider::ResourceId resource_id = resource->id(); | 656 ResourceProvider::ResourceId resource_id = resource->id(); |
650 | 657 |
651 raster_worker_pool_->PostRasterTaskAndReply( | 658 raster_worker_pool_->PostRasterTaskAndReply( |
652 tile->picture_pile(), | 659 tile->picture_pile(), |
653 base::Bind(&TileManager::RunRasterTask, | 660 base::Bind(&TileManager::PerformRaster, |
654 resource_pool_->resource_provider()->mapPixelBuffer( | 661 resource_pool_->resource_provider()->mapPixelBuffer( |
655 resource_id), | 662 resource_id), |
656 tile->content_rect_, | 663 tile->content_rect_, |
657 tile->contents_scale()), | 664 tile->contents_scale(), |
| 665 use_cheapness_estimator_), |
658 base::Bind(&TileManager::OnRasterTaskCompleted, | 666 base::Bind(&TileManager::OnRasterTaskCompleted, |
659 base::Unretained(this), | 667 base::Unretained(this), |
660 tile, | 668 tile, |
661 base::Passed(&resource), | 669 base::Passed(&resource), |
662 manage_tiles_call_count_)); | 670 manage_tiles_call_count_)); |
663 } | 671 } |
664 | 672 |
665 void TileManager::OnRasterTaskCompleted( | 673 void TileManager::PerformOneRaster(Tile* tile) { |
| 674 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); |
| 675 ResourceProvider::ResourceId resource_id = resource->id(); |
| 676 |
| 677 PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer( |
| 678 resource_id), |
| 679 tile->content_rect_, |
| 680 tile->contents_scale(), |
| 681 use_cheapness_estimator_, |
| 682 tile->picture_pile(), |
| 683 &rendering_stats_); |
| 684 |
| 685 OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_); |
| 686 } |
| 687 |
| 688 void TileManager::OnRasterCompleted( |
666 scoped_refptr<Tile> tile, | 689 scoped_refptr<Tile> tile, |
667 scoped_ptr<ResourcePool::Resource> resource, | 690 scoped_ptr<ResourcePool::Resource> resource, |
668 int manage_tiles_call_count_when_dispatched) { | 691 int manage_tiles_call_count_when_dispatched) { |
669 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted"); | 692 TRACE_EVENT0("cc", "TileManager::OnRasterCompleted"); |
670 | 693 |
671 // Release raster resources. | 694 // Release raster resources. |
672 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); | 695 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); |
673 | 696 |
674 ManagedTileState& managed_tile_state = tile->managed_state(); | 697 ManagedTileState& managed_tile_state = tile->managed_state(); |
675 managed_tile_state.can_be_freed = true; | 698 managed_tile_state.can_be_freed = true; |
676 | 699 |
677 // Tile can be freed after the completion of the raster task. Call | 700 // Tile can be freed after the completion of the raster task. Call |
678 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority | 701 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority |
679 // tiles if ManageTiles() was called since task was dispatched. The result | 702 // tiles if ManageTiles() was called since task was dispatched. The result |
(...skipping 20 matching lines...) Expand all Loading... |
700 | 723 |
701 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); | 724 bytes_pending_set_pixels_ += tile->bytes_consumed_if_allocated(); |
702 DidTileRasterStateChange(tile, SET_PIXELS_STATE); | 725 DidTileRasterStateChange(tile, SET_PIXELS_STATE); |
703 tiles_with_pending_set_pixels_.push(tile); | 726 tiles_with_pending_set_pixels_.push(tile); |
704 } else { | 727 } else { |
705 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); | 728 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); |
706 resource_pool_->ReleaseResource(resource.Pass()); | 729 resource_pool_->ReleaseResource(resource.Pass()); |
707 managed_tile_state.resource_is_being_initialized = false; | 730 managed_tile_state.resource_is_being_initialized = false; |
708 DidTileRasterStateChange(tile, IDLE_STATE); | 731 DidTileRasterStateChange(tile, IDLE_STATE); |
709 } | 732 } |
| 733 } |
710 | 734 |
| 735 void TileManager::OnRasterTaskCompleted( |
| 736 scoped_refptr<Tile> tile, |
| 737 scoped_ptr<ResourcePool::Resource> resource, |
| 738 int manage_tiles_call_count_when_dispatched) { |
| 739 OnRasterCompleted(tile, resource.Pass(), |
| 740 manage_tiles_call_count_when_dispatched); |
711 DispatchMoreTasks(); | 741 DispatchMoreTasks(); |
712 } | 742 } |
713 | 743 |
714 void TileManager::DidFinishTileInitialization(Tile* tile) { | 744 void TileManager::DidFinishTileInitialization(Tile* tile) { |
715 ManagedTileState& managed_tile_state = tile->managed_state(); | 745 ManagedTileState& managed_tile_state = tile->managed_state(); |
716 DCHECK(managed_tile_state.resource); | 746 DCHECK(managed_tile_state.resource); |
717 managed_tile_state.resource_is_being_initialized = false; | 747 managed_tile_state.resource_is_being_initialized = false; |
718 managed_tile_state.can_be_freed = true; | 748 managed_tile_state.can_be_freed = true; |
719 } | 749 } |
720 | 750 |
(...skipping 22 matching lines...) Expand all Loading... |
743 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]]; | 773 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]]; |
744 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0); | 774 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0); |
745 | 775 |
746 // Increment count for new bin. | 776 // Increment count for new bin. |
747 ++raster_state_count_[mts.raster_state][tree][bin]; | 777 ++raster_state_count_[mts.raster_state][tree][bin]; |
748 | 778 |
749 mts.tree_bin[tree] = bin; | 779 mts.tree_bin[tree] = bin; |
750 } | 780 } |
751 | 781 |
752 // static | 782 // static |
753 void TileManager::RunRasterTask(uint8* buffer, | 783 void TileManager::PerformRaster(uint8* buffer, |
754 const gfx::Rect& rect, | 784 const gfx::Rect& rect, |
755 float contents_scale, | 785 float contents_scale, |
| 786 bool use_cheapness_estimator, |
756 PicturePileImpl* picture_pile, | 787 PicturePileImpl* picture_pile, |
757 RenderingStats* stats) { | 788 RenderingStats* stats) { |
758 TRACE_EVENT0("cc", "TileManager::RunRasterTask"); | 789 TRACE_EVENT0("cc", "TileManager::PerformRaster"); |
759 DCHECK(picture_pile); | 790 DCHECK(picture_pile); |
760 DCHECK(buffer); | 791 DCHECK(buffer); |
761 SkBitmap bitmap; | 792 SkBitmap bitmap; |
762 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); | 793 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); |
763 bitmap.setPixels(buffer); | 794 bitmap.setPixels(buffer); |
764 SkDevice device(bitmap); | 795 SkDevice device(bitmap); |
765 SkCanvas canvas(&device); | 796 SkCanvas canvas(&device); |
766 | 797 |
767 base::TimeTicks begin_time; | 798 base::TimeTicks begin_time; |
768 if (stats) | 799 if (stats) |
769 begin_time = base::TimeTicks::Now(); | 800 begin_time = base::TimeTicks::Now(); |
770 | 801 |
771 picture_pile->Raster(&canvas, rect, contents_scale, stats); | 802 picture_pile->Raster(&canvas, rect, contents_scale, stats); |
772 | 803 |
773 if (stats) { | 804 if (stats) { |
774 base::TimeTicks end_time = base::TimeTicks::Now(); | 805 base::TimeTicks end_time = base::TimeTicks::Now(); |
775 base::TimeDelta duration = end_time - begin_time; | 806 base::TimeDelta duration = end_time - begin_time; |
776 stats->totalRasterizeTime += duration; | 807 stats->totalRasterizeTime += duration; |
777 UMA_HISTOGRAM_CUSTOM_COUNTS( | 808 UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.PictureRasterTimeMS", |
778 "Renderer4.PictureRasterTimeMS", | 809 duration.InMilliseconds(), |
779 duration.InMilliseconds(), | 810 0, |
780 0, 10, 10 | 811 10, |
781 ); | 812 10); |
| 813 |
| 814 if (use_cheapness_estimator) { |
| 815 bool is_predicted_cheap = picture_pile->IsCheapInRect (rect, contents_scal
e); |
| 816 bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f; |
| 817 RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap); |
| 818 } |
782 } | 819 } |
783 } | 820 } |
784 | 821 |
785 // static | 822 // static |
| 823 void TileManager::RecordCheapnessPredictorResults(bool is_predicted_cheap, |
| 824 bool is_actually_cheap) { |
| 825 if (is_predicted_cheap && !is_actually_cheap) |
| 826 UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorBadlyWrong", true); |
| 827 else if (!is_predicted_cheap && is_actually_cheap) |
| 828 UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorSafelyWrong", true); |
| 829 |
| 830 UMA_HISTOGRAM_BOOLEAN("Renderer4.CheapPredictorAccuracy", |
| 831 is_predicted_cheap == is_actually_cheap); |
| 832 } |
| 833 |
| 834 // static |
786 void TileManager::RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, | 835 void TileManager::RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, |
787 RenderingStats* stats) { | 836 RenderingStats* stats) { |
788 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); | 837 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); |
789 base::TimeTicks decode_begin_time; | 838 base::TimeTicks decode_begin_time; |
790 if (stats) | 839 if (stats) |
791 decode_begin_time = base::TimeTicks::Now(); | 840 decode_begin_time = base::TimeTicks::Now(); |
792 pixel_ref->Decode(); | 841 pixel_ref->Decode(); |
793 if (stats) { | 842 if (stats) { |
794 stats->totalDeferredImageDecodeCount++; | 843 stats->totalDeferredImageDecodeCount++; |
795 stats->totalDeferredImageDecodeTime += | 844 stats->totalDeferredImageDecodeTime += |
796 base::TimeTicks::Now() - decode_begin_time; | 845 base::TimeTicks::Now() - decode_begin_time; |
797 } | 846 } |
798 } | 847 } |
799 | 848 |
800 } // namespace cc | 849 } // namespace cc |
OLD | NEW |