| 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 |