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

Side by Side Diff: cc/tile_manager.cc

Issue 12194015: cc: Rasterize cheap tiles immediately (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: David's comments. Created 7 years, 10 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 | Annotate | Revision Log
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/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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 bool use_cheapness_estimator) 187 bool use_cheapness_estimator)
188 : client_(client), 188 : client_(client),
189 resource_pool_(ResourcePool::Create(resource_provider)), 189 resource_pool_(ResourcePool::Create(resource_provider)),
190 raster_worker_pool_(RasterWorkerPool::Create(this, num_raster_threads)), 190 raster_worker_pool_(RasterWorkerPool::Create(this, num_raster_threads)),
191 manage_tiles_pending_(false), 191 manage_tiles_pending_(false),
192 manage_tiles_call_count_(0), 192 manage_tiles_call_count_(0),
193 bytes_pending_set_pixels_(0), 193 bytes_pending_set_pixels_(0),
194 has_performed_uploads_since_last_flush_(false), 194 has_performed_uploads_since_last_flush_(false),
195 ever_exceeded_memory_budget_(false), 195 ever_exceeded_memory_budget_(false),
196 record_rendering_stats_(false), 196 record_rendering_stats_(false),
197 use_cheapness_estimator_(use_cheapness_estimator) { 197 use_cheapness_estimator_(use_cheapness_estimator),
198 allow_cheap_tasks_(true),
199 did_schedule_cheap_tasks_(false) {
198 for (int i = 0; i < NUM_STATES; ++i) { 200 for (int i = 0; i < NUM_STATES; ++i) {
199 for (int j = 0; j < NUM_TREES; ++j) { 201 for (int j = 0; j < NUM_TREES; ++j) {
200 for (int k = 0; k < NUM_BINS; ++k) 202 for (int k = 0; k < NUM_BINS; ++k)
201 raster_state_count_[i][j][k] = 0; 203 raster_state_count_[i][j][k] = 0;
202 } 204 }
203 } 205 }
204 } 206 }
205 207
206 TileManager::~TileManager() { 208 TileManager::~TileManager() {
207 // Reset global state and manage. This should cause 209 // Reset global state and manage. This should cause
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 managed_tile_state.can_be_freed = true; 449 managed_tile_state.can_be_freed = true;
448 managed_tile_state.can_use_gpu_memory = false; 450 managed_tile_state.can_use_gpu_memory = false;
449 FreeResourcesForTile(tile); 451 FreeResourcesForTile(tile);
450 452
451 bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated(); 453 bytes_pending_set_pixels_ -= tile->bytes_consumed_if_allocated();
452 DidTileRasterStateChange(tile, IDLE_STATE); 454 DidTileRasterStateChange(tile, IDLE_STATE);
453 tiles_with_pending_set_pixels_.pop(); 455 tiles_with_pending_set_pixels_.pop();
454 } 456 }
455 } 457 }
456 458
459 void TileManager::DidCompleteFrame() {
460 allow_cheap_tasks_ = true;
461 did_schedule_cheap_tasks_ = false;
462 }
463
457 void TileManager::GetMemoryStats( 464 void TileManager::GetMemoryStats(
458 size_t* memoryRequiredBytes, 465 size_t* memoryRequiredBytes,
459 size_t* memoryNiceToHaveBytes, 466 size_t* memoryNiceToHaveBytes,
460 size_t* memoryUsedBytes) const { 467 size_t* memoryUsedBytes) const {
461 *memoryRequiredBytes = 0; 468 *memoryRequiredBytes = 0;
462 *memoryNiceToHaveBytes = 0; 469 *memoryNiceToHaveBytes = 0;
463 *memoryUsedBytes = 0; 470 *memoryUsedBytes = 0;
464 for (size_t i = 0; i < live_or_allocated_tiles_.size(); i++) { 471 for (size_t i = 0; i < live_or_allocated_tiles_.size(); i++) {
465 const Tile* tile = live_or_allocated_tiles_[i]; 472 const Tile* tile = live_or_allocated_tiles_[i];
466 const ManagedTileState& mts = tile->managed_state(); 473 const ManagedTileState& mts = tile->managed_state();
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 tiles_that_need_to_be_rasterized_.end()); 651 tiles_that_need_to_be_rasterized_.end());
645 } 652 }
646 653
647 void TileManager::FreeResourcesForTile(Tile* tile) { 654 void TileManager::FreeResourcesForTile(Tile* tile) {
648 ManagedTileState& managed_tile_state = tile->managed_state(); 655 ManagedTileState& managed_tile_state = tile->managed_state();
649 DCHECK(managed_tile_state.can_be_freed); 656 DCHECK(managed_tile_state.can_be_freed);
650 if (managed_tile_state.resource) 657 if (managed_tile_state.resource)
651 resource_pool_->ReleaseResource(managed_tile_state.resource.Pass()); 658 resource_pool_->ReleaseResource(managed_tile_state.resource.Pass());
652 } 659 }
653 660
654 bool TileManager::CanDispatchRasterTask(Tile* tile) { 661 bool TileManager::CanDispatchRasterTask(Tile* tile) const {
655 if (raster_worker_pool_->IsBusy()) 662 if (raster_worker_pool_->IsBusy())
656 return false; 663 return false;
657 size_t new_bytes_pending = bytes_pending_set_pixels_; 664 size_t new_bytes_pending = bytes_pending_set_pixels_;
658 new_bytes_pending += tile->bytes_consumed_if_allocated(); 665 new_bytes_pending += tile->bytes_consumed_if_allocated();
659 return new_bytes_pending <= kMaxPendingUploadBytes && 666 return new_bytes_pending <= kMaxPendingUploadBytes &&
660 tiles_with_pending_set_pixels_.size() < kMaxPendingUploads; 667 tiles_with_pending_set_pixels_.size() < kMaxPendingUploads;
661 } 668 }
662 669
663 void TileManager::DispatchMoreTasks() { 670 void TileManager::DispatchMoreTasks() {
671 if (did_schedule_cheap_tasks_)
672 allow_cheap_tasks_ = false;
673
664 // Because tiles in the image decoding list have higher priorities, we 674 // Because tiles in the image decoding list have higher priorities, we
665 // need to process those tiles first before we start to handle the tiles 675 // need to process those tiles first before we start to handle the tiles
666 // in the need_to_be_rasterized queue. 676 // in the need_to_be_rasterized queue.
667 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin(); 677 for(TileList::iterator it = tiles_with_image_decoding_tasks_.begin();
668 it != tiles_with_image_decoding_tasks_.end(); ) { 678 it != tiles_with_image_decoding_tasks_.end(); ) {
669 DispatchImageDecodeTasksForTile(*it); 679 DispatchImageDecodeTasksForTile(*it);
670 ManagedTileState& managed_state = (*it)->managed_state(); 680 ManagedTileState& managed_state = (*it)->managed_state();
671 if (managed_state.pending_pixel_refs.empty()) { 681 if (managed_state.pending_pixel_refs.empty()) {
672 if (!CanDispatchRasterTask(*it)) 682 if (!CanDispatchRasterTask(*it))
673 return; 683 return;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 797
788 DidTileRasterStateChange(tile, RASTER_STATE); 798 DidTileRasterStateChange(tile, RASTER_STATE);
789 return resource.Pass(); 799 return resource.Pass();
790 } 800 }
791 801
792 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) { 802 void TileManager::DispatchOneRasterTask(scoped_refptr<Tile> tile) {
793 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask"); 803 TRACE_EVENT0("cc", "TileManager::DispatchOneRasterTask");
794 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile); 804 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile);
795 ResourceProvider::ResourceId resource_id = resource->id(); 805 ResourceProvider::ResourceId resource_id = resource->id();
796 806
807 bool is_cheap = use_cheapness_estimator_ && allow_cheap_tasks_ &&
808 tile->picture_pile()->IsCheapInRect(tile->content_rect_,
809 tile->contents_scale());
797 raster_worker_pool_->PostRasterTaskAndReply( 810 raster_worker_pool_->PostRasterTaskAndReply(
798 tile->picture_pile(), 811 tile->picture_pile(),
799 base::Bind(&TileManager::PerformRaster, 812 is_cheap,
813 base::Bind(&TileManager::RunRasterTask,
800 resource_pool_->resource_provider()->mapPixelBuffer( 814 resource_pool_->resource_provider()->mapPixelBuffer(
801 resource_id), 815 resource_id),
802 tile->content_rect_, 816 tile->content_rect_,
803 tile->contents_scale(), 817 tile->contents_scale(),
804 use_cheapness_estimator_, 818 use_cheapness_estimator_,
805 GetRasterTaskMetadata(tile->managed_state())), 819 GetRasterTaskMetadata(tile->managed_state())),
806 base::Bind(&TileManager::OnRasterTaskCompleted, 820 base::Bind(&TileManager::OnRasterTaskCompleted,
807 base::Unretained(this), 821 base::Unretained(this),
808 tile, 822 tile,
809 base::Passed(&resource), 823 base::Passed(&resource),
810 manage_tiles_call_count_)); 824 manage_tiles_call_count_));
825 did_schedule_cheap_tasks_ |= is_cheap;
811 } 826 }
812 827
813 void TileManager::PerformOneRaster(Tile* tile) { 828 void TileManager::OnRasterTaskCompleted(
814 scoped_ptr<ResourcePool::Resource> resource = PrepareTileForRaster(tile);
815 ResourceProvider::ResourceId resource_id = resource->id();
816
817 PerformRaster(resource_pool_->resource_provider()->mapPixelBuffer(
818 resource_id),
819 tile->content_rect_,
820 tile->contents_scale(),
821 use_cheapness_estimator_,
822 GetRasterTaskMetadata(tile->managed_state()),
823 tile->picture_pile(),
824 &rendering_stats_);
825
826 OnRasterCompleted(tile, resource.Pass(), manage_tiles_call_count_);
827 }
828
829 void TileManager::OnRasterCompleted(
830 scoped_refptr<Tile> tile, 829 scoped_refptr<Tile> tile,
831 scoped_ptr<ResourcePool::Resource> resource, 830 scoped_ptr<ResourcePool::Resource> resource,
832 int manage_tiles_call_count_when_dispatched) { 831 int manage_tiles_call_count_when_dispatched) {
833 TRACE_EVENT0("cc", "TileManager::OnRasterCompleted"); 832 TRACE_EVENT0("cc", "TileManager::OnRasterTaskCompleted");
834 833
835 // Release raster resources. 834 // Release raster resources.
836 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id()); 835 resource_pool_->resource_provider()->unmapPixelBuffer(resource->id());
837 836
838 ManagedTileState& managed_tile_state = tile->managed_state(); 837 ManagedTileState& managed_tile_state = tile->managed_state();
839 managed_tile_state.can_be_freed = true; 838 managed_tile_state.can_be_freed = true;
840 839
841 // Tile can be freed after the completion of the raster task. Call 840 // Tile can be freed after the completion of the raster task. Call
842 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority 841 // AssignGpuMemoryToTiles() to re-assign gpu memory to highest priority
843 // tiles if ManageTiles() was called since task was dispatched. The result 842 // tiles if ManageTiles() was called since task was dispatched. The result
(...skipping 23 matching lines...) Expand all
867 DidTileRasterStateChange(tile, SET_PIXELS_STATE); 866 DidTileRasterStateChange(tile, SET_PIXELS_STATE);
868 tiles_with_pending_set_pixels_.push(tile); 867 tiles_with_pending_set_pixels_.push(tile);
869 } else { 868 } else {
870 resource_pool_->resource_provider()->releasePixelBuffer(resource->id()); 869 resource_pool_->resource_provider()->releasePixelBuffer(resource->id());
871 resource_pool_->ReleaseResource(resource.Pass()); 870 resource_pool_->ReleaseResource(resource.Pass());
872 managed_tile_state.resource_is_being_initialized = false; 871 managed_tile_state.resource_is_being_initialized = false;
873 DidTileRasterStateChange(tile, IDLE_STATE); 872 DidTileRasterStateChange(tile, IDLE_STATE);
874 } 873 }
875 } 874 }
876 875
877 void TileManager::OnRasterTaskCompleted(
878 scoped_refptr<Tile> tile,
879 scoped_ptr<ResourcePool::Resource> resource,
880 int manage_tiles_call_count_when_dispatched) {
881 OnRasterCompleted(tile, resource.Pass(),
882 manage_tiles_call_count_when_dispatched);
883 }
884
885 void TileManager::DidFinishTileInitialization(Tile* tile) { 876 void TileManager::DidFinishTileInitialization(Tile* tile) {
886 ManagedTileState& managed_tile_state = tile->managed_state(); 877 ManagedTileState& managed_tile_state = tile->managed_state();
887 DCHECK(managed_tile_state.resource); 878 DCHECK(managed_tile_state.resource);
888 managed_tile_state.resource_is_being_initialized = false; 879 managed_tile_state.resource_is_being_initialized = false;
889 managed_tile_state.can_be_freed = true; 880 managed_tile_state.can_be_freed = true;
890 } 881 }
891 882
892 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) { 883 void TileManager::DidTileRasterStateChange(Tile* tile, TileRasterState state) {
893 ManagedTileState& mts = tile->managed_state(); 884 ManagedTileState& mts = tile->managed_state();
894 DCHECK_LT(state, NUM_STATES); 885 DCHECK_LT(state, NUM_STATES);
(...skipping 19 matching lines...) Expand all
914 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]]; 905 --raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]];
915 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0); 906 DCHECK_GE(raster_state_count_[mts.raster_state][tree][mts.tree_bin[tree]], 0);
916 907
917 // Increment count for new bin. 908 // Increment count for new bin.
918 ++raster_state_count_[mts.raster_state][tree][new_tree_bin]; 909 ++raster_state_count_[mts.raster_state][tree][new_tree_bin];
919 910
920 mts.tree_bin[tree] = new_tree_bin; 911 mts.tree_bin[tree] = new_tree_bin;
921 } 912 }
922 913
923 // static 914 // static
924 void TileManager::PerformRaster(uint8* buffer, 915 void TileManager::RunRasterTask(uint8* buffer,
925 const gfx::Rect& rect, 916 const gfx::Rect& rect,
926 float contents_scale, 917 float contents_scale,
927 bool use_cheapness_estimator, 918 bool use_cheapness_estimator,
928 const RasterTaskMetadata& raster_task_metadata, 919 const RasterTaskMetadata& raster_task_metadata,
929 PicturePileImpl* picture_pile, 920 PicturePileImpl* picture_pile,
930 RenderingStats* stats) { 921 RenderingStats* stats) {
931 TRACE_EVENT2( 922 TRACE_EVENT2(
932 "cc", "TileManager::PerformRaster", 923 "cc", "TileManager::RunRasterTask",
933 "is_on_pending_tree", 924 "is_on_pending_tree",
934 raster_task_metadata.is_tile_in_pending_tree_now_bin, 925 raster_task_metadata.is_tile_in_pending_tree_now_bin,
935 "is_low_res", 926 "is_low_res",
936 raster_task_metadata.tile_resolution == LOW_RESOLUTION); 927 raster_task_metadata.tile_resolution == LOW_RESOLUTION);
937 928
938 DCHECK(picture_pile); 929 DCHECK(picture_pile);
939 DCHECK(buffer); 930 DCHECK(buffer);
940 SkBitmap bitmap; 931 SkBitmap bitmap;
941 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height()); 932 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height());
942 bitmap.setPixels(buffer); 933 bitmap.setPixels(buffer);
(...skipping 17 matching lines...) Expand all
960 if (raster_task_metadata.is_tile_in_pending_tree_now_bin) 951 if (raster_task_metadata.is_tile_in_pending_tree_now_bin)
961 stats->totalRasterizeTimeForNowBinsOnPendingTree += duration; 952 stats->totalRasterizeTimeForNowBinsOnPendingTree += duration;
962 953
963 UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.PictureRasterTimeMS", 954 UMA_HISTOGRAM_CUSTOM_COUNTS("Renderer4.PictureRasterTimeMS",
964 duration.InMilliseconds(), 955 duration.InMilliseconds(),
965 0, 956 0,
966 10, 957 10,
967 10); 958 10);
968 959
969 if (use_cheapness_estimator) { 960 if (use_cheapness_estimator) {
970 bool is_predicted_cheap = picture_pile->IsCheapInRect (rect, contents_scal e); 961 bool is_predicted_cheap =
962 picture_pile->IsCheapInRect(rect, contents_scale);
971 bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f; 963 bool is_actually_cheap = duration.InMillisecondsF() <= 1.0f;
972 RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap); 964 RecordCheapnessPredictorResults(is_predicted_cheap, is_actually_cheap);
973 } 965 }
974 } 966 }
975 } 967 }
976 968
977 // static 969 // static
978 void TileManager::RecordCheapnessPredictorResults(bool is_predicted_cheap, 970 void TileManager::RecordCheapnessPredictorResults(bool is_predicted_cheap,
979 bool is_actually_cheap) { 971 bool is_actually_cheap) {
980 if (is_predicted_cheap && !is_actually_cheap) 972 if (is_predicted_cheap && !is_actually_cheap)
(...skipping 14 matching lines...) Expand all
995 decode_begin_time = base::TimeTicks::HighResNow(); 987 decode_begin_time = base::TimeTicks::HighResNow();
996 pixel_ref->Decode(); 988 pixel_ref->Decode();
997 if (stats) { 989 if (stats) {
998 stats->totalDeferredImageDecodeCount++; 990 stats->totalDeferredImageDecodeCount++;
999 stats->totalDeferredImageDecodeTime += 991 stats->totalDeferredImageDecodeTime +=
1000 base::TimeTicks::HighResNow() - decode_begin_time; 992 base::TimeTicks::HighResNow() - decode_begin_time;
1001 } 993 }
1002 } 994 }
1003 995
1004 } // namespace cc 996 } // namespace cc
OLDNEW
« no previous file with comments | « cc/tile_manager.h ('k') | cc/worker_pool.h » ('j') | cc/worker_pool.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698