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

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

Issue 69343005: Added preliminary support for tile rasterization with Ganesh (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years 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
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
162 state->SetInteger("completed_count", stats.completed_count); 162 state->SetInteger("completed_count", stats.completed_count);
163 state->SetInteger("canceled_count", stats.canceled_count); 163 state->SetInteger("canceled_count", stats.canceled_count);
164 return state.PassAs<base::Value>(); 164 return state.PassAs<base::Value>();
165 } 165 }
166 166
167 // static 167 // static
168 scoped_ptr<TileManager> TileManager::Create( 168 scoped_ptr<TileManager> TileManager::Create(
169 TileManagerClient* client, 169 TileManagerClient* client,
170 ResourceProvider* resource_provider, 170 ResourceProvider* resource_provider,
171 ContextProvider* context_provider,
171 size_t num_raster_threads, 172 size_t num_raster_threads,
172 RenderingStatsInstrumentation* rendering_stats_instrumentation, 173 RenderingStatsInstrumentation* rendering_stats_instrumentation,
174 bool use_ganesh,
173 bool use_map_image, 175 bool use_map_image,
174 size_t max_transfer_buffer_usage_bytes, 176 size_t max_transfer_buffer_usage_bytes,
175 size_t max_raster_usage_bytes) { 177 size_t max_raster_usage_bytes) {
176 return make_scoped_ptr( 178 return make_scoped_ptr(
177 new TileManager(client, 179 new TileManager(client,
178 resource_provider, 180 resource_provider,
179 use_map_image ? 181 use_map_image ?
180 ImageRasterWorkerPool::Create( 182 ImageRasterWorkerPool::Create(
181 resource_provider, num_raster_threads) : 183 resource_provider, num_raster_threads) :
182 PixelBufferRasterWorkerPool::Create( 184 PixelBufferRasterWorkerPool::Create(
183 resource_provider, 185 resource_provider,
184 num_raster_threads, 186 num_raster_threads,
185 max_transfer_buffer_usage_bytes), 187 max_transfer_buffer_usage_bytes),
188 use_ganesh ?
189 GaneshRasterizer::Create(
enne (OOO) 2013/11/25 23:14:10 It seems like extra complication to have this opti
190 context_provider, resource_provider) :
191 scoped_ptr<GaneshRasterizer>(),
186 num_raster_threads, 192 num_raster_threads,
187 max_raster_usage_bytes, 193 max_raster_usage_bytes,
188 rendering_stats_instrumentation)); 194 rendering_stats_instrumentation));
189 } 195 }
190 196
191 TileManager::TileManager( 197 TileManager::TileManager(
192 TileManagerClient* client, 198 TileManagerClient* client,
193 ResourceProvider* resource_provider, 199 ResourceProvider* resource_provider,
194 scoped_ptr<RasterWorkerPool> raster_worker_pool, 200 scoped_ptr<RasterWorkerPool> raster_worker_pool,
201 scoped_ptr<GaneshRasterizer> ganesh_rasterizer,
195 size_t num_raster_threads, 202 size_t num_raster_threads,
196 size_t max_raster_usage_bytes, 203 size_t max_raster_usage_bytes,
197 RenderingStatsInstrumentation* rendering_stats_instrumentation) 204 RenderingStatsInstrumentation* rendering_stats_instrumentation)
198 : client_(client), 205 : client_(client),
199 resource_pool_(ResourcePool::Create(resource_provider)), 206 resource_pool_(ResourcePool::Create(resource_provider)),
200 raster_worker_pool_(raster_worker_pool.Pass()), 207 raster_worker_pool_(raster_worker_pool.Pass()),
208 ganesh_rasterizer_(ganesh_rasterizer.Pass()),
201 prioritized_tiles_dirty_(false), 209 prioritized_tiles_dirty_(false),
202 all_tiles_that_need_to_be_rasterized_have_memory_(true), 210 all_tiles_that_need_to_be_rasterized_have_memory_(true),
203 all_tiles_required_for_activation_have_memory_(true), 211 all_tiles_required_for_activation_have_memory_(true),
204 memory_required_bytes_(0), 212 memory_required_bytes_(0),
205 memory_nice_to_have_bytes_(0), 213 memory_nice_to_have_bytes_(0),
206 bytes_releasable_(0), 214 bytes_releasable_(0),
207 resources_releasable_(0), 215 resources_releasable_(0),
208 max_raster_usage_bytes_(max_raster_usage_bytes), 216 max_raster_usage_bytes_(max_raster_usage_bytes),
209 ever_exceeded_memory_budget_(false), 217 ever_exceeded_memory_budget_(false),
210 rendering_stats_instrumentation_(rendering_stats_instrumentation), 218 rendering_stats_instrumentation_(rendering_stats_instrumentation),
211 did_initialize_visible_tile_(false), 219 did_initialize_visible_tile_(false),
212 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { 220 did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
213 raster_worker_pool_->SetClient(this); 221 raster_worker_pool_->SetClient(this);
222 if (ganesh_rasterizer_)
223 ganesh_rasterizer_->SetClient(this);
214 } 224 }
215 225
216 TileManager::~TileManager() { 226 TileManager::~TileManager() {
217 // Reset global state and manage. This should cause 227 // Reset global state and manage. This should cause
218 // our memory usage to drop to zero. 228 // our memory usage to drop to zero.
219 global_state_ = GlobalStateThatImpactsTilePriority(); 229 global_state_ = GlobalStateThatImpactsTilePriority();
220 230
221 CleanUpReleasedTiles(); 231 CleanUpReleasedTiles();
222 DCHECK_EQ(0u, tiles_.size()); 232 DCHECK_EQ(0u, tiles_.size());
223 233
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 return requirements.PassAs<base::Value>(); 591 return requirements.PassAs<base::Value>();
582 } 592 }
583 593
584 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const { 594 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const {
585 DCHECK(tile); 595 DCHECK(tile);
586 DCHECK(tile->picture_pile()); 596 DCHECK(tile->picture_pile());
587 597
588 const ManagedTileState& mts = tile->managed_state(); 598 const ManagedTileState& mts = tile->managed_state();
589 RasterMode current_mode = mts.raster_mode; 599 RasterMode current_mode = mts.raster_mode;
590 600
601 // TODO(skaslev): Add proper a heuristic whether a tile
602 // should go for software or GPU rasterizing.
603 if (ganesh_rasterizer_)
604 return GANESH_RASTER_MODE;
591 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE; 605 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE;
592 if (tile->managed_state().resolution == LOW_RESOLUTION) 606 if (tile->managed_state().resolution == LOW_RESOLUTION)
593 raster_mode = LOW_QUALITY_RASTER_MODE; 607 raster_mode = LOW_QUALITY_RASTER_MODE;
594 else if (tile->can_use_lcd_text()) 608 else if (tile->can_use_lcd_text())
595 raster_mode = HIGH_QUALITY_RASTER_MODE; 609 raster_mode = HIGH_QUALITY_RASTER_MODE;
596 else if (mts.tile_versions[current_mode].has_text_ || 610 else if (mts.tile_versions[current_mode].has_text_ ||
597 !mts.tile_versions[current_mode].IsReadyToDraw()) 611 !mts.tile_versions[current_mode].IsReadyToDraw())
598 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; 612 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE;
599 613
600 return std::min(raster_mode, current_mode); 614 return std::min(raster_mode, current_mode);
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 it != tiles_that_need_to_be_rasterized.end(); 817 it != tiles_that_need_to_be_rasterized.end();
804 ++it) { 818 ++it) {
805 Tile* tile = *it; 819 Tile* tile = *it;
806 ManagedTileState& mts = tile->managed_state(); 820 ManagedTileState& mts = tile->managed_state();
807 ManagedTileState::TileVersion& tile_version = 821 ManagedTileState::TileVersion& tile_version =
808 mts.tile_versions[mts.raster_mode]; 822 mts.tile_versions[mts.raster_mode];
809 823
810 DCHECK(tile_version.requires_resource()); 824 DCHECK(tile_version.requires_resource());
811 DCHECK(!tile_version.resource_); 825 DCHECK(!tile_version.resource_);
812 826
813 if (tile_version.raster_task_.is_null()) 827 if (mts.raster_mode == GANESH_RASTER_MODE) {
814 tile_version.raster_task_ = CreateRasterTask(tile); 828 CreateGaneshRasterTask(tile);
829 } else {
830 if (tile_version.raster_task_.is_null())
831 tile_version.raster_task_ = CreateRasterTask(tile);
815 832
816 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 833 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
834 }
817 } 835 }
818 836
819 // We must reduce the amount of unused resoruces before calling 837 // We must reduce the amount of unused resoruces before calling
820 // ScheduleTasks to prevent usage from rising above limits. 838 // ScheduleTasks to prevent usage from rising above limits.
821 resource_pool_->ReduceResourceUsage(); 839 resource_pool_->ReduceResourceUsage();
822 840
823 // Schedule running of |tasks|. This replaces any previously 841 // Schedule running of |tasks|. This replaces any previously
824 // scheduled tasks and effectively cancels all tasks not present 842 // scheduled tasks and effectively cancels all tasks not present
825 // in |tasks|. 843 // in |tasks|.
826 raster_worker_pool_->ScheduleTasks(&tasks); 844 raster_worker_pool_->ScheduleTasks(&tasks);
827 845
828 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 846 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
847
848 if (ganesh_rasterizer_)
849 ganesh_rasterizer_->FlushRasterTasks(rendering_stats_instrumentation_);
vmpstr 2013/11/25 18:11:48 From the perspective of what TileManager current d
reveman 2013/11/25 21:24:10 It might be cleaner to tally up these tiles in a d
829 } 850 }
830 851
831 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 852 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
832 Tile* tile, skia::LazyPixelRef* pixel_ref) { 853 Tile* tile, skia::LazyPixelRef* pixel_ref) {
833 return RasterWorkerPool::CreateImageDecodeTask( 854 return RasterWorkerPool::CreateImageDecodeTask(
834 pixel_ref, 855 pixel_ref,
835 tile->layer_id(), 856 tile->layer_id(),
836 rendering_stats_instrumentation_, 857 rendering_stats_instrumentation_,
837 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 858 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
838 base::Unretained(this), 859 base::Unretained(this),
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
885 tile->source_frame_number(), 906 tile->source_frame_number(),
886 rendering_stats_instrumentation_, 907 rendering_stats_instrumentation_,
887 base::Bind(&TileManager::OnRasterTaskCompleted, 908 base::Bind(&TileManager::OnRasterTaskCompleted,
888 base::Unretained(this), 909 base::Unretained(this),
889 tile->id(), 910 tile->id(),
890 base::Passed(&resource), 911 base::Passed(&resource),
891 mts.raster_mode), 912 mts.raster_mode),
892 &decode_tasks); 913 &decode_tasks);
893 } 914 }
894 915
916 void TileManager::CreateGaneshRasterTask(Tile* tile) {
917 DCHECK(ganesh_rasterizer_);
918
919 scoped_ptr<ResourcePool::Resource> resource =
920 resource_pool_->AcquireResource(tile->tile_size_.size(),
921 ganesh_rasterizer_->GetResourceFormat());
922 ganesh_rasterizer_->PushRasterTask(tile, resource.Pass());
923 }
924
895 void TileManager::OnImageDecodeTaskCompleted( 925 void TileManager::OnImageDecodeTaskCompleted(
896 int layer_id, 926 int layer_id,
897 skia::LazyPixelRef* pixel_ref, 927 skia::LazyPixelRef* pixel_ref,
898 bool was_canceled) { 928 bool was_canceled) {
899 // If the task was canceled, we need to clean it up 929 // If the task was canceled, we need to clean it up
900 // from |image_decode_tasks_|. 930 // from |image_decode_tasks_|.
901 if (!was_canceled) 931 if (!was_canceled)
902 return; 932 return;
903 933
904 LayerPixelRefTaskMap::iterator layer_it = 934 LayerPixelRefTaskMap::iterator layer_it =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
953 983
954 bytes_releasable_ += BytesConsumedIfAllocated(tile); 984 bytes_releasable_ += BytesConsumedIfAllocated(tile);
955 ++resources_releasable_; 985 ++resources_releasable_;
956 } 986 }
957 987
958 FreeUnusedResourcesForTile(tile); 988 FreeUnusedResourcesForTile(tile);
959 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 989 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
960 did_initialize_visible_tile_ = true; 990 did_initialize_visible_tile_ = true;
961 } 991 }
962 992
993 void TileManager::OnGaneshRasterTaskCompleted(
994 Tile* tile,
995 scoped_ptr<ResourcePool::Resource> resource,
996 bool was_canceled) {
997 ManagedTileState& mts = tile->managed_state();
998 ManagedTileState::TileVersion& tile_version =
999 mts.tile_versions[GANESH_RASTER_MODE];
1000 DCHECK(tile_version.raster_task_.is_null());
1001
1002 if (was_canceled) {
1003 ++update_visible_tiles_stats_.canceled_count;
1004 resource_pool_->ReleaseResource(resource.Pass());
1005 return;
1006 }
1007
1008 ++update_visible_tiles_stats_.completed_count;
1009
1010 tile_version.set_use_resource();
1011 tile_version.resource_ = resource.Pass();
1012
1013 bytes_releasable_ += BytesConsumedIfAllocated(tile);
1014 ++resources_releasable_;
1015
1016 FreeUnusedResourcesForTile(tile);
1017 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
1018 did_initialize_visible_tile_ = true;
1019 }
1020
963 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, 1021 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
964 gfx::Size tile_size, 1022 gfx::Size tile_size,
965 gfx::Rect content_rect, 1023 gfx::Rect content_rect,
966 gfx::Rect opaque_rect, 1024 gfx::Rect opaque_rect,
967 float contents_scale, 1025 float contents_scale,
968 int layer_id, 1026 int layer_id,
969 int source_frame_number, 1027 int source_frame_number,
970 bool can_use_lcd_text) { 1028 bool can_use_lcd_text) {
971 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, 1029 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
972 picture_pile, 1030 picture_pile,
973 tile_size, 1031 tile_size,
974 content_rect, 1032 content_rect,
975 opaque_rect, 1033 opaque_rect,
976 contents_scale, 1034 contents_scale,
977 layer_id, 1035 layer_id,
978 source_frame_number, 1036 source_frame_number,
979 can_use_lcd_text)); 1037 can_use_lcd_text));
980 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 1038 DCHECK(tiles_.find(tile->id()) == tiles_.end());
981 1039
982 tiles_[tile->id()] = tile; 1040 tiles_[tile->id()] = tile;
983 used_layer_counts_[tile->layer_id()]++; 1041 used_layer_counts_[tile->layer_id()]++;
984 prioritized_tiles_dirty_ = true; 1042 prioritized_tiles_dirty_ = true;
985 return tile; 1043 return tile;
986 } 1044 }
987 1045
988 } // namespace cc 1046 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698